sqlite3

sqlite3的编程接口有很多。对于新手来说,我们只需要暂时掌握几个常用的功能,其他功能自然会知道怎么用。

sqlite3

数据库

本文假设数据库是my.db,有一个数据表student。

无名分4咬Linux 89.0

创建一个表语句,如下所示:

createtableifnotexistssstudent(nointegerprimarykey,nametext,score real);常用函数sqlite3 _ openintsqlite3 _ open(char * path,sqlite3 * * db);函数:打开sqlite数据库参数:path:数据库文件路径db:指向sqlite句柄的指针,后续对数据库的所有操作都依赖这个句柄返回值:0为成功,返回错误代码(非零值)SQLite3 _ close intsqlite3 _ close(SQLite3 * DB)为失败;功能:关闭sqlite数据库。返回值:0表示成功,const char * SQLite3 _ errmsg(SQLite3 * DB)表示失败;函数:打印错误信息返回值:返回错误信息,不使用回调函数执行SQL语句SQLite3 _ get _ tableintSQLite3 _ get _ table(SQLite3 * DB,Constchar * SQL,char * * Result,int * NROW,int * ncolumn,char * * ERMSG);函数:执行sql操作参数:db:数据库句柄sql:sql语句结果:用于指向SQL执行结果的指针nrow:满足条件的记录数ncolumn:每条记录包含的字段数errmsg:错误信息指针的地址返回值:0为成功,错误代码为失败。例如,如果我们想要显示student表中的所有数据信息,我们可以使用sqlite3_get_table()来执行该语句:

Select*fromstudent实现代码如下:

