Sqlite的官网只提供sqlite3.dll以及sqlite3.def这两个文件,对于准备在windows系统下开发程序在使用的时候有诸多不便,在C/C++程序中,要是有一个sqlite3.lib文件将极大的方便我们的开发。
下面就说说如何将sqlite3.def转化为sqlite3.lib,这个法子同样适用于将其他def文件转化为lib文件,具体步骤如下:
C:\ProgramFiles\Microsoft Visual Studio\VC98\Bin>LIB.EXE /MACHINE:IX86 /DEF:sqlite3.def
Microsoft (R)Library Manager Version 6.00.8168
Copyright (C)Microsoft Corp 1992-1998. All rights reserved.
Creating library sqlite3.lib and objectsqlite3.exp
上面突出显示的部分就是需要执行的指令,具体使用办法也非常明了,对于其他def文件注意修改成对应的文件名,在输出信息中可以看到,生成了sqlite3.lib文件,而且还有赠品sqlite3.exp。
在执行上面指令的时候,需要把def文件拷贝到LIB.EXE所在的目录,最终生成的文件也在这个目录!
唯一需要注意的就是你的VC安装路径,Coding Ants安装的是VS2008,LIB.EXE所在的位置为:
C:\Program Files\Microsoft Visual Studio\VC98\Bin
下面就直接看C/C++操作sqlite数据库的示例程序,代码如下:
#include<stdio.h>
#include <sqlite3.h>
void main()
{
sqlite3 *db = NULL;
char *zErrMsg = NULL;
int rc;
rc = sqlite3_open("test.db",&db); //打开数据库
//如果连接成功,则返回SQLITE_OK,其值为0;如果失败则返回大于0的值
if( rc )
{
fprintf(stderr, "Can't opendatabase: %s\n", sqlite3_errmsg(db));
sqlite3_close(db); //注意,这里也需要调用sqlite3_close
return;
}
rc = sqlite3_exec(db, "create tabletbl1(one varchar(10), two smallint)", NULL, 0, &zErrMsg);
if( rc != SQLITE_OK )
{
fprintf(stderr, "SQL error:%s\n", zErrMsg);
sqlite3_free(zErrMsg); //注意这里对 zErrMsg 的释放
}
sqlite3_close(db); //关闭数据库
}
sqlite数据库的使用非常的简单,通过sqlite3_open打开数据库,打开成功后通过sqlite3_exec执行sql语句,最后使用sqlite3_close关闭数据库。
要让以上代码正确的运行起来,还有一些工作要做,如果你直接就编译、运行上面的代码,那么你肯定会经历下面的错误:
错误1:编译错误无法打开 sqlite3.h
fatal errorC1083: 无法打开包括文件:“sqlite3.h”: No such file or directory
解决办法:在vc的包含路径中,添加sqlite3.h所在的位置,具体设置方法为:工具 – 选项 – 项目和解决方案,展开,选择“VC++目录”,之后在右侧“显示以下内容的目录”下拉框中选择“包含文件”,再在底下列表框中添加对应的目录。
错误2:链接错误
1>正在链接...
1>c_connect_sqlite.obj: error LNK2019: 无法解析的外部符号 _sqlite3_free,该符号在函数 _main 中被引用
1>c_connect_sqlite.obj: error LNK2019: 无法解析的外部符号 _sqlite3_exec,该符号在函数 _main 中被引用
1>c_connect_sqlite.obj: error LNK2019: 无法解析的外部符号 _sqlite3_close,该符号在函数 _main 中被引用
1>c_connect_sqlite.obj: error LNK2019: 无法解析的外部符号 _sqlite3_errmsg,该符号在函数 _main 中被引用
1>c_connect_sqlite.obj: error LNK2019: 无法解析的外部符号 _sqlite3_open,该符号在函数 _main 中被引用
1>F:\Program\VS2008\sqlite\Debug\c_sqlite.exe: fatal error LNK1120: 5 个无法解析的外部命令
哇,这次错误不少,看来比较麻烦,其实这个都是同一个问题,没有引入sqlite3.lib文件导致,错误的解决和错误1比较类似,错误1是添加“包含文件”,这里我们需要添加“库文件”,加上sqlite3.lib所在的位置。
添加库文件位置后,我们还需要明确的告知程序去引入sqlite3.lib文件,有两种方法,具体如下:
1、打开项目的属性页,左侧依次展开“配置属性”-“链接器”-“输入”,在右侧的“附加依赖性”中输入 sqlite3.lib
2、在代码中的include语句后加入下面的代码
#pragmacomment(lib,"sqlite3.lib")
错误3:运行错误没有找到sqlite3.dll
没有找到sqlite3.dll,因此这个应用程序未能启动。重新安装应用程序可能会修复此问题。
解决方法也有两个:
1、将sqlite3.dll文件拷贝到system32文件夹(中
2、将sqlite3.dll文件拷贝到当前工程目录下
sqlite3_exec(db,sql,NULL,NULL,&zErr); 执行一条 sql 语句的函数。函数原型:int sqlite3_exec(sqlite3*, const char *sql, sqlite3_callback, void*, char **errmsg ) 第1个参数是前面open函数得到的指针。说了是关键数据结构。 第2个参数const char *sql 是一条 sql 语句,以\0结尾。 第3个参数sqlite3_callback 是回调,当这条语句执行之后,sqlite3会去调用你提供的这个函数。 第4个参数void * 是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。等下我们再看回调函数的写法,以及这个参数的使用。 第5个参数char ** errmsg 是错误信息。注意是指针的指针。sqlite3里面有很多固定的错误信息。执行sqlite3_exec 之后,执行失败时可以查阅这个指针(直接printf(“%s\n”,errmsg))得到一串字符串信息,这串信息告诉你错在什么地方。sqlite3_exec函数通过修改你传入的指针的指针,把你提供的指针指向错误提示信息,这样sqlite3_exec函数外面就可以通过这个char*得到具体错误提示。 说明:通常,sqlite3_callback 和它后面的 void * 这两个位置都可以填 NULL。填NULL表示你不需要回调。比如你做 insert 操作,做 delete 操作,就没有必要使用回调。而当你做 select 时,就要使用回调,因为sqlite3 把数据查出来,得通过回调告诉你查出了什么数据。