SQLite数据库编程
转载自:http://www.linuxidc.com/Linux/2011-10/45920.htm SQLite是一个轻量级的数据库。和常用的MySQL大同小异。和MySQL相比,数据类型基本一样,只是sqlite的指令都是以”.”开头(如:mysql中查看当前有哪些数据库是“show databases”,而sqlite中是”.databases”)。当然,SQL语句都是一样的语法规则。 # pacman -S sqlite3
可以使用”sqlite3 + 数据库名”来打开一个数据库。 常用函数sqlite3_open(const char *filename,sqlite3 **ppDb);
sqlite3_close(sqlite3 *db);
sqlite3_exec(sqlite3*,const char *sql,int (*callback)(void*,int,char**,char**),void *,char **errmsg);
这三个函数基本上能完成对sqlite3的所有操作。需要用的头文件为”sqlite3.h”。 打开(新建)数据库sqlite3 *db;
sqlite3_open("test.db",&db);
关闭数据库sqlite3_close(db);
执行sql语句(以创建表为例)char sql[128];
memset(sql,' ',128);
sprintf(sql,"%s%s%s","create table ", "test_tb","(id INTEGER PRIMARY KEY,data TEXT)");
sqlite3_exec(db,sql,NULL,NULL);
sqlite3_exec中第一个参数为数据库标识符,第二个参数为SQL命令字符串,第三个参数是一个回调(callback)函数,第四个参数可用于给回调函数传入一个参数,第五个参数为这条sql语句执行后的返回。 下面给个例子来看回调函数是怎么执行的:查询数据库中的一张表,并把表中的内容写到文件中。 #include <stdio.h>
#include <string.h>
#include <sqlite3.h>
/* callback函数中: * arg: 是从主函数传进来的参数 * values: 是查询结果的值 * names: 查询结果列的名字 */
int wf_callback(void *arg,int nr,char **values,char **names)
{
int i;
FILE *fd;
char str[128];
fd = (FILE *)arg; //将void *的参数强制转换为FILE *
for (i=0; i<nr; i++)
{
//将查询结果写入到文件中
memset(str,128);
sprintf(str,"t%st",values[i]);
fwrite(str,sizeof(char),sizeof(str),fd);
}
memset(str,128);
fwrite("n",2,fd); //写完一条记录换行
return 0; //callback函数正常返回0
}
int main()
{
char sql[128];
sqlite3 *db;
FILE *fd;
sqlite3_open("test.db",&db); //打开(或新建)一个数据库
memset(sql,128);
/* 新建一张表 */
strcpy(sql,"create table tb(id INTEGER PRIMARY KEY,data TEXT)");
sqlite3_exec(db,NULL);
/* 新建一个文件,把数据库的查询结果保存在该文件中 */
fd = fopen("test","w");
fwrite("Result: n",10,fd);
memset(sql,128);
strcpy(sql,"select * from tb");
sqlite3_exec(db,wf_callback,fd,NULL);
fclose(fd);
sqlite3_close(db); //关闭数据库
return 0;
}
编译、运行结果如下图: 如果在查询语句中调用了SQL中的一些函数,如sum()等,也可以同样用回调函数来处理查询结果,如: strcpy(sql,"select sum(id) from tb");
sqlite3_exec(db,sum_callback,NULL,NULL);
则回调函数可以为: int result;
int sum_callback(void *arg,char **names)
{
result = atoi(values[0]);
return 0;
}
然后再对result进行处理。当然,也可以不定义这个全局变量,而直接在回调函数里对result进行处理。需要注意的是,查询结果均为字符数组形式的,所以如果需要的结果是int型或者float型,则需要相应的函数来转换,如atoi(),atof()等。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 在C中将字符串转换为long long
- Flex中ByteArray与BitmapData互相转换实现图片的二进制保存
- Ruby删除Case语句中的隐式break? (如何制作像Switch这样的
- c# – RestSharp:无法创建SSL / TLS安全通道
- qt5.5程序打包发布以及依赖
- ruby-on-rails – 使用STI model_name解决方法的弃用警告
- swift – ARKit:将SCNText放置在相机前面的特定位置
- 大数据容器—Nosql数据库与传统RDBMS数据库
- c# – 添加导航:Frame导致NullReferenceException
- HDU 6140 Hybrid Crystals(思考+上下界)