gcc -o sqlite3-line shell.c sqlite3.c -lpthread -ldl -lreadline
sudo apt install libreadline-dev
LIBS += -lpthread -ldl -lreadline
#define HAVE_READLINE 1
在linux使用sqlite3命令可以使用方向键操作(可以用sudo apt install sqlite3安装)
int sqlite3_open(const char *filename, sqlite3 **ppDb);
返回值:int --- 成功SQLITE_OK
参数:filename --- 数据库文件路径
ppDb --- 打开数据库得到的数据库句柄
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 )
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);
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 */
);
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);
int sqlite3_step(sqlite3_stmt*);
int sqlite3_reset(sqlite3_stmt *pStmt);
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);
自动提交事务创建表格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);
用qt creator创建一个lib项目,将除工程文件之外的所有文件删除,导入sqlite3.c和sqlite3.h文件,编译运行,将弹出的狂口关掉后可在运行文件夹中找到.a文件,即为制作好的库
使用时,将生成的.a 文件和sqlite3.h添加到项目中
在工程文件中加入
LIBS += .a文件路径//Windows中
LIBS += -L/文件路径/ -l .a文件名 -lpthread -ldl//Linux中