在学习完tcp通信之后又了解了sqlite3的的功能,以及c语言中sqlite3的使用方法,接下来我将介绍c语言中sqlite3的使用方法。
首先需保证机器上已经有SQLITE库,下图是在虚拟机上安装过程
安装好SQLITE库后就可以使用sqlite命令语句。例如:
1.sqlite3_open
2sqlite3_exec
3.sqlite3_get_table
4.sqlite_close
学会使用这些语句,就可以写一个简单的学生库,存有学生的id、姓名、成绩,以及对这些数据的增删改查。以下是我自己写程序,供大家参考。
#include
#include
#include
#include
//数据库保存学生的信息
#define N 20
typedef struct student
{
int id;
char name[N];
float score;
}stu;
void menu(void)
{
printf("1----------insert\n");
printf("2----------select\n");
printf("3----------update\n");
printf("4----------delete\n");
printf("-1-----------exit\n");
}
//编写子函数,实现打开数据库和创建表
//参数1:数据库名 char * 参数2:表名
//返回值:打开数据库连接对象
sqlite3 * sql_open(char * dbname)
{
sqlite3 * db = NULL;
//1.打开数据库 test.db
//参数1:数据库的名称 参数2:sqlite3 **通过入参的形式将数据库的连接对象给db
int rc = sqlite3_open(dbname,&db);
if(rc != SQLITE_OK) //SQLITE_OK 为0
{
perror("sqlite3 open error");
return NULL;
}
printf("sqlite3 open ok\n");
return db;
}
int create_table(sqlite3 *db,char *tbname)
{
//创建表 stu
char sql[100] = {'\0'};
sprintf(sql,"create table %s (id int primary key not null,name text,score float)",tbname);
printf("%s\n",sql);
//参数1:sqlite3 *
//参数2:sql语句
//参数3和4NULL
//参数5:char ** errmsg
char * errmsg = NULL;
int rc = sqlite3_exec(db,sql,NULL,NULL,&errmsg);
if(rc != SQLITE_OK)
{
if(strcmp(errmsg,"table stu already exists") != 0 )
{
printf("%s\n",errmsg);
return -1;
}
}
printf("create ok\n");
return 0;
}
//编写子函数,给数据库中插入
//参数1:数据库连接对象
//参数2:表名
//返回值:成功返回0,失败返回-1
int insert_data(sqlite3 * db,char * tbname)
{
stu s1 = {1,"zhangsan",89};
printf("请输入学生的信息\n");
scanf("%d%s%f",&s1.id,s1.name,&s1.score);
char sql[100] = {'\0'};
sprintf(sql,"insert into %s values(%d,'%s',%.1f)",tbname,s1.id,s1.name,s1.score);
printf("%s\n",sql);
int rc = 0;
char *errmsg = NULL;
rc = sqlite3_exec(db,sql,NULL,NULL,&errmsg);
if(rc != SQLITE_OK)
{
perror("insert error");
return -1;
}
printf("insert ok\n");
return 0;
}
//函数功能:查询的回调函数
//参数1:void * data给回调函数传递的参数
//参数2:int colum_num记录中包含的子段数目(几列就是几)
//参数3:char ** // char * colum_value[]
//参数4:char ** //char colum_name[]
int callback(void * data,int colum_num,char * colum_value[],char * colum_name[])
{
int i = 0;
stu s1;
memset(&s1,'\0',sizeof(s1));
s1.id = atoi(colum_value[0]);
strcpy(s1.name,colum_value[1]);
s1.score = atof(colum_value[2]);
printf("%5d%10s%7.1f\n",s1.id,s1.name,s1.score);
printf("\n");
return 0;
}
//函数功能:查看元素
//参数1:数据库连接对象sqlite3 *db
//参数2:表名 char *tbname
//返回值:成功返回0,失败返回-1
int select_data(sqlite3 *db,char * tbname)
{
char sql[100] = "select * from stu";
sprintf(sql,"select *from %s",tbname);
char * errmsg = NULL;
//参数1:连接对象sqlite3 *db
//参数2:sql语句
//参数3:回调函数 函数的指针 //select
//参数4:给回调函数传参
int ret = sqlite3_exec(db,sql,callback,NULL,&errmsg);
if(ret != SQLITE_OK)
{
fprintf(stderr,"select error:%s\n",errmsg);
return -1;
}
printf("select ok!\n");
return 0;
}
//函数功能:从数据库更改元素内容
//参数1:数据库连接对象sqlite3 *db
//参数2:表名 char * tbname
//参数3:学号 float score
//参数4:姓名 char * name
//返回值: 更新成功返回0,失败返回-1
int update_data(sqlite3 * db,char *tbname,float score,char * name)
{
char sql[50] = "update stu set score = 96 where name = 'zhangsan'";
sprintf(sql,"update %s set score = %.1f where name = '%s'",tbname,score,name);
printf("%s\n",sql);
//参数1:sqlite3 * db
//参数2:sql语句
//参数3:NULL
//参数4:NULL
char * errmsg = NULL;
//参数5:char ** errmsg;
int rc = sqlite3_exec(db,sql,NULL,NULL,&errmsg);
if(rc != SQLITE_OK)
{
perror("update error");
return -1;
}
printf("update ok\n");
return 0;
}
//函数功能:从数据库删除元素
//参数1:数据库连接对象sqlite3 *db
//参数2:表名 char * tbname
//参数3:学号 int id
//返回值:删除成功返回0,失败返回-1
int delete_data(sqlite3 * db,char * tbname,int id)
{
char sql[50] = "delete from stu where id = 1";
sprintf(sql,"delete from %s where id = %d",tbname,id);
printf("%s\n",sql);
//参数1:sqlite3 * db
//参数2:sql语句
//参数3:NULL
//参数4:NULL
char * errmsg = NULL;
//参数5:char ** errmsg;
int rc = sqlite3_exec(db,sql,NULL,NULL,&errmsg);
if(rc != SQLITE_OK)
{
perror("delete error");
return -1;
}
printf("delete ok\n");
return 0;
}
int main(void)
{
sqlite3 * db;
int id;
float score;
char tbname[20] = "stu";
char name[10] = {'\0'};
//1.打开数据库并创建表
db = sql_open("test.db");
create_table(db,tbname);
//对表进行insert select delete update
int op = 0;
while(1)
{
menu();
printf("请输入选项\n");
scanf("%d",&op);
if(op == -1)
break;
switch(op)
{
case 1:
insert_data(db,"stu");
break;
case 2:
printf("请输入想查询的表名\n");
scanf("%s",tbname);
select_data(db,tbname);
break;
case 3:
printf("请输入表名及修改后的成绩和想修改人的姓名\n");
scanf("%s",tbname);
scanf("%f",&score);
scanf("%s",name);
update_data(db,tbname,score,name);
break;
case 4:
printf("请输入想删除的表名和学号\n");
scanf("%s",tbname);
scanf("%d",&id);
delete_data(db,tbname,id);
break;
}
}
return 0;
}