ImageVerifierCode 换一换
格式:DOCX , 页数:53 ,大小:37.89KB ,
资源ID:27827793      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/27827793.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(sqlite入门.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

sqlite入门.docx

1、sqlite入门C语言程序调用SQLite实例现在我们来写个C/C+程序,调用 sqlite 的 API 接口函数。 下面是一个C程序的例子,显示怎么使用 sqlite 的 C/C+ 接口. 数据库的名字由第一个参数取得且第二个参数或更多的参数是 SQL 执行语句. 这个函数调用sqlite3_open() 在 22 行打开数据库, sqlite3_exec() 在 27 行执行 SQL 命令, 并且sqlite3_close() 在 31 行关闭数据库连接。代码:cppview plaincopy1. /name:opendbsqlite.c2. /ThisfileisusedtotestC

2、/C+APIforsqlite3. /Author:zieckey4. /2006/04/115. #include6. #include7. 8. intmain(void)9. 10. sqlite3*db=NULL;11. char*zErrMsg=0;12. intrc;13. rc=sqlite3_open(zieckey.db,&db);/打开指定的数据库文件,如果不存在将创建一个同名的数据库文件14. if(rc)15. fprintf(stderr,Cantopendatabase:%sn,sqlite3_errmsg(db);16. sqlite3_close(db);17.

3、 exit(1);18. 19. elseprintf(openzieckey.dbsuccessfully!n);20. 21. sqlite3_close(db);/关闭数据库22. return0;23. 编译:# gcc opendbsqlite.c -o db.out也许会碰到类似这样的问题:/tmp/ccTkItnN.o(.text+0x2b): In function main: undefined reference to sqlite3_open/tmp/ccTkItnN.o(.text+0x45): In function main: undefined reference

4、 to sqlite3_errmsg/tmp/ccTkItnN.o(.text+0x67): In function main: undefined reference to sqlite3_close/tmp/ccTkItnN.o(.text+0x8f): In function main: undefined reference to sqlite3_closecollect2: ld returned 1 exit status这是个没有找到库文件的问题。由于用到了用户自己的库文件,所用应该指明所用到的库,我们可以这样编译:# gcc opendbsqlite.c -o db.out -

5、lsqlite3我用用 -lsqlite3 选项就可以了(前面我们生成的库文件是 libsqlite3.so.0.8.6 等,去掉前面的lib和后面的版本标志,就剩下 sqlite3 了所以是 -lsqlite3 )。如果我们在编译安装的时候,选择了安装路径,例如这样的话:.# ./sqlite/configure -prefix=/usr/local/arm-linux/sqlite-ix86-linux.这样编译安装时,sqlite的库文件将会生成在 /usr/local/arm-linux/sqlite-ix86-linux/lib 目录下这时编译还要指定库文件路径,因为系统默认的路径没

6、有包含 /usr/local/arm-linux/sqlite-ix86-linux/lib# gcc opendbsqlite.c -lsqlite3 -L/usr/local/arm-linux/sqlite-ix86-linux/lib如果还不行的话,可能还需要指定头文件 sqlite3.h 的路径,如下:# gcc opendbsqlite.c -lsqlite3 -L/usr/local/arm-linux/sqlite-ix86-linux/lib -I/usr/local/arm-linux/sqlite-ix86-linux/include这样编译应该就可以了 ,运行:# ./

7、db.outopen ming.db successfully!在这个操作中我们执行了如下操作: 打开数据库 执行SQL语句 关闭数据库当然这中间会有一些状态的判断以及内存指针的释放等。打开数据库的API如下:intsqlite3_open(constchar*filename,/*Databasefilename(UTF-8)*/sqlite3*ppDb/*OUT:SQLitedbhandle*/);这里会引入一个非常复杂的sqlite3的数据结构。这个根据需要以后酌情了解些。打开数据库除了这种形式意外,还有sqlite3_open、sqlite3_open16、sqlite3_open_v

8、2几种形式,基本上类似。大部分sql操作都可以通过sqlite3_exec来完成,它的API形式如下:intsqlite3_exec(sqlite3*,/*Anopendatabase*/constchar*sql,/*SQLtobeevaluated*/int(*callback)(void*,int,char*,char*),/*Callbackfunction*/void*,/*1stargumenttocallback*/char*errmsg/*Errormsgwrittenhere*/);各个参数的意义为: sqlite3描述的是数据库句柄 sql 要执行的SQL语句 callba

9、ck回调函数 void *回调函数的第一个参数 errmsg错误信息,如果没有SQL问题则值为NULL回调函数式一个比较复杂的函数。它的原型是这样的:intcallback(void*params,intcolumn_size,char*column_value,char*column_name)每一个参数意义如下: params是sqlite3_exec传入的第四个参数 column_size是结果字段的个数 column_value是返回记录的一位字符数组指针 column_name是结果字段的名称通常情况下callback在select操作中会使用到,尤其是处理每一行记录数。返回的结果每

10、一行记录都会调用下“回调函数”。 如果回调函数返回了非0,那么sqlite3_exec将返回SQLITE_ABORT,并且之后的回调函数也不会执行,同时未执行的子查询也不会继续执行。对于更新、删除、插入等不需要回调函数的操作,sqlite3_exec的第三、第四个参数可以传入0或者NULL。通常情况下sqlite3_exec返回SQLITE_OK=0的结果,非0结果可以通过errmsg来获取对应的错误描述。Windows下编译:D:homedevccl /nologo /TC sqlite3-demo.c sqlite3.c GCC下编译:$ gcc -o sqlite3-demo.bin s

11、qlite3-demo.c sqlite3.c 删除表操作为了防止垃圾数据,我们在加载数据库的时候删除表操作。简单的删除操作可以直接使用sqlite3_exec即可。这里不需要回调函数以及回调函数的参数。 当然需要可以关注sqlite3_exec返回的结果是否为SQLITE_OK的值。 constchar*sql_drop_table=droptableifexistst;constchar*sql_create_table=createtablet(idintprimarykey,msgvarchar(128);sqlite3_exec(db,sql_drop_table,0,0,&errm

12、sg);sqlite3_exec(db,sql_create_table,0,0,&errmsg);插入数据插入第一条数据 ret=sqlite3_exec(db,insertintot(id,msg)values(1,AdyLiu),NULL,NULL,&errmsg);printf(Insertarecord%sn,ret=SQLITE_OK?OK:FAIL);返回值ret为SQLITE_OK即操作成功。插入多条数据,并删除数据 ret=sqlite3_exec(db,insertintot(id,msg)values(1,AdyLiu),NULL,NULL,&errmsg);printf

13、(Insertarecord%sn,ret=SQLITE_OK?OK:FAIL);ret=sqlite3_exec(db,insertintot(id,msg)values(2,IMXYLZ),NULL,NULL,&errmsg);printf(Insertarecord%sn,ret=SQLITE_OK?OK:FAIL);ret=sqlite3_exec(db,deletefromtwhereid3,NULL,NULL,&errmsg);printf(Deleterecords:%sn,ret=SQLITE_OK?OK:FAIL);插入多条数据,简单的使用sqlite3_exec进行SQL执

14、行即可。当然这里是完整的SQL字符串。预编译操作 inti=0;sqlite3_stmt*stmt;charca255;/preparestatementsqlite3_prepare_v2(db,insertintot(id,msg)values(?,?),-1,&stmt,0);for(i=10;i20;i+)sprintf(ca,HELLO#%i,i);sqlite3_bind_int(stmt,1,i);sqlite3_bind_text(stmt,2,ca,strlen(ca),NULL);sqlite3_step(stmt);sqlite3_reset(stmt);sqlite3_

15、finalize(stmt);预编译操作比较麻烦的,完整的预编译操作的流程是:1. 通过sqlite3_prepare_v2()创建一个sqlite3_stmt对象2. 通过sqlite3_bind_*()绑定预编译字段的值3. 通过sqlite3_step()执行SQL语句4. 通过sqlite3_reset()重置预编译语句,重复操作2多次5. 通过sqlite3_finalize()销毁资源sqlite3_prepare_v2()有个多种类似的形式,完整的API语法是:intsqlite3_prepare(sqlite3*db,/*Databasehandle*/constchar*zS

16、ql,/*SQLstatement,UTF-8encoded*/intnByte,/*MaximumlengthofzSqlinbytes.*/sqlite3_stmt*ppStmt,/*OUT:Statementhandle*/constchar*pzTail/*OUT:PointertounusedportionofzSql*/);各个参数的定义为: db为sqlite3的句柄 zSql为要执行的SQL语句 nByte为要执行语句在zSql中的最大长度,如果是负数,那么就需要重新自动计算 ppStmt为预编译后的句柄 pzTail预编译后剩下的字符串(未预编译成功或者多余的)的指针,通常没

17、什么用,传入0或者NULL即可。绑定参数sqlite3_bind_*有多种形式,分别对应不同的数据类型:intsqlite3_bind_blob(sqlite3_stmt*,int,constvoid*,intn,void(*)(void*);intsqlite3_bind_double(sqlite3_stmt*,int,double);intsqlite3_bind_int(sqlite3_stmt*,int,int);intsqlite3_bind_int64(sqlite3_stmt*,int,sqlite3_int64);intsqlite3_bind_null(sqlite3_st

18、mt*,int);intsqlite3_bind_text(sqlite3_stmt*,int,constchar*,intn,void(*)(void*);intsqlite3_bind_text16(sqlite3_stmt*,int,constvoid*,int,void(*)(void*);intsqlite3_bind_value(sqlite3_stmt*,int,constsqlite3_value*);intsqlite3_bind_zeroblob(sqlite3_stmt*,int,intn);预编译SQL语句中可以包含如下几种形式: ? ?NNN :VVV VVV $VV

19、VNNN代表数字,VVV代表字符串。如果是?或者?NNN,那么可以直接sqlite3_bind_*()进行操作,如果是字符串,还需要通过sqlite3_bind_parameter_index()获取对应的index,然后再调用sqlite3_bind_*()操作。这通常用于构造不定条件的SQL语句(动态SQL语句)。查询操作回调函数的解释参考最上面的描述。 首先声明一个回调函数。int print_record(void *,int,char *,char *); 查询代码 /selectdataret=sqlite3_exec(db,select*fromt,print_record,NU

20、LL,&errmsg);if(ret!=SQLITE_OK)fprintf(stderr,querySQLerror:%sn,errmsg);现在定义回调函数,只是简单的输出字段值。intprint_record(void*params,intn_column,char*column_value,char*column_name)inti;for(i=0;in_column;i+)printf(t%s,column_valuei);printf(n);return0;不使用回调的查询操作定义使用的变量 char *dbresult; int j,nrow,ncolumn,index; 查询操作 /selecttableret=sqlite3_get_table(db,select*fromt,&dbresult,&nrow,&ncolumn,&errmsg);if(ret=SQLITE_OK)printf(query%irecords.n,nrow);index=ncolumn;for(i=0;inrow;i+)printf(%2i,i);for(j=0;j这里 SQLite version 3.0.8 是SQLite的版本信息。也就是说本文使用的sqlite

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1