zoukankan      html  css  js  c++  java
  • 使用c语言实现linux数据库的操作

    前言:上一篇讲解了linux下使用命令行操作数据库,这篇继续讲解怎么使用c语言实现linux数据库的操作。

    使用c语言实现环境搭建:既然我们要使用c语言实现linux数据库操作,那么首先我们得先把数据库源码的文件打包成库文件.so放到ubuntu函数库(/bin)目录下,并且把linux数据库sqlite中的.sh文件拷贝到/usr/include目录中。

    第一步:把.c文件生成.o文件

    gcc -fPIC -o sqlite3.o -c sqlite3.c -lpthread -ldl

    第二步:把.o文件生成.so文件

    gcc -shared -fPIC -o libsqlite3.so sqlite3.o -lpthread -ldl

    第三步:把生成的.so文件拷贝都ubuntu的/lib目录下,方便以后使用

    sudo cp libsqlite3.so /lib/

    第四步:把.sh文件拷贝到/usr/include/目录下,如果前面已经做过这一步了,可以不做

    sudo cp *.h /usr/include/ 

    到这里我们使用c语言实现linux数据库操作的环境就搭建好。

    下面我们来看看用c语言实现linux数据库操作要用到的几个主要的接口,当然我们还可以上sqlite的官网去看更多的API接口

    1、打开数据库

    int sqlite3_open(
      const char *filename,   /* 数据库名 ,如果数据库不在同一目录下请写上绝对路径*/
      sqlite3 **ppDb          /* 数据库句柄 */
    );

    返回值:成功:
    SQLITE_OK
    失败:SQLITE_ERROR
    
    

    2、执行操作指令(可实现回调查询,前提是第三个参数不能为空)

    int sqlite3_exec(
      sqlite3*,                                  /* 数据库句柄 */
      const char *sql,                           /* 执行的语句(执行的命令行) */
      int (*callback)(void*,int,char**,char**),  /* 回调函数(可设为NULL) */
      void *,                                    /* 1st argument to callback(可设为NULL) */
      char **errmsg                              /* 错误信息(可设为NULL)*/
    );
    返回值:成功:SQLITE_OK
    失败:SQLITE_ERROR

    3、回调函数查询(自定义实现)

    int callback(void*,int,char**,char**)
    参数:
    void* --由sqlite3_exec函数的第四个参数
    int---查询的数据有多少列
    char** ----每一列的值
    char**----每一列的名字

    4、非回调查询

    int sqlite3_get_table(
      sqlite3 *db,          /* 数据库句柄 */
      const char *zSql,     /* 查询指令 */
      char ***pazResult,    /* 存储查询到的结果 */
      int *pnRow,           /* 存储查询到的行数*/
      int *pnColumn,        /* 存储查询到的列数 */
      char **pzErrmsg       /* 存储错误信息 */
    );

    5、释放所占用空间

    void sqlite3_free_table(char **result);
    //result为调用了sqlite3_get_table后pazResult中的数据

    6、关闭表格

    int sqlite3_close(sqlite3*);

    下面是代码示例

      1 1 #include <sqlite3.h>
      2   2 #include <stdio.h>
      3   3 #include <string.h>
      4   4 
      5   5 /*定义此宏时使用回调函数查询,否则使用非回调函数查询*/
      6   6 #define CALLBACK
      7   7 
      8   8 //如果查询到多行数据, 那么这个函数就会调用多次(每一行调用一次)
      9   9 int callback(void *arg, int col, char **value, char **name)
     10  10 {
     11  11     int i=0;
     12  12     for(i=0;i<col; i++)
     13  13     {
     14  14         printf("%s	", value[i]);
     15  15     }
     16  16     printf("
    ");
     17  17     return 0;
     18  18 }
     19  19 
     20  20 
     21  21 int main(void)
     22  22 {
     23  23     //1.打开数据库
     24  24     sqlite3 *ppdb = NULL;
     25  25     int ret = sqlite3_open("./mysql.db", &ppdb); //打开一个当前目录下名为mysql.db的数据库
     26  26     if(ret != SQLITE_OK)
     27  27     {
     28  28         perror("open fail");
     29  29         return -1;
     30  30     }
     31  31     
     32  32     //执行sql语句,创建一个表格
     33  33     char *sql="create table IF not EXISTS myname(id integer primary key, name text)";
     34  34     ret = sqlite3_exec(ppdb, sql, NULL, NULL, NULL);
     35  35     if(ret != SQLITE_OK)
     36  36     {
     37  37         perror("create fail");
     38  38         sqlite3_close(ppdb);
     39  39         return -1;
     40  40     }
     41  41 
     42  42     //插入数据
     43  43     char name[32] ={0};
     44  44     int id = 0;
     45  45     while(1)
     46  46     {
     47  47         printf("please input name and id:"); scanf("%s %d", name, &id);
     48  48         if(id == 0)break; //输入q退出插入数据
     49  49         char *insert = "insert into myname values(%d, '%s')";
     50  50         char insql[strlen(insert) + strlen(name) + 5];
     51  51         sprintf(insql, insert, id, name);
     52  52 
     53  53         ret = sqlite3_exec(ppdb, insql, NULL, NULL, NULL);
     54  54         if(ret != SQLITE_OK)
     55  55         {
     56  56             perror("exec fail");
     57  57             sqlite3_close(ppdb);
     58  58             return -1;
     59  59         }
     60  60     }
     61  61 
     62  62 
     63  63     #ifdef CALLBACK
     64  64     //回调查询
     65  65     char *selectsql = "select * from myname";
     66  66     ret = sqlite3_exec(ppdb, selectsql, callback, NULL, NULL);
     67  67     if(ret != SQLITE_OK)
     68  68     {
     69  69         perror("create fail");
     70  70         sqlite3_close(ppdb);
     71  71         return -1;
     72  72     }
     73  73     
     74  74     //非回调查询
     75  75     #else
     76  76     char *sql2 = "select * from myname";
     77  77     char **result = NULL;
     78  78     int row = 0;
     79  79     int col = 0;
     80  80     char *error  = NULL;
     81  81     ret = sqlite3_get_table(ppdb,sql2,&result,&row,&col,&error);
     82  82     if(ret != SQLITE_OK)
     83  83     {
     84  84         perror("get table fail");
     85  85         return -1;
     86  86     }
     87  87     int i=0, j=0;
     88  88     for(i=0;i<row+1;i++)
     89  89     {
     90  90         for(j=0;j<col;j++)
     91  91         {
     92  92             printf("%s	",result[j+i*col]);
     93  93         }
     94  94         printf("
    ");
     95  95     }
     96  96     sqlite3_free_table(result);//释放结果
     97  97     #endif
     98  98     
     99  99 
    100 100     sqlite3_close(ppdb);
    101 101     return 0;
    102 102 }
    View Code

    编译代码:

    gcc -o mysqlite3 mysqlite3.c -lsqlite3

    先创建一个叫mysql.db的库

    sqlite3 mysql.db

    运行结果如下:

  • 相关阅读:
    node
    github
    [模块] pdf转图片-pdf2image
    python 15 自定义模块 随机数 时间模块
    python 14 装饰器
    python 13 内置函数II 匿名函数 闭包
    python 12 生成器 列表推导式 内置函数I
    python 11 函数名 迭代器
    python 10 形参角度 名称空间 加载顺序
    python 09 函数参数初识
  • 原文地址:https://www.cnblogs.com/wurenzhong/p/8320947.html
Copyright © 2011-2022 走看看