SQLite介绍
SQLite是一个软件库,实现了自给自足的,无服务器的,零配置的,事务性的SQL数据库引擎。且SQLite源代码不受版权限制。本文主要介绍SQLite在C/C++中的使用,以及最后给出在mfc中使用示例,但是在mfc中具体使用需要自己将源码导入到项目中才能调用。
Windows安装:搜索SQLite官网或访问https://www.sqlite.org/download.html页面,从在windows区下载预编译二进制文件,如sqlite-tools-win32-xxx-*.zip和sqlite-dll-win32-xxx-*.zip文件,然后创建一个文件夹sqlite,解压缩文件到该目录,得到sqlite3.def,sqlite3.dll和sqlite3.exe文件等,最后将该目录添加到path环境变量中。
Linux安装:目前几乎所有版本的Linux版本都附带了SQLite,如果没有,就去SQLite网页下载sqlite-autoconf-*.tar.gz文件,执行步骤如下:
$ tar xvzf sqlite-autoconf-3071502.tar.gz
$ cd sqlite-autoconf-3071502
$ ./configure --prefix=/usr/local
$ make
$ make install
安装完成后,可在命令行输入sqlite3,显示SQLite版本信息。
SQLite-C/C++接口
sqlite3_open:
/*
** CAPI3REF: Opening A New Database Connection
**
** 该例程打开一个指向SQLite数据库文件的连接,
** 如果filenam参数为NULL,那么sqlite3_open()将会在内存中** 创建一个数据库;
** 如果filename名称文件不存在,那么sqlite3_open()将自动创建一个该名称数据库并打开。
**
*/
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
sqlite3_get_table:
/*
** CAPI3REF: Convenience Routines For Running Queries
** 举个例子,假设查询结果如下:
** <pre>
** Name | Age
** -----------------------
** Alice | 43
** Bob | 28
** Cindy | 21
** </pre>
**
** 如果第三个参数是&azResult,那么在函数执行返回后azResult中数据如下:
** <pre>
** azResult[0] = "Name";
** azResult[1] = "Age";
** azResult[2] = "Alice";
** azResult[3] = "43";
** azResult[4] = "Bob";
** azResult[5] = "28";
** azResult[6] = "Cindy";
** azResult[7] = "21";
** </pre>
**
** 注意第四和第五个参数,返回查询结果的行和列,如上查询结果,那么*nrow等于3,*ncolumn等于2
** 通常,一般插入到azResult数组中的个数为((*nrow) + 1)*(*ncolumn)。
**
** 调用函数使用结果后,应该调用sqlite3_free_table(azResult)函数正确地,安全地释放内存。
**
*/
int sqlite3_get_table(
sqlite3*, /* 一个打开的数据库 */
const char *sql, /* 需要执行的SQL语句 */
char ***resultp, /* 查询结果数组 */
int *nrow, /* 查询结果的行数 */
int *ncolumn, /* 查询结果的列数 */
char **errmsg /* 错误信息 */
);
void sqlite3_free_table(char **result);
sqlite3_exec:
/*
** CAPI3REF: One-Step Query Execution Interface
**
** 第三个参数为回调函数,对查询结果每行都调用一次;
** 一般返回0,如果回调返回非0,则查询中止,后续sql语句跳过。
** 第四个参数为任意指针,作为回调函数的第一个参数。
**
*/
typedef int (*sqlite3_callback)(
void*, /* sqlite3_exec中第四个参数 */
int azcolumn, /* 查询结果列数 */
char** azValue, /* 查询结果的值 */
char** azName /* 查询结果的字段名 */
);
int sqlite3_exec(
sqlite3*, /* 打开的数据库连接 */
const char *sql, /* 一条或多条sql语句 */
int (*callback)(void*,int,char**,char**), /* 回调函数 */
void *, /* 回调函数的第一个参数 */
char **errmsg /* 错误信息 */
);
sqlite3_close:
/*
** CAPI3REF: Closing A Database Connection
** 关闭一个数据库连接
**
*/
int sqlite3_close(sqlite3 *);
SQLite使用(C++/MFC):
sqlite3 *pDB;
CString singleResult;
static int callback(void *data, int azcolumn, char **azValue, char **azName ){
for(int i=0; i < azcolumn; i++){
singleResult = azName[i] + ":" + azValue[i];
}
return 0;
}
if(!sqlite3_open( "myDB.db", &pDB) ){
char sql[ 100 ];
char **azResult;
int row = 0;
int column = 0;
const char* data = "CallBack Function called!"
char * errmsg = NULL;
strcpy(sql, "select * from student" );
sqlite3_get_table( pDB, sql, &azResult, &row, &column, &errmsg );
//sqlite3_exec( pDB, sql, callback, (void*)data, &errmsg);
for( int i = 1; i<row + 1; i++ ){
singleResult = *( azResult + i*colum );
}
sqlite3_free_table( azResult );
}
sqlite3_close(pDB);