本文共 3466 字,大约阅读时间需要 11 分钟。
前言:上一篇讲解了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、打开数据库
intsqlite3_open(const char *filename, /*数据库名 ,如果数据库不在同一目录下请写上绝对路径*/sqlite3**ppDb /*数据库句柄*/);
返回值:成功:SQLITE_OK
失败:SQLITE_ERROR
2、执行操作指令(可实现回调查询,前提是第三个参数不能为空)
intsqlite3_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、非回调查询
intsqlite3_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
2 2 #include
3 3 #include
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
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 38sqlite3_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 51sprintf(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 57sqlite3_close(ppdb);58 58 return -1;59 59}60 60}61 61
62 62
63 63#ifdef CALLBACK64 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 70sqlite3_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
97 97 #endif
98 98
99 99
100 100sqlite3_close(ppdb);101 101 return 0;102 102 }
View Code
编译代码:
gcc -o mysqlite3 mysqlite3.c -lsqlite3
先创建一个叫mysql.db的库
sqlite3 mysql.db
运行结果如下:
转载地址:https://blog.csdn.net/weixin_34182361/article/details/112833909 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!