用C语言实现Linux下的sqlite3数据库操作

最近在写一个多人聊天室程序,想用数据库管理用户名密码等数据,一开始想用的是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)是不包括列名那一行的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值