前言:上一篇讲解了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 }
编译代码:
gcc -o mysqlite3 mysqlite3.c -lsqlite3
先创建一个叫mysql.db的库
sqlite3 mysql.db
运行结果如下: