Linux下c语言编程操作sqlite3数据库
1. 安装数据库
我们从sqlite官网下载页面,https://www.sqlite.org/download.html从源代码区下载 sqlite-autoconf-*.tar.gz。
然后在Linux下安装sqlite3
liguangming@ubuntu-14:~/sqlite$ wget https://www.sqlite.org/2021/sqlite-autoconf-3350500.tar.gz
liguangming@ubuntu-14:~/sqlite$ tar -xzvf sqlite-autoconf-3350500.tar.gz
liguangming@ubuntu-14:~/sqlite$ cd sqlite-autoconf-3350500/
liguangming@ubuntu-14:~/sqlite/sqlite-autoconf-3350500$ ./configure
liguangming@ubuntu-14:~/sqlite/sqlite-autoconf-3350500$ make
liguangming@ubuntu-14:~/sqlite/sqlite-autoconf-3350500$ sudo make install
liguangming@ubuntu-14:~/sqlite$ sqlite3
SQLite version 3.35.5 2021-04-19 18:32:05
Enter “.help” for usage hints.
Connected to a transient in-memory database.
Use “.open FILENAME” to reopen on a persistent database.
sqlite>
看到sqlite的版本则说明安装成功
2. 几个重要的 C&C++ / SQLite接口 API
2.1 **sqlite3_open(const char *filename, sqlite3 db)
函数作用:用来打开一个数据库
参数说明:第一个参数filename是数据库的名称
第二个参数db保存打开的数据库文件filename的信息
成功函数返回SQLITE_OK
2.2 *sqlite3_exec(sqlite3 db, const char *sql, sqlite_callback, void *data, char errmsg)
函数作用:用来执行sql语句
参数说明:第一个参数db 是打开的数据库对象
第二个参数是要执行的语句
第三个参数 sqlite_callback 是一个回调函数 ,这条语句执行之后会调用这个sqlite_callback 函数
第四个是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回
调函数,可以填NULL。
第五个参数errmsg 将被返回用来获取程序生成的任何错误。
成功函数返回SQLITE_OK
2.3 *sqlite_callback (void * arg,int f_num,char * * f_value, char * f_name)
函数功能:用户处理的查询结果
参数说明:第一个参数arg是sqlite3_exec传入的参数指针
第二个参数f_num是记录中包含的字段数目
第三个参数f_value是包含字段值的指针数值
第四个参数f_name是包含每个字段名称的指针数组
成功返回SQLITE_OK
2.4 sqlite3_close(sqlite3 db)*
函数作用:关闭数据库
参数说明:db为要关闭的数据库文件
成功函数返回SQLITE_OK
2.5 **int sqlite3_get_table(sqlite3 *db, const char *zsql,char ***pazResult, int *nrow, int *ncolumn,char zErrmsg);
函数作用:执行sql查询功能
参数说明:第一个参数db:db是用于保存打开的数据库文件dbname的信息;
第二个参数:sqlite3的语句,跟sqlite3_exec里的sql是一样的,是一个很普通的以\0结尾的char *字符串。
第三个参数:查询的结果,它依然是一维数组,他的内存布局时:字段名称,后面时紧接着是每个字段值。
第四个参数:是查询出多少条记录(即查出是多少行,不包括字段名那行)
第五个参数:是多少个字段(多少列)
第六个参数:是错误信息
3 创建一个简单的学生成绩数据库并实现简单的添加,查询,删除,更新,退出功能
代码如下
#include<stdio.h>
#include<stdlib.h>
#include<sqlite3.h>
int do_insert(sqlite3 *db) //添加函数
{
int stuid;
char name[32];
int score;
char sql[512];
char * errmsg;
printf("please input stuid:");
scanf("%d",&stuid);
printf("please input name:");
scanf("%s",name);
printf("please input score:");
scanf("%d",&score);
sprintf(sql,"insert into stu values(%d,'%s',%d);",stuid,name,score);
if( sqlite3_exec(db,sql,NULL,NULL,&errmsg) !=SQLITE_OK )
{
printf("input values failed:%s\n",errmsg);
}
else
{
printf("Input success\n");
}
return 0;
}
int callback(void *arg, int num, char **value,char **name) //回调函数
{
int i=0;
for(i=0; i<num; i++)
{
printf("%-16s",value[i]);
}
printf("\n");
return 0;
}
int do_query(sqlite3 *db) //查询函数
{
char sql[512];
char * errmsg;
sprintf(sql,"select * from stu");
if( sqlite3_exec(db,sql,callback,NULL,&errmsg) !=SQLITE_OK )
{
printf("query failed:%s\n",errmsg);
}
else
{
printf("query success\n");
}
return 0;
}
int do_delete(sqlite3 *db) //删除函数
{
int stuid;
char sql[512];
char * errmsg;
printf("please input stuid to be deleted:");
scanf("%d",&stuid);
sprintf(sql,"delete from stu where stuid=%d",stuid);
if( sqlite3_exec(db,sql,NULL,NULL,&errmsg) !=SQLITE_OK )
{
printf("delete failed:%s\n",errmsg);
}
else
{
printf("delete success\n");
}
return 0;
}
int do_update(sqlite3 *db) //更新函数
{
int stuid;
int score;
char sql[512];
char * errmsg;
printf("please input stuid to be changed:");
scanf("%d",&stuid);
printf("update score:");
scanf("%d",&score);
sprintf(sql,"update stu set score=%d where stuid = %d",score,stuid);
if( sqlite3_exec(db,sql,NULL,NULL,&errmsg) !=SQLITE_OK )
{
printf("update failed:%s\n",errmsg);
}
else
{
printf("update success\n");
}
return 0;
}
int main(int argc, char **argv)
{
sqlite3 * db;
char * dbname="stu.db";
char * errmsg;
int cmd;
if( sqlite3_open(dbname,&db) != SQLITE_OK)
{
printf("stu.db create failed:%s\n ",sqlite3_errmsg(db));
return -1;
}
else
{
printf("Open stu.db success\n");
}
// 创建一张数据库的表格
if(sqlite3_exec(db,"create table stu (stuid Integer , name char ,score Intege);",NULL,NULL,&errmsg) != SQLITE_OK)
{
printf("create table failed:%s\n",errmsg);
}
else
{
printf("create table success\n");
}
while(1)
{
printf("##########################################\n");
printf("1:insert 2:query 3:delete 4:update 5:quit\n");
printf("##########################################\n");
printf("please input cmd:");
scanf("%d",&cmd);
switch(cmd)
{
case 1:
do_insert(db);
break;
case 2:
do_query(db);
break;
case 3:
do_delete(db);
break;
163,1-8 88%
break;
case 4:
do_update(db);
break;
case 5:
sqlite3_close(db);
exit(0);
default:
printf("cmd error\n");
}
}
}
编译时要加上-lsqlite3,不然会报错
查看当前目录下的后缀名为.db的文件就是创建好的数据库
运行结果:
添加数据
查询结果
删除数据
更改数据
sqlite的进一步学习可以参考这个链接https://www.runoob.com/sqlite/sqlite-intro.html