一、Linux中数据库的增删改查
1)增加
① 代码
int do_insert(sqlite3 *db)
{
//输入要插入的数据
int id;
char name[20]="";
float score;
printf("请输入id>>> ");
scanf("%d",&id);
getchar();
printf("请输入name>>> ");
scanf("%s",name);
getchar();
printf("请输入score>>> ");
scanf("%f",&score);
getchar();
//将输入的数据与sql命令拼接起来
char sql[128]="";
sprintf(sql,"insert into stu values(%d,\"%s\",%g)",id,name,score);
//执行命令
char *errmsg = NULL;
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"__%d__sqlite3_exec:%s\n",__LINE__,errmsg);
return -1;
}
printf("insert into stu success \n");
return 0;
}
② 效果
2)删除
① 代码
② 效果
3)修改
① 代码
② 效果
4)查询
① 代码(2种方法)
int select_callBack(void* arg,int column,char **column_text,char **column_name)
{
//查询结果的列数
//printf("column= %d __%d__\n",column,__LINE__);
//表头
if(0 == *(int*)arg)
{
for(int i=0;i<column;i++)
{
printf("%s\t",column_name[i]);
}
putchar(10);
*(int *)arg=1;
}
//查询到的内容
for(int i=0;i<column;i++)
{
printf("%s\t",column_text[i]);
}
putchar(10);
return 0;
//该返回值返回给sqlite3_exec,若不返回0,
//则会让sqlite3_exec函数认为当前函数执行失败,
//从而导致sqlite3_exec函数执行失败
}
/*
//查询
int do_select(sqlite3 *db)
{
char sql[128]="select * from stu";
char *errmsg = NULL;
int flag=0;
if(sqlite3_exec(db,sql,select_callBack,&flag,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"__%d__sqlite3_exec:%s\n",__LINE__,errmsg);
return -1;
}
printf("select stu success \n");
}
*/
//查询
int do_select(sqlite3 *db)
{
char sql[128]="select * from stu";
char** pres=NULL;
int row,column;
char *errmsg = NULL;
if(sqlite3_get_table(db,sql,&pres,&row,&column,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"__%d__sqlite3_exec:%s\n",__LINE__,errmsg);
return -1;
}
printf("select stu success \n");
printf("row=%d column=%d\n",row,column);
//结果中包含表头的那一行,所以打印的时候要+1
for(int i =0;i<(row+1)*column;i++)
{
printf("%s\t",pres[i]);
if((i+1)%column == 0)
putchar(10);
}
printf("==================\n");
int index = 0;
for(int i=0;i<row+1;i++)
{
for(int j=0;j<column;j++)
{
printf("%s\t",pres[i*column+j]);
}
putchar(10);
}
//释放查询到的结果
sqlite3_free_table(pres);
return 0;
}
② 效果
5)总代码
① 代码
② 效果
二、字典dict.txt上传到数据库中
① 代码
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sqlite3.h>
int do_insert(sqlite3 *db,char *word,char *mean);
int main(int argc, const char *argv[])
{
//以读的方式打开文件
FILE* fp=fopen("./dict.txt","r");
if(NULL == fp)
{
perror("fopen");
return -1;
}
printf("fopen success\n");
//创建并打开一个数据库
sqlite3 *db = NULL;
if(sqlite3_open("./dict.db",&db) != SQLITE_OK)
{
fprintf(stderr,"sqlite3_open:%s %d __%d__\n",\
sqlite3_errmsg(db),sqlite3_errcode(db),__LINE__);
return -1;
}
printf("open database my.db success\n");
//创建一个表格 create table dict(word char,mean char);
//数据库中sql语句怎么写 这里就怎么写
char sql[128] = "create table if not exists dict(word char,mean char)";
char *errmsg = NULL;
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"sqlite3_exec:%s %d __%d__\n",errmsg,sqlite3_errcode(db
return -1;
}
printf("create table dict success\n");
//定义存放数据的数组
char buf[128]="";
char word[64]="";
char mean[64]="";
char *res=NULL;
while(1)
{
bzero(buf,sizeof(buf));
bzero(word,sizeof(word));
bzero(mean,sizeof(mean));
res=fgets(buf,sizeof(buf),fp);
if(NULL == res)
{
printf("读取完毕\n");
break;
}
char *p=buf;
char *wordp=word;
char *meanp=mean;
while(*p !=' ' || *(p+1) != ' ')
{
if(*p=='\'')
{
*wordp++ ='\'';
p++;
continue;
}
*wordp++ = *p++;
//printf("%c\n",*p);
}
while(*p ==' ')
p++;
while(*p!='\n')
{
*meanp++ = *p++;
}
do_insert(db,word,mean);
}
//关闭数据库
if(sqlite3_close(db) != SQLITE_OK)
{
fprintf(stderr,"sqlite3_close:%s %d __%d__\n",\
sqlite3_errmsg(db),sqlite3_errcode(db),__LINE__);
return -1;
}
printf("close database my.db success\n");
return 0;
}
int do_insert(sqlite3 *db,char *word,char *mean)
{
char sql[128]="";
sprintf(sql,"insert into dict values(\"%s\",\"%s\")",word,mean);
//执行命令
char *errmsg = NULL;
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"__%d__sqlite3_exec:%s\n",__LINE__,errmsg);
return -1;
}
printf("insert into dict success \n");
return 0;
}