背景
很早就听说过SQLite数据库了,但是自己一直都没有去接触它。一天,群友在Q群里提问有没有人使用VS写过关于SQLite数据库的例子。霎时间,我知道自己是时候要与SQLite邂逅了。
SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎,而且源代码不受版权限制。
本文就是要实现这样的一个小程序,使用VS2013加载SQLite数据库的库文件,并实现使用SQL语句新建表、对表插入数据并查询数据的功能。现在,我就把实现过程整理成文档,分享给大家。
使用VS2013编译SQLite数据库的库文件
在使用 SQLite 数据库之前,我们需要到 SQLite官网 上下载SQLite数据库的源码文件以及二进制文件。本文演示使用的下载文件是“sqlite-amalgamation-3190300.zi p” 和 “sqlite-dll-win32-x86-3190300.zip”。
编译库文件
首先,我们先解压二进制压缩文件 “sqlite-dll-win32-x86-3190300.zip”,解压后目录下有两个文件,分别是 “sqlite3.dll” 和 “sqlite3.def”,现在,我们需要使用VS2013 来帮助编译得到 .lib 库文件。编译过程就是在命令行CMD下输入:
"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\lib.exe"/MACHINE:IX86/DEF:C:\Users\DemonGan\Desktop\sqlite-dll-win32-x86-3190300\SQLite3.def/OUT:C:\Users\DemonGan\Desktop\sqlite-dll-win32-x86-3190300\SQLite3.lib
其中,”C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\lib.exe”就是你的VS2013自带的 lib.exe 程序路径;C:\Users\DemonGan\Desktop\sqlite-dll-win32-x86-3190300\SQLite3.def就是解压文件目录中SQLite3.def的路径;C:\Users\DemonGan\Desktop\sqlite-dll-win32-x86-3190300\SQLite3.lib就是保存生成的库文件SQLite.lib的输出路径。
这样,我们就在目录下生成了“SQLite3.lib”库文件。
向VS2013工程中导入SQLite库文件配置
这时,我们继续解压“sqlite-amalgamation-3190300.zip”,将解压目录下的 “sqlite3.h” 头文件和 “SQLite3.lib” 库文件一起拷贝到工程目录下。然后,在工程中添加头文件和库文件:
#include"sqlite3.h"
#pragmacomment(lib,"sqlite3.lib")
这样,就可以在项目工程中,使用SQLite数据库了。
实现过程
首先,我们使用 sqlite3_open 函数根据数据库文件名称创建 SQLite 数据库。sqlite3_open 函数的第 1 个参数表示要创建的数据库名称,第 2 个参数获取数据库创建成功后的数据库句柄。
// 打开数据库,创建连接
intiRet=sqlite3_open(szFileName,&conn);
if(SQLITE_OK!=iRet)
{
ShowError("sqlite3_open");
return1;
}
然后,我们就可以直接调用 sqlite3_exec 函数执行SQL语句,来对数据库进行操作。其中, sqlite3_exec 函数的第 1 个参数表示数据库的句柄;第 2 个参数表示SQL语句;第 3 个参数表示回调函数,每成功执行一次SQL语句就执行一次回调函数;第 4 个参数表示回调函数返回的数据信息。
现在,我们执行SQL语句 “CREATE TABLE demongan(ID int, Name varchar (20), Age int)”来创建一个名为demongan的表:
// 执行SQL语句,创建表demongan
::wsprintf(szSQL,"CREATE TABLE demongan(ID int, Name varchar(20), Age int)");
iRet=sqlite3_exec(conn,szSQL,NULL,NULL,&szErr);
if(SQLITE_OK!=iRet)
{
ShowError("sqlite3_exec",szErr);
return2;
}
然后,继续调用 sqlite3_exec 函数执行SQL语句,将数据插入数据库中:
// 执行SQL语句,插入10条记录
for(i=0;i<10;i++)
{
::wsprintf(szSQL,
"INSERT INTO demongan(ID, Name, Age) VALUES(%d, \'%s%d\', %d)",
i,"Name",i,i+1);
iRet=sqlite3_exec(conn,szSQL,NULL,NULL,&szErr);
if(SQLITE_OK!=iRet)
{
ShowError("sqlite3_exec",szErr);
return3;
}
}
接着,继续调用 sqlite3_exec 函数执行SQL语句,查询数据库,注意此处需要传入第 3 个参数,也就是回调函数,以此来显示查询结果:
// 执行SQL语句,查询记录
::wsprintf(szSQL,"SELECT * FROM demongan");
iRet=sqlite3_exec(conn,szSQL,sqlite3_exec_callback,NULL,&szErr);
if(SQLITE_OK!=iRet)
{
ShowError("sqlite3_exec");
return4;
}
那么,回调函数 sqlite3_exec_callback 的函数名称是任意的,但是参数是固定的。一共有 4 个参数,第 1 个参数是由 sqlite3_exec 函数的第 4 个参数传递而来;第 2 个参数是表的列数;第 3 个参数表示查询到的值的指针数组;第 4 个参数表示列名即字段名指针数组。
本文回调函数 sqlite3_exec_callback 的代码如下,
intsqlite3_exec_callback(void*data,intcolNum,char**colValue,char**colName)
{
inti=0;
for(i=0;i
{
printf("%s[%s]\t",colName[i],colValue[i]);
}
printf("\n");
return0;
}
程序测试
将解压文件中的 “SQLite3.dll” 拷贝到工程编译链接生成的 exe 程序同一目录下,运行 exe 程序,成功显示数据库查询结果:
总结
使用SQLite数据库确实很方便,不需要安装额外的数据库环境,就可以通过SQL语句去操作数据库。这个程序的实现过程不是很繁杂,只要跟着上述介绍的步骤,仔细编码就可实现。
同时,也应该注意的是,需要把解压文件中的 “SQLite3.dll” 拷贝到工程编译链接生成的 exe 程序同一目录下,这样程序才能正常运行。