• 使用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

    运行结果如下:

  • 相关阅读:
    git本地仓库基本使用(Repository)
    归途
    PowerDesigner逆向工程导入MYSQL数据库总结(转载)
    协程
    os.path.split 和 os.path.splitext
    转载)Linux平台下安装 python 模块包
    Java之map使用方法
    Java学习(JDBC java连接数据库)
    python -- 找出列表list中的重复元素
    JAVA打印变量类型
  • 原文地址:https://www.cnblogs.com/wurenzhong/p/8320947.html
Copyright © 2020-2023  润新知