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

运行结果如下:

原文地址:https://www.cnblogs.com/wurenzhong/p/8320947.html