关于VC++中sqlite3的配置和简单使用小结

来源:互联网 发布:掌上校园域名是什么 编辑:程序博客网 时间:2024/05/14 14:47

公司突然要我们搞sqlite3数据库,对于这方面一无所知,在网上搜集了诸多资料才终于配置好了,之前一直被误导。

在官网上(非官网也行)去下载sqlite3,不是sqlite3.exe,而是下载的包,一般下载的包是sqlite3.h、sqlite3.dll和sqlite3.def。

1、把sqlite3.h放进工程中,并在工程文件需要调用sqlite3函数的地方添加头文件#include “sqlite3.h”。

2、把sqlite3.dll也放进工程中,不然的话,无法启动程序,会显示无法找到sqlite3.dll。

3、利用sqlite3.def生成sqlite3.lib文件,具体方法为:

1)找到VC安装盘的目录下,我安装在E盘,E:\Program Files\Microsoft Visual Studio\VC98\Bin下,切换到该目录下

2)利用LIB.EXE生成.lib文件,使用时需要注意一点,路径要写全,包括输出路径。例如下面一个完整的命令行:

E:\Program Files\Microsoft Visual Studio\VC98\Bin>LIB /out:D:\test\sqlite3.lib /MACHINE:IX86 /DEF:D:\test\sqlite3.def

运行完这个命令后,你会在D:\test\下发现sqlite3.lib和sqlite3.exp两个文件。这样的话,就可以了。

sqlite3.lib已经生成了,但是还需要将这个lib文件放进VC6主机安装路径的lib文件夹下,我的是E:\Program Files\Microsoft Visual Studio\VC98\lib下。

或者打开VC程序,进入Tools菜单->options->directories,设定此文件放置路径。

此时,虽然一切都已经弄好了,但是当你调用它的库函数时,还会出现一个错误就是:

sqlite.obj : error LNK2001: unresolved external symbol _sqlite3_free_table
sqlite.obj : error LNK2001: unresolved external symbol _sqlite3_get_table
sqlite.obj : error LNK2001: unresolved external symbol _sqlite3_exec
sqlite.obj : error LNK2001: unresolved external symbol _sqlite3_close
sqlite.obj : error LNK2001: unresolved external symbol _sqlite3_errmsg
sqlite.obj : error LNK2001: unresolved external symbol _sqlite3_open

这是因为我们的工程中没有加入外部的lib文件导致的,需要在工程->设置->link中的lib中添加了sqlite3.lib,这样就好了。

当一切都完成之后就可以使用sqlite3中的库函数了。


sqlite3使用中需要注意,对于插入修改删除我就不说了,这几个函数就那几个用法,不需要回调函数,只需要在执行时判断exec的返回结果是否为SQLITE3_OK。

对了exec函数也说明一下吧。

1、int sqlite3_exec(sqlite3*, const char *sql,sqlite3_callback, void *,  char **errmsg );

这个函数是执行一条sql语句的函数,

第一个参数是open函数得到的指针,这个我们无需操心

第二个函数const char *sql是我们需要执行的sql语句,以‘\0’结尾,注意它的类型,是const char*类型的。

第三个参数sqlite3_callback是回调函数,当执行完这条语句之后,sqlite3会调用提供的这个回调函数,当不需要回调函数时,可以为NULL

个参数void * 是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL

第五个参数是错误信息,注意类型是char**。

注:当不需要回调函数时,第三个和第四个参数可以设置为NULL,像上面说的插入修改删除等不需要回调函数的,但是像查询需要回调函数,因为要查看查询的结果如何。


2、exec回调函数

typedef int (*sqlite3_callback)(void* para,intn_column,char** column_value, char** column_name);

这是exec执行sql语句后的回调函数,每当查到一条数据时,就调用这个回调函数一次。

注:

para是exec传入的指针,也就是exec的第四个参数(注意该函数中的类型是void*类型的,需要转化成自己所需的类型才能使用);

n_column这是记录该跳记录有多少个字段;

column_value查询出来的数据保存在这里,实际上是一个一维数组,每个元素都是char*值,是一个字段的内容;

column_name是与column_value对应的字段名称。

当调用该回调函数时,我经过小测试得知,当执行的查询语句或者条件查询返回的记录数为0时,是不会进入到回调函数的。所以在某些时候需要根据查询结果来对数据库进行操作的时候用回调函数还是不太方便,例如:当使用条件查询某条数据是否在数据库中,如果存在则修改该条记录,如果不存在则插入该条记录。这样的话使用回调函数就无法实现,可能是我现在对sqlite3还比较稚嫩,没研究出来吧,等我发现了如何使用回调函数操作后,再修改博客内容。在此时就可以用下面这种方法来实现上面这个假设。

3、不使用回调函数查询数据库(此下为转载)

函数声明如下:

int sqlite3_get_table(sqlite3*, const char *sql, char ***resultp, int *nrow, int *ncolumn, char **errmsg);

第1个参数同上

第2个参数是 sql 语句,跟 sqlite3_exec 里的 sql 是一样的。是一个很普通的以/0结尾的char *字符串。

第3个参数是查询结果,它依然一维数组(不要以为是二维数组,更不要以为是三维数组)。它内存布局是:第一行是字段名称,后面是紧接着是每个字段的值。

第4个参数是查询出多少条记录(即查出多少行)。

第5个参数是多少个字段(多少列)。

第6个参数是错误信息

下面给个简单例子:

int main( int , char ** )

{

   sqlite3 * db;

   int result;

   char * errmsg = NULL;

   char **dbResult; // char ** 类型,两个*号

   int nRow, nColumn;

   int i , j;

   int index;

 

   result = sqlite3_open( “c://Dcg_database.db”,&db );

   if( result != SQLITE_OK )

   {

        //数据库打开失败

        return-1;

   }

 

   //数据库操作代码

   //假设前面已经创建了 MyTable_1 

   //开始查询,传入的 dbResult 已经是 char **,这里又加了一个 & 取地址符,传递进去的就成了 char ***

   result = sqlite3_get_table(db, “select * from MyTable_1”,&dbResult, &nRow, &nColumn, &errmsg );

   if( SQLITE_OK ==result )

   {

        //查询成功

        index = nColumn; //前面说过 dbResult 前面第一行数据是字段名称,从 nColumn 索引开始才是真正的数据

        printf( “查到%d条记录/n”, nRow );

 

        for(  i= 0; i < nRow ; i++ )

        {

             printf( “第 %d 条记录/n”,i+1 );

             for(j = 0 ; j < nColumn; j++ )

             {

                  printf( “字段名:%s  ß> 字段值:%s/n”,  dbResult[j],dbResult [index] );

                  ++index; // dbResult 的字段值是连续的,从第0索引到第 nColumn - 1索引都是字段名称,从第 nColumn 索引开始,后面都是字段值,它把一个二维的表(传统的行列表示法)用一个扁平的形式来表示

             }

             printf( “-------/n” );

        }

   }

 

   //到这里,不论数据库查询是否成功,都释放 char** 查询结果,使用 sqlite 提供的功能来释放

   sqlite3_free_table(dbResult );

 

   //关闭数据库

   sqlite3_close( db );

   return 0;

}

好了,先就到这里吧,我接触不多,等以后用的越来越多了再改进这篇文章。
原创粉丝点击