1环境
win10 + Qt 5.9 + sqlite 3
2Qt工程配置
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
SOURCES += main.c
INCLUDEPATH += $$_PRO_FILE_PWD_/sqlite3
LIBS += -L $$_PRO_FILE_PWD_/sqlite3 -lsqlite3
3sqlite3接口介绍
3.1 int sqlite3_open
函数声明 int sqlite3_open(
const char *filename,
sqlite3 **ppDb
);
所在文件 sqlite3.h
函数功能 打开一个数据库,文件名不一定要存在,如果此文件不存在,sqlite会自动创建
参数及返回解析
参数
const char* 指文件名
sqlite3 ** 结构体指针(关键数据结构)
返回值
int 表示操所是否正确 (SQLITE_OK 操作正常)
3.2 int sqlite3_close
函数声明 int sqlite3_close(
sqlite3* db
);
所在文件 sqlite3.h
函数功能 如果用sqlite3_open开启了一个数据库,结尾时不要忘了用这个函数关闭数据库。
参数及返回解析
参数 sqlite3* 数据库句柄
返回值 int 表示操所是否正确 (SQLITE_OK 操作正常)
3.3 sqlite3_exec
函数声明 int sqlite3_exec(
sqlite3*,
const char *sql,
sqlite_callback,
void *,
char **errmsg
);
所在文件 sqlite3.h
函数功能 这个函数的功能是执行一条或者多条SQL语句,SQL语句之间用“;”号隔开。
通常sqlite3_callback和它后面的void*这两个位置都可以填NULL,表示不需要回调。比如您做insert操作,做delete操作,就没有必要使用回调。而当作select时,就要使用回调,因为sqlite3把数据查出来,得通过回调告诉你查出了什么数据。
参数及返回解析
参数
sqlite3* 数据库句柄
const char* 待执行的sql语句
sqlite_callback 回调函数
void * 传入参数
char ** 输出错误信息
返回值
int 表示操所是否正确 (SQLITE_OK 操作正常)
3.3 typedef int (*sqlite3_callback)
函数声明 typedef int (*sqlite3_callback)(
void* data,
int argc,
char** argv,
char** column
);
所在文件 sqlite3.h
函数功能 回调函数必须定义为这个函数的类型
参数及返回解析
参数 void * Data providedin the 4th argument of sqlite3_exec()
int The number of columns in row
char ** An array of strings representing fields in the row An array of strings representing column names
char **
返回值
int 在回调函数中可以获得执行Sql得详细过程,如果所有Sql执行完毕则应该返回0,否则,则说明这次执行并没有完全成功
3.3 int sqlite3_get_table
函数声明 int sqlite3_get_table(
sqlite3*,
const char *sql,
char ***resultp,
int *nrow,
int *ncolumn,
char **errmsg
)
所在文件 sqlite3.h
函数功能 执行一次查询Sql 并且返回得到一个记录集。
参数及返回解析
参数
sqlite3* 句柄
const char * sql
char * 它是一维数组,内存布局为:第一行是字段名称,后面是紧接着是每个字段的值
int * 行数
int * 列数
char ** 错误信息
返回值
int 表示操所是否正确 (SQLITE_OK 操作正常)
3代码示例
#include <stdio.h>
#include "sqlite3.h"
//读多少行,就执行多少次回调
#if 0
argc 3
argv **
char * caocao
char * weiguo
char * 100000
colName
char * name
char * address
char * salary
#endif
#if 0
argc 3
argv **
char * suquan
char * wuguo
char * 20000
colName
char * name
char * address
char * address
#endif
#if 0
char **
char *name
char *address
char *salary
char *caocao
char *weiguo
char *100000
char *suquan
char *wuguo
char *20000
#endif
static int callback(void *NotUsed, int argc, char **argv, char **ColName)
{
// printf("argc = %d\n",argc);
// int i;
// for(i=0; i<argc; i++){
// printf("%s = %s\n", ColName[i], argv[i] ? argv[i] : "NULL");
// }
// printf("\n");
static int flag = 1;
if(flag)
{
for(int i=0; i<argc; i++)
printf("%s\t",ColName[i]);
flag = 0;
}
putchar(10);
for(int i=0; i<argc; i++)
printf("%s\t",argv[i]);
return 0;
}
int main(int argc, char *argv[])
{
sqlite3 *db; // FILE*
char *zErrMsg = 0;
int rc;
rc = sqlite3_open("mydb", &db);
if( rc ){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return(1);
}
// rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
// if( rc!=SQLITE_OK ){
// fprintf(stderr, "SQL error: %s\n", zErrMsg);
// sqlite3_free(zErrMsg);
// }
char *sql;
// char* sql = "create table salary(name text,address text,salary REAL)";
// rc = sqlite3_exec(db, sql, NULL, NULL, &zErrMsg);
// if( rc!=SQLITE_OK ){
// fprintf(stderr, "SQL error: %s\n", zErrMsg);
// sqlite3_free(zErrMsg);
// }
#if 0
sql = "insert into salary values(\"caocao\",\"weiguo\",10000)";
rc = sqlite3_exec(db, sql, NULL, NULL, &zErrMsg);
if( rc!=SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
sql = "insert into salary values(\"sunquan\",\"wuguo\",100000)";
rc = sqlite3_exec(db, sql, NULL, NULL, &zErrMsg);
if( rc!=SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
sql = "insert into salary values(\"liube\",\"shuguo\",20000)";
rc = sqlite3_exec(db, sql, NULL, NULL, &zErrMsg);
if( rc!=SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
float salary;
printf("刘备的工资:");
scanf("%f",&salary);
char sqlcombine[1024];
sprintf(sqlcombine,"update salary set salary = %f
where name = \"liube\"",salary);
rc = sqlite3_exec(db, sqlcombine, NULL, NULL, &zErrMsg);
if( rc!=SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
sql = "delete from salary where name = \"liube\"";
rc = sqlite3_exec(db, sql, NULL, NULL, &zErrMsg);
if( rc!=SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
sql = "select * from salary";
rc = sqlite3_exec(db, sql,callback, NULL, &zErrMsg);
if( rc!=SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
#endif
sql = "select * from salary";
char **table = NULL;
int row;
int column;
rc = sqlite3_get_table(db,sql,&table,&row,&column,&zErrMsg);
if( rc!=SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
for(int i=0; i<column; i++)
{
printf("%s\t",table[i]);
}
putchar(10);
for(int i=column; i<(row+1)*column; i++)
{
printf("%s\t",table[i]);
if(!((i+1)%column))
putchar(10);
}
sqlite3_free_table(table);
sqlite3_close(db);
return 0;
}