sqlite 学习博客: http://www.cnblogs.com/stephen-liu74/archive/2012/03/09/2328757.html
sqilte 封装第三方库:http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers
SQLite3
SQLite是一个轻量级的数据库。和常用的MySQL大同小异。和MySQL相比,数据类型基本一样,只是sqlite的指令都是以"."开头(如:mysql中查看当前有哪些数据库是“show databases",而sqlite中是".databases")。当然,SQL语句都是一样的语法规则。
|
- HostSystem:Archlinux
- gcc:4.6.120110819
- sqlite3:3.7.820110919
系统一般没有默认安装sqlite数据库,所以先要安装sqlite3:
#pacman-Ssqlite3
可以使用"sqlite3 + 数据库名"来打开一个数据库。
常用函数
sqlite3_open(constchar*filename,sqlite3**ppDb);
- sqlite3_close(sqlite3*db);
- sqlite3_exec(sqlite3*,constchar*sql,int(*callback)(void*,0); background-color:inherit">,0); background-color:inherit">**,0); background-color:inherit">**),0); background-color:inherit">**errmsg);
这三个函数基本上能完成对sqlite3的所有操作。需要用的头文件为"sqlite3.h"。
- 打开(新建)数据库
- sqlite3*db;
- sqlite3_open("test.db"
- 关闭数据库
sqlite3_close(db);
- 执行sql语句(以创建表为例)
charsql[128];
- memset(sql,' 'sprintf(sql,"%s%s%s""createtable","test_tb""(idINTEGERPRIMARYKEY,dataTEXT)");
- sqlite3_exec(db,sql,NULL,NULL);
sqlite3_exec中第一个和第二个参数的意义很好理解。第三个参数是一个回调(callback)函数。第四个参数可用于给回调函数传入一个参数。第五个参数为这条sql语句执行后的返回。我试了好几次,第五个参数的返回值打印出来都是乱码,所以建议直接查看sqlite3_exec函数的返回指,它返回一个整型的数,可以通过这个数字来得知的执行结果。
下面给个例子来看回调函数是怎么执行的:查询数据库中的一张表,并把表中的内容写到文件中。
#include<stdio.h>
- #include<string.h>
- #include<sqlite3.h>
- *values:是查询结果的值
- *names:查询结果列的名字
- */
- wf_callback(*arg,0); background-color:inherit">nr,0); background-color:inherit">**values,0); background-color:inherit">**names)
- {
- i;
- FILE*fd;
- str[128];
- fd=(*)arg;for(i=0;i<nr;i++){memset(str,128);
- sprintf(str,"t%st"fwrite(str,153); background-color:inherit; font-weight:bold">sizeof(),0); background-color:inherit">(str),fd);
- }
- fwrite("n"//写完一条记录换行return0;main()
- {
- sql[128];
- sqlite3*db;
- //打开(或新建)一个数据库/*新建一张表*/strcpy(sql,"createtabletb(idINTEGERPRIMARYKEY,0); background-color:inherit">);
- /*新建一个文件,把数据库的查询结果保存在该文件中*/fd=fopen("test""w"fwrite("Result:n""select*fromtb"fclose(fd);
- sqlite3_close(db);0;
- }
编译、运行结果如下图:
我们关注这里的回调函数wf_callback()。sqlite3_exec()函数先执行sql语句,如果sql语句的执行结果不为空,则调用回调函数进行处理。test文件中有3行数据,所以wf_callback()函数被调用了三次(这里我们也可以在回调函数中添加一个全局变量来计数,以查看回调函数是否多次被调用)。因为回调函数会被多次调用,所以这里在main函数中打开文件,把文件描述符以参数的形式传递给回调函数;否则,将fopen和fclose写到回调函数中,每调用一次回调函数,回调函数都会以“w”去打开文件,第二次调用回调函数的结果会覆盖第一调用回调函数的结果,使写入文件的内容不正确(只会在文件中写入最后一条记录)。
如果在查询语句中调用了SQL中的一些函数,如sum()等,也可以同样用回调函数来处理查询结果,如:
strcpy(sql,"selectsum(id)fromtb");
- intresult;
- intsum_callback(void*arg,intnr,char**values,char**names)
- result=atoi(values[0]);
- return0;
- }
然后再对result进行处理。当然,也可以不定义这个全局变量,而直接在回调函数里对result进行处理。需要注意的是,查询结果均为字符数组形式的,所以如果需要的结果是int型或者float型,则需要相应的函数来转换,如atoi(),atof()等。
原文地址:http://www.linuxidc.com/Linux/2011-10/45920.htm
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!