C语言读写SQLite数据库

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 
#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//        printf("%s = %s\n", ColName[i], argv[i] ? argv[i] : "NULL");
//    }
//    printf("\n");

    static int flag = 1;
    if(flag)
    {
        for(int i=0; iprintf("%s\t",ColName[i]);
        flag = 0;
    }
    putchar(10);
    for(int i=0; iprintf("%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; iprintf("%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;
}

你可能感兴趣的:(C语言,Qt,数据结构与算法)