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