加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

SQLite数据库编程

发布时间:2020-12-12 23:46:51 所属栏目:百科 来源:网络整理
导读:转载自:http://www.linuxidc.com/Linux/2011-10/45920.htm SQLite是一个轻量级的数据库。和常用的MySQL大同小异。和MySQL相比,数据类型基本一样,只是sqlite的指令都是以”.”开头(如:mysql中查看当前有哪些数据库是“show databases”,而sqlite中是”.

转载自:http://www.linuxidc.com/Linux/2011-10/45920.htm

SQLite是一个轻量级的数据库。和常用的MySQL大同小异。和MySQL相比,数据类型基本一样,只是sqlite的指令都是以”.”开头(如:mysql中查看当前有哪些数据库是“show databases”,而sqlite中是”.databases”)。当然,SQL语句都是一样的语法规则。
系统一般没有默认安装sqlite数据库,所以先要安装sqlite3:

# 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;  
}

编译、运行结果如下图:

我们关注这里的回调函数wf_callback()。sqlite3_exec()函数先执行sql语句,如果sql语句的执行结果不为空,则调用回调函数进行处理。test文件中有3行数据,所以wf_callback()函数被调用了三次(这里我们也可以在回调函数中添加一个全局变量来计数,以查看回调函数是否多次被调用)。因为回调函数会被多次调用,所以这里在main函数中打开文件,把文件描述符以参数的形式传递给回调函数;否则,将fopen和fclose写到回调函数中,每调用一次回调函数,回调函数都会以“w”去打开文件,第二次调用回调函数的结果会覆盖第一调用回调函数的结果,使写入文件的内容不正确(只会在文件中写入最后一条记录)。

如果在查询语句中调用了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()等。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读