zoukankan      html  css  js  c++  java
  • Linux C SQLite3 编程

    SQLite3

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

    1. Host System: Archlinux  
    2. gcc: 4.6.1 20110819  
    3. sqlite3: 3.7.8 20110919  

    系统一般没有默认安装sqlite数据库,所以先要安装sqlite3:

    1. # pacman -S sqlite3  
    可以使用"sqlite3 + 数据库名"来打开一个数据库。

    常用函数

    1. sqlite3_open(const char *filename, sqlite3 **ppDb);  
    2. sqlite3_close(sqlite3 *db);  
    3. sqlite3_exec(sqlite3*, const char *sql, int (*callback)(void*,int,char**,char**),  void *, char **errmsg);  

    这三个函数基本上能完成对sqlite3的所有操作。需要用的头文件为"sqlite3.h"。

    • 打开(新建)数据库
       
      1. sqlite3 *db;  
      2. sqlite3_open("test.db", &db);  
    • 关闭数据库
       
      1. sqlite3_close(db);  
    • 执行sql语句(以创建表为例)
       
      1. char sql[128];  
      2. memset(sql, '\0', 128);  
      3. sprintf(sql, "%s%s%s""create table ", "test_tb""(id INTEGER PRIMARY KEY, data TEXT)");  
      4. sqlite3_exec(db, sql, NULL, NULL, NULL);  
      sqlite3_exec中第一个和第二个参数的意义很好理解。第三个参数是一个回调(callback)函数。第四个参数可用于给回调函数传入一个参数。第五个参数为这条sql语句执行后的返回。我试了好几次,第五个参数的返回值打印出来都是乱码,所以建议直接查看sqlite3_exec函数的返回指,它返回一个整型的数,可以通过这个数字来得知的执行结果。

      下面给个例子来看回调函数是怎么执行的:查询数据库中的一张表,并把表中的内容写到文件中。
      1. #include <stdio.h>   
      2. #include <string.h>   
      3. #include <sqlite3.h>   
      4.   
      5. /* callback函数中: 
      6.  * arg: 是从主函数传进来的参数 
      7.  * values: 是查询结果的值 
      8.  * names: 查询结果列的名字 
      9.  */  
      10. int wf_callback(void *arg, int nr, char **values, char **names)  
      11. {  
      12.     int i;  
      13.     FILE *fd;  
      14.     char str[128];  
      15.     fd = (FILE *)arg; //将void *的参数强制转换为FILE *   
      16.     for (i=0; i<nr; i++) { //将查询结果写入到文件中   
      17.         memset(str, '\0', 128);  
      18.         sprintf(str, "\t%s\t", values[i]);  
      19.         fwrite(str, sizeof(char), sizeof(str), fd);  
      20.     }  
      21.     memset(str, '\0', 128);  
      22.     fwrite("\n"sizeof(char), 2, fd); //写完一条记录换行   
      23.     return 0;  //callback函数正常返回0   
      24. }  
      25.   
      26.   
      27. int main()  
      28. {  
      29.     char sql[128];  
      30.     sqlite3 *db;  
      31.     FILE *fd;  
      32.   
      33.     sqlite3_open("test.db", &db);  //打开(或新建)一个数据库   
      34.     memset(sql, '\0', 128);  
      35.     /* 新建一张表 */  
      36.     strcpy(sql, "create table tb(id INTEGER PRIMARY KEY, data TEXT)");  
      37.     sqlite3_exec(db, sql, NULL, NULL, NULL);  
      38.   
      39.     /* 新建一个文件,把数据库的查询结果保存在该文件中 */  
      40.     fd = fopen("test""w");  
      41.     fwrite("Result: \n"sizeof(char), 10, fd);  
      42.     memset(sql, '\0', 128);  
      43.     strcpy(sql, "select * from tb");  
      44.     sqlite3_exec(db, sql, wf_callback, fd, NULL);  
      45.     fclose(fd);  
      46.   
      47.     sqlite3_close(db); //关闭数据库   
      48.     return 0;  
      49. }  

      编译、运行结果如下图:



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

      如果在查询语句中调用了SQL中的一些函数,如sum()等,也可以同样用回调函数来处理查询结果,如:

      1. strcpy(sql, "select sum(id) from tb");  
      2. sqlite3_exec(db, sql, sum_callback, NULL, NULL);  
             则回调函数可以为:
      1. int result;  
      2. int sum_callback(void *arg, int nr, char **values, char **names)  
      3. {  
      4.         result = atoi(values[0]);  
      5.         return 0;  
      6. }  
      然后再对result进行处理。当然,也可以不定义这个全局变量,而直接在回调函数里对result进行处理。需要注意的是,查询结果均为字符数组形式的,所以如果需要的结果是int型或者float型,则需要相应的函数来转换,如atoi(),atof()等。

      原文地址:http://www.linuxidc.com/Linux/2011-10/45920.htm
  • 相关阅读:
    CentOS 5.5 安装 Oracle 11gR2 并随系统启动
    使用blockrecover 对有坏块的数据文件进行恢复
    用yum下载安装包
    PInvoke时候StringBuilder的陷阱
    mac:添加环境变量
    win8:metro app UI 设计
    用户体验&UI 实用小技巧
    Win8:To Do List Demo
    JavaScript语言精粹 ——笔记
    win8: 确保 WinJS.xhr 重新发送请求
  • 原文地址:https://www.cnblogs.com/bluestorm/p/2298127.html
Copyright © 2011-2022 走看看