Linux中操作sqlite3、sqlite3数据c/c++接口编程与Windows和Linux中sqlite3库的制作(SQLite二)

目录

  • 一、linux操作sqlite3
    • 1. 可以像window下通过qtcreator编译
    • 2. 可以用gcc直接编译
      • (1) 要安装libreadline-dev
      • (2)在工程文件中添加
      • (3)打开shell.c 在最前面添加一行代码
    • 3.直接用Ubuntu命令安装sudo apt install sqlite3
  • 二、sqlite3数据c/c++接口编程

一、linux操作sqlite3

1. 可以像window下通过qtcreator编译

编译好后可以在linux终端直接运行
Linux中操作sqlite3、sqlite3数据c/c++接口编程与Windows和Linux中sqlite3库的制作(SQLite二)_第1张图片

2. 可以用gcc直接编译

gcc -o sqlite3-line shell.c sqlite3.c -lpthread -ldl -lreadline

Linux中操作sqlite3、sqlite3数据c/c++接口编程与Windows和Linux中sqlite3库的制作(SQLite二)_第2张图片

(1) 要安装libreadline-dev

sudo apt install libreadline-dev

(2)在工程文件中添加

LIBS += -lpthread  -ldl  -lreadline

(3)打开shell.c 在最前面添加一行代码

#define HAVE_READLINE 1

在linux使用sqlite3命令可以使用方向键操作(可以用sudo apt install sqlite3安装)

3.直接用Ubuntu命令安装sudo apt install sqlite3

二、sqlite3数据c/c++接口编程

1.打开数据库文件

int sqlite3_open(const char *filename, sqlite3 **ppDb);
返回值:int --- 成功SQLITE_OK
参数:filename --- 数据库文件路径
     ppDb --- 打开数据库得到的数据库句柄

2.操作数据(执行sql语句)

int sqlite3_exec(sqlite3*,const char *sql,sqlite_callback,void *,char **errmsg);
返回值:int --- 成功SQLITE_OK

参数:sqlite3* --- 数据库句柄
     sql --- 要执行的sql语句
     sqlite_callback --- 回调函数
     void * --- 给回调函数的参数
     errmsg --- 存储错误->要自己通过sqlite3_free(errmsg);

回调函数->用于数据库查询

int (*sqlite3_callback)(void*, int, char**, char**);
int LoadMyInfo( void * para, int n_column, char ** column_value, char ** column_name )

3.关闭数据库文件

int sqlite3_close(sqlite3*);
返回值:int --- 成功SQLITE_OK

参数:sqlite3* --- 数据库句柄

例:

#include 
#include "sqlite3.h"
int main()
{
    //1.打开数据库
    sqlite3 *ppdb = NULL;
    int ret = sqlite3_open("myapi.db", &ppdb);
    if(ret != SQLITE_OK)
    {
        perror("open fail");
        return -1;
    }
    //2.执行sql语句
    //创建表格 create table apitest (id int, name text);
    //插入数据 insert into apitest values(0,'aaa');
    const char *create_sql = "create table apitest (id int, name text)";
    char *errmsg = NULL;
    ret = sqlite3_exec(ppdb, create_sql, NULL, NULL,&errmsg);
    if(ret != SQLITE_OK)
    {
        printf("%s\n",errmsg);
    }
    sqlite3_free(errmsg);

    const char* insert_sql = "insert into apitest values(0,'aaa');";
    ret = sqlite3_exec(ppdb, insert_sql, NULL, NULL,&errmsg);
    if(ret != SQLITE_OK)
    {
        printf("%s\n",errmsg);
    }
    sqlite3_free(errmsg);

    //3.关闭数据库
    ret = sqlite3_close(ppdb);
    return 0;
}

回调函数查询操作

    //查询
    const char *select_sql = "select * from apitest;";
    ret = sqlite3_exec(ppdb, select_sql, callback, NULL, &errmsg);
    if(ret != SQLITE_OK)
    {
        printf("查询--%s\n",errmsg);
    }
    sqlite3_free(errmsg);


//回调函数是根据查询的数据---有多少行就被调用多少次,返回0继续查询直到全部查询完,如果是非0就终止查询
int callback(void *arg, int col, char **values, char **names)
{
    printf("回调--%d\n",col);
    return 0;
}

非回调函数查询

int sqlite3_get_table(sqlite3*,const char *sql,char ***resultp,int *nrow,int *ncolumn,char **errmsg);
返回值:SQLITE_OK --- 成功

