当前位置:   article > 正文

Sqlite3 C/C++ API 操作_sqlite3 c++ api

sqlite3 c++ api

参考文献:https://www.runoob.com/sqlite/sqlite-tutorial.html

Sqlite 语句在shell是可以执行的,本文是对sqlite语句在C/C++程序中执行的说明。

  • 操作步骤:

数据库打开->SQL语句执行->CallBack函数处理执行结果->数据库关闭

  • 数据库打开
  1. SQLITE_API int sqlite3_open(
  2.   const char *filename,     /* Database filename (UTF-8) */
  3.   sqlite3 **ppDb          /* OUT: SQLite db handle */
  4. );
  5. SQLITE_API int sqlite3_open16(
  6.   const void *filename,     /* Database filename (UTF-16) */
  7.   sqlite3 **ppDb          /* OUT: SQLite db handle */
  8. );
  9. SQLITE_API int sqlite3_open_v2(
  10.   const char *filename,    /* Database filename (UTF-8) */
  11.   sqlite3 **ppDb,         /* OUT: SQLite db handle */
  12.   int flags,               /* Flags */
  13.   const char *zVfs        /* Name of VFS module to use */
  14. );

        数据库打开的函数原型共有三个,主要区别是使用sqlite3_opensqlite3_open_v2的话,数据库将采用UTF-8的编码方式,sqlite3_open16采用UTF-16的编码方式,sqlite3_open_v2可以看做是sqlite3_open的增强版。数据库打开函数会打开一个sqlite数据库文件的连接并且返回一个数据库连接对象。注:假如这个要被打开的数据文件不存在,则一个同名的数据库文件将被创建。

        返回值:

        如果sqlite数据库被成功打开(或创建),将会返回SQLITE_OK,否则将会返回错误码。

  1. sqlite3 * db_sql_open(char *dbName)
  2. {
  3. sqlite3 *db = NULL;
  4. int ret = 0;
  5. ret = sqlite3_open(dbName,&db);
  6. if(ret != SQLITE_OK)
  7. {
  8. printf("db_sql_open error!\n");
  9. return NULL;
  10. }
  11. printf("db_sql_open successful!\n");
  12. return db;
  13. }

      参数:

        第一个参数:const char *filename,是需要打开或创建的数据库名字,sqlite3_opensqlite3_open_v2中这个参数采用UTF-8编码,而在sqlite3_open16中则采用UTF-16编码。

        第二个参数: sqlite3 **ppDb,是数据库被成功打开或创建后返回的数据库连接。

        sqlite3_open_v2函数的第三个参数,官方文档中给出的参数如下:

  1. #define SQLITE_OPEN_READONLY         0x00000001  /* Ok for sqlite3_open_v2() */
  2. #define SQLITE_OPEN_READWRITE        0x00000002  /* Ok for sqlite3_open_v2() */
  3. #define SQLITE_OPEN_CREATE           0x00000004  /* Ok for sqlite3_open_v2() */
  4. #define SQLITE_OPEN_DELETEONCLOSE    0x00000008  /* VFS only */
  5. #define SQLITE_OPEN_EXCLUSIVE        0x00000010  /* VFS only */
  6. #define SQLITE_OPEN_AUTOPROXY        0x00000020  /* VFS only */
  7. #define SQLITE_OPEN_URI              0x00000040  /* Ok for sqlite3_open_v2() */
  8. #define SQLITE_OPEN_MEMORY           0x00000080  /* Ok for sqlite3_open_v2() */
  9. #define SQLITE_OPEN_MAIN_DB          0x00000100  /* VFS only */
  10. #define SQLITE_OPEN_TEMP_DB          0x00000200  /* VFS only */
  11. #define SQLITE_OPEN_TRANSIENT_DB     0x00000400  /* VFS only */
  12. #define SQLITE_OPEN_MAIN_JOURNAL     0x00000800  /* VFS only */
  13. #define SQLITE_OPEN_TEMP_JOURNAL     0x00001000  /* VFS only */
  14. #define SQLITE_OPEN_SUBJOURNAL       0x00002000  /* VFS only */
  15. #define SQLITE_OPEN_MASTER_JOURNAL   0x00004000  /* VFS only */
  16. #define SQLITE_OPEN_NOMUTEX          0x00008000  /* Ok for sqlite3_open_v2() */
  17. #define SQLITE_OPEN_FULLMUTEX        0x00010000  /* Ok for sqlite3_open_v2() */
  18. #define SQLITE_OPEN_SHAREDCACHE      0x00020000  /* Ok for sqlite3_open_v2() */
  19. #define SQLITE_OPEN_PRIVATECACHE     0x00040000  /* Ok for sqlite3_open_v2() */
  20. #define SQLITE_OPEN_WAL              0x00080000  /* VFS only */

        作为数据库连接的额外控制的参数,可以是SQLITE_OPEN_READONLYSQLITE_OPEN_READWRITE SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE中的一个,用于控制数据库的打开方式,可以和SQLITE_OPEN_NOMUTEXSQLITE_OPEN_FULLMUTEX SQLITE_OPEN_SHAREDCACHE,以及SQLITE_OPEN_PRIVATECACHE结合使用。

  1. sqlite3 * db_stmt_open(char *dbName)
  2. {
  3. sqlite3 *db = NULL;
  4. int ret =0;
  5. ret = sqlite3_open_v2(dbName,&db,SQLITE_OPEN_READWRITE | SQLITE_OPEN_FULLMUTEX ,NULL);
  6. if(ret !=SQLITE_OK)
  7. {
  8. printf("db_stmt_open error!\n");
  9. return NULL;
  10. }
  11. printf("db_stmt_open successful!\n");
  12. return db;
  13. }
  • SQL语句执行
  1. SQLITE_API int sqlite3_exec(
  2.   sqlite3*,                                  /* An open database */
  3.   const char *sql,                           /* SQL to be evaluated */
  4.   int (*callback)(void*,int,char**,char**),  /* Callback function */
  5.   void *,                                    /* 1st argument to callback */
  6.   char **errmsg                              /* Error msg written here */
  7. );

        SQL语句执行的函数为sqlite3_exec,可以理解为C/C++程序中提供的可在shell中执行SQL语句的方法。

        参数:

        第一个参数:sqlite3* 已经通过sqlie3_open函数打开的数据库连接

        第二个参数:const char *sql 需要被执行的SQL语句

        第三个参数:回调函数,用于处理SQL语句被执行后的结果

        第四个参数:回调函数的第一个参数

        第五个参数:错误信息输出

  1. int db_sql_exec(sqlite3 *db,const char *sql,char **errmsg)
  2. {
  3. int ret;
  4. do{
  5. ret=sqlite3_exec(db,sql,NULL,NULL,errmsg);
  6. if(ret==SQLITE_BUSY)
  7. {
  8. usleep(1000);
  9. continue;
  10. }
  11. break;
  12. }while(ret==SQLITE_BUSY);
  13. if(ret!=SQLITE_OK)
  14. {
  15. printf("database: %s\n", sql);
  16. }
  17. return ret;
  18. }
  • 回调函数
  1. typedef int (*sqlite3_callback)(
  2. void*,    /* Data provided in the 4th argument of sqlite3_exec() */
  3. int,      /* The number of columns in row */
  4. char**,   /* An array of strings representing fields in the row */
  5. char**    /* An array of strings representing column names */
  6. );

        真正处理数据的函数就是回调函数,在SQL语句被执行后sqlite返回的结果需要在回调函数中处理,一般会select语句。

        参数:

        第一个参数:sqlite3_exce函数的第四个参数。

        第二个参数:查询到的列数

        第三个参数:表示每一行中字段的字符串数组

        第四个参数:表示列名的字符串数组

        用一个参考文献中给出的回调函数进行说明:

  1. static int callback(void *data, int argc, char **argv, char **azColName)
  2. {
  3. int i;
  4. fprintf(stderr, "%s: ", (const char*)data);
  5. for(i=0; i<argc; i++){
  6. printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  7. }
  8. printf("\n");
  9. return 0;
  10. }

        data是sqlite3_exec函数的第四个参数,argc是执行select语句后查询到的数据表单的列数,argv用于存放查询到的一列数据,azColName也是一个一维数组,用于用户存放每一列的名字,改回调函数的输出结果为:

  • 数据库关闭
sqlite3_close(sqlite3*)

        关闭前面使用sqlite3_open打开的数据库连接,任何与这个连接相关的准备语句必须在调用这个关闭函数之前被释放

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/490913
推荐阅读
相关标签
  

闽ICP备14008679号