1、sqlite3数据库c编程linux c编程操作数据库(sqlite3应用) C/C+语言中调用 sqlite 的函数接口来实现对数据库的管理(创建数据库、创建表格、插入数据、查询、数据、删除数据等)。首先要编译好sqlite的库文件 : libsqlite3.a libsqlite3.la libsqlite3.so libsqlite3.so.0 libsqlite3.so.0.8.6 pkgconfig可执行文件 : sqlite3本次测试: sqlite3的库文件目录是:/usr/local/lib 可执行文件 sqlite3 的目录是: /usr/local/bin 头文件 sqli
2、te3.h 的目录是: /usr/local/include用ls命令查看如下:rootlocalhost config# ls /usr/local/liblibclamav.a libclamunrar_iface.a libclamunrar.so libsqlite3.solibclamav.la libclamunrar_iface.la libclamunrar.so.5 libsqlite3.so.0libclamav.so libclamunrar_iface.so libclamunrar.so.5.0.3 libsqlite3.so.0.8.6libclamav.so.5
3、libclamunrar_iface.so.5 libmstring.so pkgconfiglibclamav.so.5.0.3 libclamunrar_iface.so.5.0.3 libsqlite3.alibclamunrar.a libclamunrar.la libsqlite3.la此目录下包含库文件: libsqlite3.a libsqlite3.la libsqlite3.so libsqlite3.so.0 libsqlite3.so.0.8.6 pkgconfig开始sqlite编程: 1. 下面是一个C程序的例子,显示怎么使用 sqlite 的 C/C+ 接口. 数
4、据库的名字由第一个参数取得且第个参数或更多的参数是 SQL 执行语句. 这个函数调用sqlite3_open() 打开数据库,并且调用sqlite3_close() 关闭数据库连接。 程序一:opendbslite.c:view plain1. #include 2. #include 3. #include 4. intmain(void) 5. 6. sqlite3*db=NULL; 7. char*zErrMsg=0; 8. intrc; 9. 10. /打开指定的数据库文件,如果不存在将创建一个同名的数据库文件 11. rc=sqlite3_open(zieckey.db,&db);
5、12. if(rc) 13. 14. fprintf(stderr,Cantopendatabase:%s/n,sqlite3_errmsg(db); 15. sqlite3_close(db); 16. exit(1); 17. 18. elseprintf(Youhaveopenedasqlite3databasenamedzieckey.dbsuccessfully!/nCongratulations!Havefun!-/n); 19. 20. sqlite3_close(db);/关闭数据库 21. return0; 22. 编译(问题):rootlocalhost liuxltest
6、# gcc -o opendbsqlite opendbsqlite.c/tmp/ccuquUQN.o: In function main:opendbsqlite.c:(.text+0x2e): undefined reference to sqlite3_openopendbsqlite.c:(.text+0x42): undefined reference to sqlite3_errmsgopendbsqlite.c:(.text+0x67): undefined reference to sqlite3_closeopendbsqlite.c:(.text+0x8a): undefi
7、ned reference to sqlite3_closecollect2: ld returned 1 exit status编译(解决):出现上述问题是因为没有找到库文件的问题。由于用到了用户自己的库文件,所用应该指明所用到的库,我们可以这样编译:rootlocalhost liuxltest# gcc -o opendbsqlite opendbsqlite.c -lsqlite3用 -lsqlite3 选项就可以了(前面我们生成的库文件是 libsqlite3.so.0.8.6 等,去掉前面的lib和后面的版本标志,就剩下 sqlite3 了所以是 -lsqlite3 )执行:roo
8、tlocalhost liuxltest# ./opendbsqliteYou have opened a sqlite3 database named zieckey.db successfully!Congratulations! Have fun ! -rootlocalhost liuxltest# 2. 插入 :insert 在C语言中向数据库插入数据:sqlite3_exec的函数原型说明如下:int sqlite3_exec( sqlite3*, /* An open database */ const char *sql, /* SQL to be executed */ sq
9、lite_callback, /* Callback function */ void *, /* 1st argument to callback function */ char *errmsg /* Error msg written here */);程序二:insert.c:view plain1. #include 2. #include 3. #includesqlite3.h 4. #define_DEBUG_ 5. intmain(void) 6. 7. sqlite3*db=NULL; 8. char*zErrMsg=0; 9. intrc; 10. rc=sqlite3_
10、open(zieckey.db,&db);/打开指定的数据库文件,如果不存在将创建一个同名的数据库文件 11. if(rc) 12. 13. fprintf(stderr,Cantopendatabase:%s/n,sqlite3_errmsg(db); 14. sqlite3_close(db); 15. exit(1); 16. 17. elseprintf(Youhaveopenedasqlite3databasenamedzieckey.dbsuccessfully!/nCongratulations!Havefun!-/n); 18. /创建一个表,如果该表存在,则不创建,并给出提示
11、信息,存储在zErrMsg中 19. char*sql=CREATETABLESensorData(/ 20. IDINTEGERPRIMARYKEY,/ 21. SensorIDINTEGER,/ 22. SiteNumINTEGER,/ 23. TimeVARCHAR(12),/ 24. SensorParameterREAL/ 25. ); 26. sqlite3_exec(db,sql,0,0,&zErrMsg); 27. #ifdef_DEBUG_ 28. printf(%s/n,zErrMsg); 29. #endif 30. /插入数据 31. char*sql1=INSERTI
12、NTO/SensorData/VALUES(NULL,1,1,200605011206,18.9); 32. sqlite3_exec(db,sql1,0,0,&zErrMsg); 33. char*sql2=INSERTINTO/SensorData/VALUES(NULL,1,1,200605011306,16.4); 34. sqlite3_exec(db,sql2,0,0,&zErrMsg); 35. sqlite3_close(db);/关闭数据库 36. return0; 37. 编译运行:rootlocalhost liuxltest# gcc -o insert insert.
13、c -lsqlite3rootlocalhost liuxltest# ./insertYou have opened a sqlite3 database named zieckey.db successfully!Congratulations! Have fun ! -(null)(null)(null)rootlocalhost liuxltest#查看是否插入数据:rootlocalhost liuxltest# /usr/local/bin/sqlite3 zieckey.db select * from SensorData 3. 查询: SELETE C语言中查询数据库中的数据
14、。 函数接口sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg ); 解释: int sqlite3_get_table(sqlite3*, const char *sql,char*result , int *nrow , int *ncolumn ,char *errmsg ); result中是以数组的形式存放你所查询的数据,首先是表名,再是数据。 nrow ,ncolumn分别为查询语句返回的结果集的行数,列数,没有查到结果时返回0程序三:query.c:view plain1. #include
15、2. #include 3. #includesqlite3.h 4. #define_DEBUG_ 5. intmain(void) 6. 7. sqlite3*db=NULL; 8. char*zErrMsg=0; 9. intrc; 10. 11. rc=sqlite3_open(zieckey.db,&db);/打开指定的数据库文件,如果不存在将创建一个同名的数据库文件 12. if(rc) 13. 14. fprintf(stderr,Cantopendatabase:%s/n,sqlite3_errmsg(db); 15. sqlite3_close(db); 16. exit(1
16、); 17. 18. elseprintf(Youhaveopenedasqlite3databasenamedzieckey.dbsuccessfully!/nCongratulations!Havefun!-/n); 19. 20. /创建一个表,如果该表存在,则不创建,并给出提示信息,存储在zErrMsg中 21. char*sql=CREATETABLESensorData(/ 22. IDINTEGERPRIMARYKEY,/ 23. SensorIDINTEGER,/ 24. SiteNumINTEGER,/ 25. TimeVARCHAR(12),/ 26. SensorPara
17、meterREAL/ 27. ); 28. sqlite3_exec(db,sql,0,0,&zErrMsg); 29. #ifdef_DEBUG_ 30. printf(zErrMsg=%s/n,zErrMsg); 31. #endif 32. 33. /插入数据 34. sql=INSERTINTO/SensorData/VALUES(NULL,1,1,200605011206,18.9); 35. sqlite3_exec(db,sql,0,0,&zErrMsg); 36. 37. sql=INSERTINTO/SensorData/VALUES(NULL,1,1,20060501130
18、6,16.4); 38. sqlite3_exec(db,sql,0,0,&zErrMsg); 39. 40. 41. 42. intnrow=0,ncolumn=0; 43. char*azResult;/二维数组存放结果 44. /查询数据 45. /* 46. intsqlite3_get_table(sqlite3*,constchar*sql,char*result,int*nrow,int*ncolumn,char*errmsg); 47. result中是以数组的形式存放你所查询的数据,首先是表名,再是数据。 48. nrow,ncolumn分别为查询语句返回的结果集的行数,列数
19、,没有查到结果时返回0 49. */ 50. sql=SELECT*FROMSensorData; 51. sqlite3_get_table(db,sql,&azResult,&nrow,&ncolumn,&zErrMsg); 52. inti=0; 53. printf(row:%dcolumn=%d/n,nrow,ncolumn); 54. printf(/nTheresultofqueryingis:/n); 55. 56. for(i=0;i(nrow+1)*ncolumn;i+) 57. printf(azResult%d=%s/n,i,azResulti); 58. /释放掉az
20、Result的内存空间 59. sqlite3_free_table(azResult); 60. 61. #ifdef_DEBUG_ 62. printf(zErrMsg=%s/n,zErrMsg); 63. #endif 64. sqlite3_close(db);/关闭数据库 65. return0; 66. 67. 这里用到了一个查询的语句是 SELECT * FROM SensorData ,编译运行:rootlocalhost liuxltest# gcc -o query query.c -lsqlite3rootlocalhost liuxltest# ./queryYou h
21、ave opened a sqlite3 database named zieckey.db successfully!Congratulations! Have fun ! -zErrMsg = (null)row:2 column=5The result of querying is :azResult0 = IDazResult1 = SensorIDazResult2 = SiteNumazResult3 = TimeazResult4 = SensorParameterazResult5 = 1azResult6 = 1azResult7 = 1azResult8 = 2006050
22、11206azResult9 = 18.9azResult10 = 2azResult11 = 1azResult12 = 1azResult13 = 200605011306azResult14 = 16.4zErrMsg = (null)rootlocalhost liuxltest# 这里我们可以看到,azResult 的前面 5 个数据正好是我们的表 SensorData 的列属性,之后才是我们要查询的数据。所以我们的程序中才有 i( nrow + 1 ) * ncolumn 的判断条件: for( i=0 ; i( nrow + 1 ) * ncolumn ; i+ ) printf
23、( azResult%d = %s/n, i , azResulti ); 输出中有 zErrMsg = (null) 这样的字句,这是 zErrMsg 保留的错误信息,正如你所看到的,zErrMsg 为空,表明在执行过程中没有错误信息。4. 删除:delete C语言中删除数据库中的特定的数据。 程序四: delete.c:view plain1. #include 2. #include 3. #includesqlite3.h 4. #define_DEBUG_ 5. intmain(void) 6. 7. sqlite3*db=NULL; 8. char*zErrMsg=0; 9. i
24、ntrc; 10. 11. rc=sqlite3_open(zieckey.db,&db);/打开指定的数据库文件,如果不存在将创建一个同名的数据库文件 12. if(rc) 13. 14. fprintf(stderr,Cantopendatabase:%s/n,sqlite3_errmsg(db); 15. sqlite3_close(db); 16. exit(1); 17. 18. elseprintf(Youhaveopenedasqlite3databasenamedzieckey.dbsuccessfully!/nCongratulations!Havefun!-/n); 19.
25、 20. /创建一个表,如果该表存在,则不创建,并给出提示信息,存储在zErrMsg中 21. char*sql=CREATETABLESensorData(/ 22. IDINTEGERPRIMARYKEY,/ 23. SensorIDINTEGER,/ 24. SiteNumINTEGER,/ 25. TimeVARCHAR(12),/ 26. SensorParameterREAL/ 27. ); 28. sqlite3_exec(db,sql,0,0,&zErrMsg); 29. #ifdef_DEBUG_ 30. printf(zErrMsg=%s/n,zErrMsg); 31. #endif 32. 33. /插入数据 34. sql=INSERTINTO/SensorData/VALUES(NULL,1,1,200605011206,18.9); 35. sqlite3_
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1