赞
踩
参考文献:https://www.runoob.com/sqlite/sqlite-tutorial.html
Sqlite 语句在shell是可以执行的,本文是对sqlite语句在C/C++程序中执行的说明。
数据库打开->SQL语句执行->CallBack函数处理执行结果->数据库关闭
- SQLITE_API int sqlite3_open(
-
- const char *filename, /* Database filename (UTF-8) */
-
- sqlite3 **ppDb /* OUT: SQLite db handle */
-
- );
-
- SQLITE_API int sqlite3_open16(
-
- const void *filename, /* Database filename (UTF-16) */
-
- sqlite3 **ppDb /* OUT: SQLite db handle */
-
- );
-
- SQLITE_API int sqlite3_open_v2(
-
- const char *filename, /* Database filename (UTF-8) */
-
- sqlite3 **ppDb, /* OUT: SQLite db handle */
-
- int flags, /* Flags */
-
- const char *zVfs /* Name of VFS module to use */
-
- );
数据库打开的函数原型共有三个,主要区别是使用sqlite3_open和sqlite3_open_v2的话,数据库将采用UTF-8的编码方式,sqlite3_open16采用UTF-16的编码方式,sqlite3_open_v2可以看做是sqlite3_open的增强版。数据库打开函数会打开一个sqlite数据库文件的连接并且返回一个数据库连接对象。注:假如这个要被打开的数据文件不存在,则一个同名的数据库文件将被创建。
返回值:
如果sqlite数据库被成功打开(或创建),将会返回SQLITE_OK,否则将会返回错误码。
- sqlite3 * db_sql_open(char *dbName)
- {
- sqlite3 *db = NULL;
- int ret = 0;
-
- ret = sqlite3_open(dbName,&db);
-
- if(ret != SQLITE_OK)
- {
- printf("db_sql_open error!\n");
- return NULL;
- }
- printf("db_sql_open successful!\n");
-
- return db;
- }
参数:
第一个参数:const char *filename,是需要打开或创建的数据库名字,sqlite3_open和sqlite3_open_v2中这个参数采用UTF-8编码,而在sqlite3_open16中则采用UTF-16编码。
第二个参数: sqlite3 **ppDb,是数据库被成功打开或创建后返回的数据库连接。
sqlite3_open_v2函数的第三个参数,官方文档中给出的参数如下:
- #define SQLITE_OPEN_READONLY 0x00000001 /* Ok for sqlite3_open_v2() */
-
- #define SQLITE_OPEN_READWRITE 0x00000002 /* Ok for sqlite3_open_v2() */
-
- #define SQLITE_OPEN_CREATE 0x00000004 /* Ok for sqlite3_open_v2() */
-
- #define SQLITE_OPEN_DELETEONCLOSE 0x00000008 /* VFS only */
-
- #define SQLITE_OPEN_EXCLUSIVE 0x00000010 /* VFS only */
-
- #define SQLITE_OPEN_AUTOPROXY 0x00000020 /* VFS only */
-
- #define SQLITE_OPEN_URI 0x00000040 /* Ok for sqlite3_open_v2() */
-
- #define SQLITE_OPEN_MEMORY 0x00000080 /* Ok for sqlite3_open_v2() */
-
- #define SQLITE_OPEN_MAIN_DB 0x00000100 /* VFS only */
-
- #define SQLITE_OPEN_TEMP_DB 0x00000200 /* VFS only */
-
- #define SQLITE_OPEN_TRANSIENT_DB 0x00000400 /* VFS only */
-
- #define SQLITE_OPEN_MAIN_JOURNAL 0x00000800 /* VFS only */
-
- #define SQLITE_OPEN_TEMP_JOURNAL 0x00001000 /* VFS only */
-
- #define SQLITE_OPEN_SUBJOURNAL 0x00002000 /* VFS only */
-
- #define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 /* VFS only */
-
- #define SQLITE_OPEN_NOMUTEX 0x00008000 /* Ok for sqlite3_open_v2() */
-
- #define SQLITE_OPEN_FULLMUTEX 0x00010000 /* Ok for sqlite3_open_v2() */
-
- #define SQLITE_OPEN_SHAREDCACHE 0x00020000 /* Ok for sqlite3_open_v2() */
-
- #define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok for sqlite3_open_v2() */
-
- #define SQLITE_OPEN_WAL 0x00080000 /* VFS only */
作为数据库连接的额外控制的参数,可以是SQLITE_OPEN_READONLY,SQLITE_OPEN_READWRITE和 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE中的一个,用于控制数据库的打开方式,可以和SQLITE_OPEN_NOMUTEX,SQLITE_OPEN_FULLMUTEX, SQLITE_OPEN_SHAREDCACHE,以及SQLITE_OPEN_PRIVATECACHE结合使用。
- sqlite3 * db_stmt_open(char *dbName)
- {
- sqlite3 *db = NULL;
- int ret =0;
-
- ret = sqlite3_open_v2(dbName,&db,SQLITE_OPEN_READWRITE | SQLITE_OPEN_FULLMUTEX ,NULL);
- if(ret !=SQLITE_OK)
- {
- printf("db_stmt_open error!\n");
- return NULL;
- }
- printf("db_stmt_open successful!\n");
-
- return db;
- }
- SQLITE_API int sqlite3_exec(
- sqlite3*, /* An open database */
- const char *sql, /* SQL to be evaluated */
- int (*callback)(void*,int,char**,char**), /* Callback function */
- void *, /* 1st argument to callback */
- char **errmsg /* Error msg written here */
- );
SQL语句执行的函数为sqlite3_exec,可以理解为C/C++程序中提供的可在shell中执行SQL语句的方法。
参数:
第一个参数:sqlite3* 已经通过sqlie3_open函数打开的数据库连接
第二个参数:const char *sql 需要被执行的SQL语句
第三个参数:回调函数,用于处理SQL语句被执行后的结果
第四个参数:回调函数的第一个参数
第五个参数:错误信息输出
- int db_sql_exec(sqlite3 *db,const char *sql,char **errmsg)
- {
- int ret;
-
- do{
- ret=sqlite3_exec(db,sql,NULL,NULL,errmsg);
- if(ret==SQLITE_BUSY)
- {
- usleep(1000);
- continue;
- }
- break;
- }while(ret==SQLITE_BUSY);
-
- if(ret!=SQLITE_OK)
- {
- printf("database: %s\n", sql);
- }
-
- return ret;
- }
- typedef int (*sqlite3_callback)(
-
- void*, /* Data provided in the 4th argument of sqlite3_exec() */
-
- int, /* The number of columns in row */
-
- char**, /* An array of strings representing fields in the row */
-
- char** /* An array of strings representing column names */
-
- );
真正处理数据的函数就是回调函数,在SQL语句被执行后sqlite返回的结果需要在回调函数中处理,一般会select语句。
参数:
第一个参数:sqlite3_exce函数的第四个参数。
第二个参数:查询到的列数
第三个参数:表示每一行中字段的字符串数组
第四个参数:表示列名的字符串数组
用一个参考文献中给出的回调函数进行说明:
- static int callback(void *data, int argc, char **argv, char **azColName)
- {
- int i;
-
- fprintf(stderr, "%s: ", (const char*)data);
- for(i=0; i<argc; i++){
- printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
- }
- printf("\n");
-
- return 0;
- }
data是sqlite3_exec函数的第四个参数,argc是执行select语句后查询到的数据表单的列数,argv用于存放查询到的一列数据,azColName也是一个一维数组,用于用户存放每一列的名字,改回调函数的输出结果为:
sqlite3_close(sqlite3*)
关闭前面使用sqlite3_open打开的数据库连接,任何与这个连接相关的准备语句必须在调用这个关闭函数之前被释放。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。