void do _ show _ sample(sqlite3 * db){ char * * result,* errmsgintnrow,ncolumn,I,j,indexif(sqlite3_get_table(db,& # 34;select * fromstudent & # 34,&result,&nrow,&ncolumn,&errmsg)!= 0){ printf(& # 34;错误:% s \ n & # 34,errmsg);sqlite3 _ free(errmsg);} index = ncolumnfor(I = 0;我& ltnrowi++){ for(j = 0;j & ltn列;j++){ printf(& # 34;%-8s:%-8s \ n & # 34;,result[j],result[index]);index++;} printf(& # 34;* * * * * * * * * * * * * * * * * * * * * * * \ n & # 34);}sqlite3_free_table(结果);返回;}假设当前表的数据信息如下:

无名分4 a Linux 77.0 5 a彭88.0 6 a王99.0 7 a网络66.0。

关于该函数中这些参数的具体含义,我们可以看到下图:

sqlite3的编程接口有很多。对于新手来说,我们只需要暂时掌握几个常用的功能,其他功能自然会知道怎么用。

数据库

本文假设数据库是my.db,有一个数据表student。

无名分4咬Linux 89.0

创建一个表语句,如下所示:

createtableifnotexistssstudent(nointegerprimarykey,nametext,score real);常用函数sqlite3 _ openintsqlite3 _ open(char * path,sqlite3 * * db);函数:打开sqlite数据库参数:path:数据库文件路径db:指向sqlite句柄的指针返回值:0表示成功,错误代码(非零值)SQLite 3 _ close intsqlite 3 _ close(SQLite 3 * DB)表示失败;功能:关闭sqlite数据库。返回值:0表示成功,const char * SQLite3 _ errmsg(SQLite3 * DB)表示失败;函数:打印错误信息返回值:返回错误信息,不使用回调函数执行SQL语句SQLite3 _ get _ tableintSQLite3 _ get _ table(SQLite3 * DB,Constchar * SQL,char * * Result,int * NROW,int * ncolumn,char * * ERMSG);函数:执行sql操作参数:db:数据库句柄sql:sql语句结果:用于指向SQL执行结果的指针nrow:满足条件的记录数ncolumn:每条记录包含的字段数errmsg:错误信息指针的地址返回值:0为成功,错误代码为失败。例如,如果我们想要显示student表中的所有数据信息,我们可以使用sqlite3_get_table()来执行该语句:

Select*fromstudent实现代码如下:

void do _ show _ sample(sqlite3 * db){ char * * result,* errmsgintnrow,ncolumn,I,j,indexif(sqlite3_get_table(db,& # 34;select * fromstudent & # 34,&result,&nrow,&ncolumn,&errmsg)!= 0){ printf(& # 34;错误:% s \ n & # 34,errmsg);sqlite3 _ free(errmsg);} index = ncolumnfor(I = 0;我& ltnrowi++){ for(j = 0;j & ltn列;j++){ printf(& # 34;%-8s:%-8s \ n & # 34;,result[j],result[index]);index++;} printf(& # 34;* * * * * * * * * * * * * * * * * * * * * * * \ n & # 34);}sqlite3_free_table(结果);返回;}假设当前表的数据信息如下:

无名分4 a Linux 77.0 5 a彭88.0 6 a王99.0 7 a网络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语句,是语句回调:回调函数errmsg:错误信息指针的地址返回值:成功返回0,失败返回错误码回调函数typedef int(* sqlite3 _ callback)(void * para,intf _ num,char * * f _ value,on。函数:每次找到记录时自动执行回调函数。参数:para:传递给回调函数的参数f_num:记录中包含的字段个数f_value:指针数组f_name:包含每个字段名称的指针数组。返回值:0表示成功,-1表示失败。比如sqlite3 * dbchar*errmsg,* * resultpintcallback(void*para,intf_num,char**f_val,char * * f _ name){ inti;for(I = 0;我& ltf _ numi++){ printf(& # 34;%-8s & # 34;,f _ val[I]);} printf(& # 34;\ n & # 34);return0} void do _ show(sqlite3 * db){ char * errmsg;printf(& # 34;nonamescore \ n & # 34);if(sqlite3_exec(db,& # 34;select * fromstudent & # 34,回调,空,&errmsg)!= 0){ printf(& # 34;错误:% s \ n & # 34,sqlite3 _ errmsg(db));} printf(& # 34;\ n & # 34);返回;}回调函数方法实现的代码,需要实现一个回调函数:callback。函数sqlite3_exec()解析命令& # 34;select * from学生& # 34;如果没有得到一行数据,就调用一次回调函数。参考上表学生。

Callback()总共会被调用五次,其中f_num对应结果的列数,3f_value是指由每列对应的值组成的字符串数组。假设现在第四次调用回调,如下所示:

运行结果

编译需要使用第三方库lsqlite3。

Gccstudent.c-orun-lsqlite3其他函数sqlite3*pdb,数据库句柄,非常类似于文件句柄文件sqlite3_stmt*stmt,相当于ODBC命令对象,用于保存编译后的SQL语句sqlite3_exec()。执行非查询sql语句sqlite3_prepare()时,准备sql语句,执行select语句或使用parameterbind时,使用此函数(封装sqlite3_exec)Sqlite3_step()。调用sqlite3_prepare后,使用该函数在记录集中移动。还有一系列用于从记录集字段获取数据的函数,例如

Sqlite3_column_text(),取文本类型sqlite3_column_blob()的数据,取blob类型sqlite3_column_int()的数据,取int类型数据的国际惯例,完成代码:

# include & ltstdio.h & gt# include & ltstdlib.h & gt# include & ltunistd.h & gt# include & ltsqlite3.h & gtvoid do _ insert(sqlite3 * db){ int no;charname[16];floatscorecharsqlstr[128],* errmsgprintf(& # 34;输入号码:& # 34;);scanf(& # 34;% d & # 34,&否);printf(& # 34;输入名称:& # 34;);scanf(& # 34;% s & # 34,姓名);printf(& # 34;inputscore:& # 34;);scanf(& # 34;% f & # 34,&分数);sprintf(sqlstr,& # 34;insertintostudentvalues(%d,& # 39;% s & # 39,% . 1f)& # 34;,没有,名字,分数);# if _ _ debug printf(& # 34;cmd:% s \ n & # 34;,sqlstr);#endifif(sqlite3_exec(db,sqlstr,NULL,NULL,&errmsg)!= 0){ printf(& # 34;错误:% s \ n & # 34,sqlite3 _ errmsg(db));} else { printf(& # 34;insertisdone \ n & # 34);} printf(& # 34;\ n & # 34);返回;} void do _ delete(sqlite3 * db){ char * errmsg;charsqlstr[128],表达式[64];printf(& # 34;input expression:& # 34;);scanf(& # 34;% s & # 34,表情);//name = & # 39;马& # 39;sprintf(sqlstr,& # 34;deletefromstudentwhere % s & # 34,表情);# if _ _ debug printf(& # 34;cmd:% s \ n & # 34;,sqlstr);#endifif(sqlite3_exec(db,sqlstr,NULL,NULL,&errmsg)!= 0){ printf(& # 34;错误:% s \ n & # 34,sqlite3 _ errmsg(db));} else { printf(& # 34;deletetisdone \ n & # 34);} printf(& # 34;\ n & # 34);返回;}intcallback(void*para,intf_num,char**f_val,char * * f _ name){ inti;for(I = 0;我& ltf _ numi++){ printf(& # 34;%-8s & # 34;,f _ val[I]);} printf(& # 34;\ n & # 34);return0} void do _ show(sqlite3 * db){ char * errmsg;printf(& # 34;nonamescore \ n & # 34);if(sqlite3_exec(db,& # 34;select * fromstudent & # 34,回调,空,&errmsg)!= 0){ printf(& # 34;错误:% s \ n & # 34,sqlite3 _ errmsg(db));} printf(& # 34;\ n & # 34);返回;} void do _ show _ sample(sqlite3 * db){ char * * result,* errmsgintnrow,ncolumn,I,j,indexif(sqlite3_get_table(db,& # 34;select * fromstudent & # 34,&result,&nrow,&ncolumn,&errmsg)!= 0){ printf(& # 34;错误:% s \ n & # 34,errmsg);sqlite3 _ free(errmsg);} index = ncolumnfor(I = 0;我& ltnrowi++){ for(j = 0;j & ltn列;j++){ printf(& # 34;%-8s:%-8s \ n & # 34;,result[j],result[index]);index++;} printf(& # 34;* * * * * * * * * * * * * * * * * * * * * * * \ n & # 34);}sqlite3_free_table(结果);返回;} int main(){ sqlite3 * db;intnchar clean[64];if(sqlite3 _ open(& # 34;my.db & # 34,& db)& lt;0){ printf(& # 34;failtosql ite 3 _ open:% s \ n & # 34;,sqlite3 _ errmsg(db));return-1;} while(1){ printf(& # 34;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n & # 34;);printf(& # 34;1:insert record \ N2:deleterecord \ n3:show record \ n4:quit \ n & # 34;);printf(& # 34;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n & # 34;);printf(& # 34;请选择:& # 34;);if(scanf(& # 34;% d & # 34,&n)!=1){fgets(clean,64,stdin);printf(& # 34;\ n & # 34);继续;} switch(n){ case 1:do _ insert(db);打破;情况二:do _ delete(db);打破;case 3:do _ show _ sample(db);打破;case 4:sqlite3 _ close(db);退出(0);} } return0}运行主页:

插入记录:

显示记录:

删除记录:

完整代码请关注微信官方账号的“Linux bite”

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

发表回复

登录后才能评论