最近在写一个多人聊天室程序,想用数据库管理用户名密码等数据,一开始想用的是mysql,最后还是选择比较轻量的sqlite3数据库。在这篇博客里我想记录一下在终端和用C语言操作sqlite3数据库的基本方法。
终端操作
1.创建数据库文件
sqlite3 databasename.db
直接在终端输入即可,这个命令会打开对应的数据库文件,如果文件不存在会创建这个文件。
2.创建表
创建表及后面的一些操作都需要在打开数据库的界面进行,也就是运行上面那个命令后进入的界面。
创建表:create table client(usrname varchar(20),password varchar(20);
该操作创建了一个名为client的表,含有两列,分别是用户名和密码。创建表的时候还可以给对应列加上限定字,比如NOT NULL等。分号是必须的。
3.向表插入一组数据
insert into client values("str1","str2");
向名为client的表中插入一组数据
4.查看表
select * from client where ......;
where 后面是一些限定词,缩小查找范围;*表示全部,当然也可以按需求换成列名等。
4.其他操作
.tables
:查看当前数据库有哪些表,前面带点的似乎不用分号了;
.exit
: 退出
C语言操作
c语言操作的命令与终端操作很是相似,对于一般的命令,如创建表,用exec函数直接执行即可,但是对于有返回结果的,比如查询表的内容,就需要回调函数,或者用get_table函数,总之要有办法去储存查询结果。为了使用方便可以把常用的操作封装成函数。
1.打开数据库
//打开数据库
int sql_ret_open=1;
sql_ret_open = sqlite3_open("./data.db", &db);//打开数据库
if(sql_ret_open!=0){
fprintf(stderr, "打开数据库失败,%s\n", sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);//只要调用exit,整个程序就结束
}
注意SQLITE3_OK=0
2.插入操作
//向数据库中的client表插入一项:用户名-密码
int sql_insert_usr(sqlite3 *sql_db, char* usrname,char* password){
char cmd[100];
memset(cmd, 0, sizeof(cmd));//初始数组内容
sprintf(cmd,"insert into client values(\"%s\",\"%s\");",usrname,password);
printf("%s\n",cmd);
int ret = sqlite3_exec(sql_db,cmd,NULL,NULL,NULL);
return ret;
}
3.查询操作
//返回一个用户名存在的条数,用于检查用户名是否已经存在
int sql_usrname_is_exist(sqlite3 *sql_db,char* usrname){
char cmd[100];//同查询函数
int row,col,ret;
char **res=NULL;
memset(cmd, 0, sizeof(cmd));//初始命令数组内容
sprintf(cmd,"select usrname from client where usrname like '%s';",usrname);
sqlite3_get_table(sql_db,cmd,&res,&row,&col,NULL);
ret=row;
sqlite3_free_table(res);
return row;
}
//查询数据库中的client表中的usrname字段,返回其密码
char* sql_query_usr(sqlite3 *sql_db,char* usrname){
char cmd[100];
int row,col;//分别表示查询结果的行数和列数,其中行数不包括列名
char **res=NULL;//查询结果保存的地方,类似于string数组,结构是一维的,抽象来看是查询结果按行排列(包括列名)
memset(cmd, 0, sizeof(cmd));//初始命令数组内容
sprintf(cmd,"select password from client where usrname like '%s';",usrname);
sqlite3_get_table(sql_db,cmd,&res,&row,&col,NULL);
if(row>0){
int len=strlen(*(res+1));
char* ret = (char*)malloc(len*sizeof(char));//分配堆空间,防止函数结束被释放
ret = *(res+1);
sqlite3_free_table(res);
return ret;
}
else
{
printf("查询数据为空\n");
sqlite3_free_table(res);
return NULL;
}
}
在查询操作中,用到的sqlite3_get_table函数有几个参数,分别表示查询结果(res)及其行数(row)、列数(col)。
注意查询结果是一个“字符串数组”,其结构是查询结果按行拼接,且第一行是列名。但行数(row)是不包括列名那一行的。