sqlite3-使用总结包含回调函数_第1页
sqlite3-使用总结包含回调函数_第2页
sqlite3-使用总结包含回调函数_第3页
sqlite3-使用总结包含回调函数_第4页
sqlite3-使用总结包含回调函数_第5页
免费预览已结束,剩余14页可下载查看

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3用总前序 一、版 二、基本编 三、操作入 基本流 SQL语句操 操作二进 事务处 四、给数据库加 五、后 前序3的确很好用。小巧、速度快。但是因为非微软的产品,对3的研究列出来,以备忘记。这里要注明我是一个跨平台专注者并不喜欢只用windows然没有验证,但是我已尽量不使用任何windows的东西,只使用标准C或标准C++。但是,我没有尝试过在别的系统、别的编译器下下面我的代码仍然用VC写,因为我觉得VC一个很不错IDE,可以加快代码编写速度(例如配合Vassist)。下面我所说编译环境,是VC2003。如果读者觉得自己习惯于unix下用vi编因为我用的是标准C或C++。不会给任何人带来不便。一 版 可到的代码和编译版本。我写此文章时,代码是3.3.17版本。很久没有去新代码因此也不知道变化这么大。以前很多文件,现在全部合并成一个3.c文件。如果是也带来一个问题:此文件太大,快接近7行代码,VC它整个编辑器来编辑,例如UltraEdit或Notepad。速度会快很多。二 基本编这个不想多说了,在VC新建dos制台空白工程,3.c和3.h添加到工程再新建一个main.cpp文件。externextern{#include"./intmain(int,char**{return}为什么要extern“C”如果问这个问题,我不想说太多,这是C++的基础。要在C++里使用一段C的代码,必须要用extern“C”括起来。C++跟C虽然语法上有,但是它们是两个不同的东西内存里的布局是完全不同的C++编译器里不用extern“C”括起C码,会导致编译器不知道该如何为C代码描述内存布局。可能在3.c里人家已经把整段代码都extern“C”括起来了但是你遇到一个.c文件就自觉的再括一次也没什么不好基本工程就这样建立起来了。编译,可以通过。但是有一堆warning。可以不管它三 操作入门提供的是一些C数接口,你可以用这些函数操作数据库。通过使用这些接口,传递一些标准sql(以char*型)给函数,就会为你操作数据库。跟MS的access一样是文件型数据库,就是说,一个数不需要任何数据库引擎,这意味着如果你需要还要求人家必须装了sqlserver才能运行,那也太了)。下面开始介绍数据库基本操作基本流关键数据结里最常用到的是3*类型。从数据库打开开打开数据3_open件名3**用这个函数开始数据库操作需要传入两个参数,一是数据库文件名,比如c:\\DongChunGuang_Database.db文件名不需要一定存在,如果此文件不存在,会自3**数即前面提到的关键数据结构。这个结构层细节如何,你不要关它函数返回值表示操作是否正确,如果是_OK则表示操作正常。相关的返回值定义了一些宏。具体这些宏的义可以参考3.h文件。里面有详细定义(顺便说一下,3的代码注释率自称是非常高的,实际上也的确很高。只要你会看英文,可以让你学到不少东西)。下面介绍关闭数据库后,再给一段参考代码关闭数据3前面如果用3_open开启了一个数据库结尾时下面给段简单的代码externextern{#includeint关键结构指intmain(int,char**{3*db=NULL;//打开数据//需要传入db这个指针的指针,因为函数要为这个指针分配内存,还要让db指针指向这个内存result3_open(&dbif(result{_OK//数据库打开失return-}//数据库操作代//数据库打开成//关闭数据3_close(db);return0;}这就是一次数据库操作过程3用总SQL语句操本节介绍如何用执行标准sql语法执行sql语3*,constchar3_callback,void*,char**errmsg这就是执行一条sql语句的函数第1个参数不再说了,是前面open函数得到的指针。说了2个参数constchar*sql是一条sql语句,以\0结尾。第3个参数3_callback是回调,当这条语句执行之后3会去调用你提供的这个函数。(什么是回调函数,自己找4个参数void*是你所提供的指针你可以传递任何一个要传递指针给回调函数,可以填NULL。等下我们再看回调函数。,5个参数char**errmsg是错误信息。注意是指针的指针3里面有很多固定的错误信息执行3_exec之针提供的指针指向错误提示信息,这样3_exec函数外面就可以通过这个char*得到具体错误提示。。,说明:通常,3_callback和它后面的void*这两个位置都可以填NULL。填NULL示你不需要回调。比如你做insert作delete作,就没有必要使用回调。而当你做select时,就要使用回调,因为3把数据查出来,得通exec的回typedeftypedefint3intintLoadMyInfo(void*para,intn_column,charcolumn_value,char**column_name{//para是你3_exec传入的void*//通过para参数,你可以传入一些特殊的指针(比//n_column是这一条记录有多少个字段(即这条记有多少////char**column_value每一个元素都是一个char*值,是一个字段内容(用字符串来表示,以\0结尾)//char**column_namecolumn_valueparaprintf(printf(“记录包含%d\n”n_columnfor(i=0;i<n_column;i++{printf(“字段名:%s段值:%s\n”,column_name[i],column_value[i]);}printf(\n“return}intmain(int,char**{3*intchar*errmsg=resultresult3_open(&dbif(if(result_OK{//数据库打开失return-//数据库操作代//创建一个测试表,表名叫MyTable_12个字IDname。其中ID一个自动增加的类型,以后insert以不去指定这个字段,它会自己从0开始增result 3_exec(db,“createMyTable_1(IDintegerprimarykeyautoincrement,nvarchar(32))”,NULL,NULL,errmsgif(result _OK{:%dresult,errmsg//插入一些记result 3_exec(db,“insertMyTable_1(namevalues‘走路’)”0,0,errmsgif(result _OK{printf(“插入记录失败,错误码:%d,错误因:%s\n”resulterrmsgresult 3_exec(db,“insertMyTable_1(namevalues‘骑单车’)”0,0,errmsgif(result _OK{printf(“插入记录失败,错误码:%d,错误因:%s\n”resulterrmsgresult 3_exec(db,“insertMyTable_1(namevalues‘坐汽车’)”0,0,errmsgif(result _OK{printf(“插入记录失败错误码:%d错误原因result,errmsg//开始查询数据result 3_exec(db,“select*MyTable_1”,LoadMyInfo,NULL,errmsg//关闭数据3_close(dbreturn}}有这些知识,基本上可以应付很多数据库操作了不使用回询数据上面介绍的3_exec是使用回调来执行select操它成static的(要问为什么?这又是C++基础了。C++成员thisC++前面说的回调函数的参数不相符。只有当把成员函数声明成static时,它才没有多余的隐含的this数)。虽然回调显得代码整齐,但有时候你还是想要非回调select查询。这可以通过3_get_table函数做到3*,constchar*sql,***resultp,int*nrow,int*ncolumn,char**errmsg第1个参数不再多说,看前面的例子第2个参数是sql语句跟3_exec里的sql是一样的。是一个很普通的以\0尾的char*字符串。第3个参数是查询结果它依然一维数(不要以为是二维第4个参数是查询出多少条记录(即查出多少行)第5个参数是多少个字段(多少列)第6个参数是错误信息,跟前面一样,这里不多说了下面给个简单例intmain(int,intmain(int,char**{3*intchar*errmsg=char**dbResult;是char**型,两个*intnRow,inti,j;intresult3_open(&dbif(result_OK{//数据库打开失return-}//数据库操作代//假设前面已经创建了MyTable_1//开始查询,传入的dbResultchar**,这里又加了一个&取地址符,传递进去的就成了char***result3_get_table(db,“select*MyTable_1”,&dbResult,&nRow,&nColumn,&errmsg_OK==result{//查询成index=nColumn;//前面dbResult前面第一行数据是字段名称,从nColumn索引开始才是真正的数据printf(“查到%d记录\n”nRowfor(i=0;i<nRow;i++){printf(“%d记录\n”i+1for(j=0;j<nColumn;j++){printf(“字段名段值dbResult[j],dbResult[index]++index;dbResult字段值是连续的,从第0引到第nColumn-1引都是字段名称,从第nColumn}}}printf(“-------\n”//到这里,不论数据库查询是否成功,都释放//到这里,不论数据库查询是否成功,都释放查询结果,使 提供的功能来释3_free_table(dbResult3_close(db);return0;}}到这个例子为止,3的常用用法都介绍完了用以上的方法,再配上sql句,完全可以应付绝大多数但有一种情况,用上面方法是无法实现的:需要insert、 操作二进操作二进制数据需要用一个辅助的数据类型:3_stmt*这个数据类型记录了一个“sql语句”。为什么我把“sql语句”引号引起来?因为你可以把3_stmt*所表示的内容看成是sql语句,但是实际上它不是我们所熟知的sql语句。它是一个已经把sql语句解析了的、用自己标记记录入二进制数据。当然,把二进制数据插到3_stmt结构里可不能直接memcpy,也不能像std::string那样用+号。必须用提供的函数来插入。写入二进下面说写二进制的步骤要插入二进制,前提是这个表的字段的类型是blob型。createtableTbl_2(IDinteger,file_contentblob首3_stmt3_stmt*然后,把一个sql句解析到stat构里去3_prepare(3_prepare(db,“insertintoTbl_2(file_content)values(10,?)”,-1,&stat,0上面的函数完成sql句的解析第一个参数跟前面一样,是个3*类型变量,第二个参数是一个sql语句。这个sql语句特别之处在于values里面有个?号。在第三个参数我写的是-1,这个参数含义是前面sql句的长度。如果小于0,会自动计算它的长度(把sql语句当成以\0尾的字符串)。第四个参数是3_stmt的指针的指针。解析以后sql语句就放在这个结构里第五个参数我也不知道是干什么的。为0就可以了如果这个函数执行成功(返回值是_OK且stat不为NULL),那么下面就可以开始插入二进制数据。3_bind_blob(3_bind_blob(stat,1,(int)(length_of_data_in_bytes),(int)(length_of_data_in_bytes),NULLpdata数据冲区,length_of_data_in_bytes为数据大小,以字节为单这个函数一共有5个参数第1个参数是前面prepare得到的3_stmt*类型2参数:?号的索引。前面preparesql句里有一个?号假多个?号怎么插入?方法就是改变bind_blob函数第一个?号(这里的索引从1开始计数0)。如果你有多个?号,就写多个bind_blob语句,并改变它们的第2参数就替换到不同的?号。如果有?号没有替换,为它取值第3个参数:二进制数据起始指针第4个参数:二进制数据的长度,以字节为单位第5个参数:是个析够回调函数,告诉当把数据理完后调用此函数来析够你的数据。这个参数我还没有使用过intintresult3_step(statstat最后,要把3_stmt结构

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论