参数:sqlite3* --- 数据库句柄
     sql  --- sql查询语句
     resultp  --- 查询的到的数据表
     nrow  --- 查到数据表的行
     ncolumn --- 查到的数据表的列
     errmsg --- 存储错误

例:

//非回调查询数据
char **resultp = NULL;
int row,col;
ret = sqlite3_get_table(ppdb,"select * from test",&resultp,&row,&col,&errmsg);
printf("%d:%d\n",row,col);

for(int i=0;i<(row+1)*col;i++)
{
    printf("%s\t",resultp[i]);
    if((i+1)%2==0)
    printf("\n");
}
sqlite3_free_table(resultp);//释放表格空间
sqlite3_free(errmsg);

4.sqlite3的数据绑定机制(录入的数据量大的时候)

(1)准备

int sqlite3_prepare(
  sqlite3 *db,            /* Database handle */
  const char *zSql,       /* SQL statement, UTF-8 encoded */
  int nByte,              /* Maximum length of zSql in bytes. */
  sqlite3_stmt **ppStmt,  /* OUT: Statement handle */
  const char **pzTail     /* OUT: Pointer to unused portion of zSql */
);

(2)绑定数据

int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
int sqlite3_bind_blob64(sqlite3_stmt*, int, const void*, sqlite3_uint64,void(*)(void*));
int sqlite3_bind_double(sqlite3_stmt*, int, double);
int sqlite3_bind_int(sqlite3_stmt*, int, int);
int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64);
int sqlite3_bind_null(sqlite3_stmt*, int);
int sqlite3_bind_text(sqlite3_stmt*,int,const char*,int,void(*)(void*));
int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*));
int sqlite3_bind_text64(sqlite3_stmt*, int, const char*, sqlite3_uint64,void(*)(void*), unsigned char encoding);
int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);
int sqlite3_bind_pointer(sqlite3_stmt*, int, void*, const char*,void(*)(void*));
int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n);
int sqlite3_bind_zeroblob64(sqlite3_stmt*, int, sqlite3_uint64);

(3)执行

int sqlite3_step(sqlite3_stmt*);

(4)如果循环插入数据(循环绑定)

int sqlite3_reset(sqlite3_stmt *pStmt);

(5)释放

int sqlite3_finalize(sqlite3_stmt *pStmt);

例:

//1.创建sqlite3_stmt
sqlite3_stmt  *stmt = NULL;
char insert[] = "insert into test values(?,?)";
sqlite3_prepare(ppdb, insert, sizeof(insert),&stmt, NULL);
//2.绑定数据
for(int i=0; i<100000; i++)
{
    sqlite3_bind_int(stmt,1,i);
    sqlite3_bind_int(stmt,2,i*100);
    sqlite3_step(stmt);//执行插入
    sqlite3_reset(stmt);//重置
}
//3.释放
sqlite3_finalize(stmt);

5.sqlite3的事务机制(提高数据的操作效率-insert, update, delete)

自动提交事务创建表格create,删除表格drop

事务 语法
开始事务 begin
提交 commit
回滚 rollback

事务回滚

begin;  //开始事务
update device set status=100; //修改数据
rollback;  //回滚到begin前位置

事务提交

begin; //开始事务
update device set status=123;//修改数据
commit;//提交事务
rollback;
Error: cannot rollback - no transaction is active

如果没有begin开始, 直接执行sql语句是自动提交事务

只用begin开始事务,后执行(insert, delete, update)事务需要通过commit提交

开始事务

sqlite3_exec(ppdb, "begin",NULL,NULL,NULL);
执行sql语句 可以通过sqlite3_exec, 绑定机制插入数据

提交事务

sqlite3_exec(ppdb, "commit",NULL,NULL,NULL);

回滚

sqlite3_exec(ppdb, "rollback",NULL,NULL,NULL);

三、sqlite3库制作(window–linux)

1.制作

用qt creator创建一个lib项目,将除工程文件之外的所有文件删除,导入sqlite3.c和sqlite3.h文件,编译运行,将弹出的狂口关掉后可在运行文件夹中找到.a文件,即为制作好的库

2.使用

使用时,将生成的.a 文件和sqlite3.h添加到项目中

在工程文件中加入

LIBS += .a文件路径//Windows中

LIBS += -L/文件路径/ -l .a文件名 -lpthread -ldl//Linux中

你可能感兴趣的:(数据库,qt,sqlite,linux,c语言,qt)