各位老铁们,大家好,今天由我来为大家分享如何用C语言操作sqlite3,一篇文章看懂,以及的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!
数据库
本文假设数据库为my.db,并有数据表student。
无名分数4 Linux 89.0
创建表语句如下:
CREATETABLEIFNOTEXISTSstudent(nointegerprimarykey,nametext,scorereal);
常用函数
sqlite3_open
intsqlite3_open(char*path,sqlite3**db);功能:打开sqlite数据库参数:path:数据库文件路径db:指向sqlite句柄的指针,后面是数据库的所有操作都依赖于这个句柄。返回值:成功返回0,失败返回错误码(非零值)。
sqlite3_close
intsqlite3_close(sqlite3*db);功能:关闭sqlite数据库。返回值:成功返回0,失败返回error。代码constchar*sqlite3_errmsg(sqlite3*db);功能:打印错误信息返回值:返回错误信息
不使用回调函数执行SQL语句
sqlite3_get_table
intsqlite3_get_table(sqlite3*db,constchar*sql,char***resultp,int*nrow,int*ncolumn , char**errmsg);功能:执行SQL操作参数: db:数据库句柄sql:SQL语句resultp:用于指向sql执行结果的指针nrow:满足条件的记录数ncolumn:每条记录包含的字段数errmsg :地址错误消息指针的返回值:成功返回0,失败返回错误码
举例
。例如,如果我们想显示student表中的所有数据信息,我们可以使用sqlite3_get_table()执行语句:
select*fromstudent实现代码如下:
voiddo_show_sample(sqlite3*db){char**结果,*errmsg;intnrow,ncolumn,i,j,index;if(sqlite3_get_table(db,’select*fromstudent’,结果,nrow,ncolumn,errmsg)!=0){ printf(‘error:%s\n’,errmsg);sqlite3_free(errmsg);}index=ncolumn;for(i=0;inrow;i++){for(j=0;jncolumn;j++){printf(‘%- 8s:%-8s\n’,结果[j],结果[索引]);索引++;}printf(‘************************\ n’);}sqlite3_free_table(result);return;} 假设当前表的数据信息如下:
无名分数4 一Linux 77.0 5 一鹏88.0 6 一王99.0 7 一网络66.0
关于这个函数中出现的这些参数的具体含义,我们可以看下图:
sqlite3 编程接口有很多。对于初学者来说,我们只需要暂时掌握几个常用的功能,其他的功能自然就知道如何使用了。
数据库
本文假设数据库为my.db,并有数据表student。
无名分数4 Linux 89.0
创建表语句如下:
CREATETABLEIFNOTEXISTSstudent(nointegerprimarykey,nametext,scorereal);
常用函数
sqlite3_open
intsqlite3_open(char*path,sqlite3**db);功能:打开sqlite数据库参数: path:数据库文件路径db:指向sqlite句柄的指针返回值: 成功返回0,失败返回错误码(非零值)
sqlite3_close
intsqlite3_close(sqlite3*db);功能:关闭sqlite数据库返回值:成功返回0,失败返回错误码constchar*sqlite3_errmsg(sqlite3*db);功能:打印错误信息返回值: 返回错误信息
不使用回调函数执行SQL语句
sqlite3_get_table
intsqlite3_get_table(sqlite3*db,constchar*sql,char***resultp,int*nrow,int*ncolumn,char**errmsg);功能:执行SQL操作参数:db:数据库句柄sql:SQL语句resultp:用于指向sql执行结果的指针nrow:满足条件的记录数ncolumn:每条记录包含的字段数errmsg:地址错误信息指针返回值:成功返回0,失败返回错误码
举例
。例如,如果我们想要显示student表中的所有数据信息,我们可以使用sqlite3_get_table()来执行语句:
select*fromstudent实现代码如下:
voiddo_show_sample(sqlite3*db){char**结果,*errmsg;intnrow,ncolumn,i,j,index;if(sqlite3_get_table(db,’select*fromstudent’,结果,nrow,ncolumn,errmsg)!=0){ printf(‘error:%s\n’,errmsg);sqlite3_free(errmsg);}index=ncolumn;for(i=0;inrow;i++){for(j=0;jncolumn;j++){printf(‘%- 8s:%-8s\n’,结果[j],结果[索引]);索引++;}printf(‘************************\ n’);}sqlite3_free_table(result);return;} 假设当前表的数据信息如下:
无名分数4 一Linux 77.0 5 一鹏88.0 6 一王99.0 7 一网络66.0
关于这个函数中出现的这些参数的具体含义,我们可以看下图:
从上图可以看出: 代码中:
ncolumn=3nrow=5result 指向所有结果组成的字符串数组。图中标注了每个特定字符串的下标。结合这张图来理解代码,就很容易理解代码的实现原理了。
使用回调函数执行SQL语句
sqlite3_exec
typedefint(*sqlite3_callback)(void*,int,char**,char**);intsqlite3_exec(sqlite3*db,constchar*sql,sqlite3_callbackcallback,void*,char**errmsg);功能: 执行SQL操作参数: db:数据库句柄sql:SQL语句,就是前两章我们用来操作表的增、删、改、查询语句callback:回调函数errmsg:错误消息指针的地址返回值:成功返回0,失败返回错误码:010 -1010 typedefint(*sqlite3_callback)(void*para,intf_num,char**f_value,char**f_name);功能:每次找到记录时自动执行回调函数参数: para:传递给回调函数的参数f_num:记录包含的字段数量f_value:包含每个字段值的指针数组f_name:包含每个字段名称的指针数组返回值:成功返回0,失败返回-1
回调函数
sqlite3*db;char*errmsg, **resultp; intcallback(void*para,intf_num,char**f_val,char**f_name){inti;for(i=0;if_num;i++){printf(‘%-8s’,f_val[i]);}printf(‘ \n’);return0;}voiddo_show(sqlite3*db){char*errmsg;printf(‘nonamescore\n’);if(sqlite3_exec(db,’select*fromstudent’,callback,NULL,errmsg)!=0) {printf(‘error:%s\n’,sqlite3_errmsg(db));}printf(‘\n’);return;}回调函数方法实现的代码需要实现一个回调函数:callback。函数sqlite3_exec()解析命令select * from Student时,如果没有获取到一行数据,就会调用回调函数。参考上表学生。
callback() 总共会被调用5 次。 f_num 对应于结果中的列数。如果是3,f_value指向一个由每一列对应的值组成的字符串数组。假设现在第四次调用回调,如下所示:
举例
编译需要第三方库lsqlite3。
gccstudent.c-orun-lsqlite3
运行结果
sqlite3*pdb,数据库句柄,与文件句柄FILE sqlite3_stmt*stmt非常相似,这个相当于ODBC Command对象,用于保存编译好的SQL语句sqlite3_exec(),执行非query sql语句sqlite3_prepare(),在准备sql语句、执行select语句或者使用parameterbind时,使用该函数(封装sqlite3_exec)sqlite3_step()。调用sqlite3_prepare后,使用该函数进行记录集中的移动等一系列函数。用于从记录集字段获取数据,例如
sqlite3_column_text(),获取text类型数据sqlite3_column_blob(),获取blob类型数据sqlite3_column_int(),获取int类型数据国际惯例,完整代码如下:
#includestdio.h#includestdlib.h#includeunistd.h#includesqlite3.hvoiddo_insert(sqlite3*db){intno;charname[16];floatscore;charsqlstr[128],*errmsg;printf(‘inputno:’);scanf(‘% d’,否);printf(’inputname:’);scanf(’s’,名称);printf(’inputscore:’);scanf(’f’,分数);sprintf(sqlstr,’插入学生值(d, ‘%s’,%.1f)’,否,名称,分数);#if__DEBUGprintf(‘cmd:%s\n’,sqlstr);#endifif(sqlite3_exec(db,sqlstr,NULL,NULL,errmsg)!=0 ){printf(‘error:%s\n’,sqlite3_errmsg(db));}else{printf(‘insertisdone\n’);}printf(‘\n’);return;}voiddo_delete(sqlite3*db){char *errmsg;charsqlstr[128],表达式[64];printf(‘inputexpression:’);scanf(‘%s’,表达式);//name=’ma’sprintf(sqlstr,’deletefromstudentwhere%s’,表达式); #if__DEBUGprintf(‘cmd:%s\n’,sqlstr);#endifif(sqlite3_exec(db,sqlstr,NULL,NULL,errmsg)!=0){printf(‘error:%s\n’,sqlite3_errmsg(db)); }else{printf(‘deletetisdone\n’);}printf(‘\n’);return;}intcallback(void*para,intf_num,char**f_val,char**f_name){inti;for(i=0 ;if_num;i++){printf(‘%-8s’,f_val[i]);}printf(‘\n’);return0;}voiddo_show(sqlite3*db){char*errmsg;printf(‘nonamescore\n’ );if(sqlite3_exec(db,’select*fromstudent’,callback,NULL,errmsg)!=0){printf(‘error:%s\n’,sqlite3_errmsg(db));}printf(‘\n’);返回;}voiddo_show_sample(sqlite3*db){char**结果,*errmsg;intnrow,ncolumn,i,j,index;if(sqlite3_get_table(db,’select*fromstudent’,结果,nrow,ncolumn,errmsg)!=0){printf(‘error:%s\n’,errmsg);sqlite3_free(errmsg);}index=ncolumn;for(i=0;inrow;i++){for(j=0;jncolumn;j++){printf( ‘%-8s:%-8s\n’,结果[j],结果[索引]);index++;}printf(‘************************ ** **\n’);}sqlite3_free_table(结果);返回;}intmain(){sqlite3*db;intn;charclean[64];if(sqlite3_open(‘my.db’,db)0){printf( ‘failtosqlite3_open: %s\n’,sqlite3_errmsg(db));return-1;}while(1){printf(‘************************ ***** **********************\n’);printf(‘1:insertrecord\n2:deleterecord\n3:showrecord\n4:quit\n’);printf(‘ ****** **************************************\n’);printf( ‘请选择:’); if(scanf(‘%d’,n)!=1){fgets(clean,64,stdin);printf(‘\n’);继续;}switch(n){case1:do_insert(db);break;case2:do_delete( db);break;case3:do_show_sample(db);break;case4:sqlite3_close(db);exit(0);}}return0;}运行主页:
插入记录:
显示记录:
删除记录:
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/120755.html
用户评论
颓废i
一直想学习SQLite,但是没地方下手,这篇博客讲解的超详细,看完之后终于知道怎么用C语言操作SQLite了!
有11位网友表示赞同!
繁华若梦
之前学过一些Python数据库交互,感觉原理差不多吧,这个C语言的操作思路也挺清晰的。现在准备练习一下,看看能不能实战一把。
有16位网友表示赞同!
断秋风
对于新手来说,这篇文章讲解的太详细,有些概念还是不太能理解透彻。建议作者可以把文章分成几个小模块,这样更容易学习。
有8位网友表示赞同!
瑾澜
作者写得太专业了,我看半天一个关键词都找不到!作为C语言入门者,这些概念实在有点超出我的认知范围,希望能提供更通俗易懂的解释。
有16位网友表示赞同!
灬一抹丶苍白
这篇博客简直是我的福音啊!以前试过用其他语言操作SQLite3,感觉没那么方便好用。现在终于找到了适合C语言操作的方法,这下开发效率能大大提升了!
有9位网友表示赞同!
眉黛如画
文章很清晰地介绍了SQLite数据库的一些基础概念,比如打开数据库、创建表等等。而且还附带了代码示例,非常实用。
有18位网友表示赞同!
青衫故人
这个博客帮我解决了如何查询数据的问题,原来C语言操作也不至于那么困难啊。不过,插入数据的部分还需要再研究一下…
有7位网友表示赞同!
爱你心口难开
文章写的比较浅显,对于熟悉SQLite数据库结构的读者来说可能显得有些乏味。建议作者可以深入一些,讲解一下高级的操作技巧和常见的错误解决方法。
有20位网友表示赞同!
夏至离别
虽然我之前就有一些C语言基础,但还是学到了不少新知识!感谢作者分享这个宝贵的技术,以后开发项目肯定能派上用场!
有16位网友表示赞同!
一笑傾城゛
这篇文章的标题有点夸张了—“一文搞懂”感觉有点耸动。SQLite数据库确实比较简单,但是掌握熟练操作可能需要更多的学习和实践。
有6位网友表示赞同!
暖瞳
作者写的代码注释很详细,很容易理解。而且还提到了一些常见的错误处理方法,非常实用!
有18位网友表示赞同!
情如薄纱
这个博客给我启发了很多,我原来以为C语言只能用于系统编程,没想到还能用来操作数据库。需要好好学习一下SQLite3相关的知识了。
有10位网友表示赞同!
眼角有泪°
总感觉这种操作SQL的工具太笨拙了,不如直接用python或js实现更快更简洁。C语言的优势在这方面似乎不太明显。
有6位网友表示赞同!
(り。薆情海
这篇文章讲解的只是基础操作,如果想要进行更复杂的查询和数据处理,还需要学习更多高级知识。
有5位网友表示赞同!
淡写薰衣草的香
我觉得一个完整的教程需要包含更多的实例代码,例如如何处理复杂数据结构、实现事务控制等等。这样才能更好地帮助读者掌握C语言操作SQLite3的所有技巧。
有18位网友表示赞同!