iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >SQLite3与C/C++的结合应用
  • 366
分享到

SQLite3与C/C++的结合应用

2023-01-31 07:01:15 366人浏览 泡泡鱼
摘要

 这是前几天上面派下来的需求,说要在本地存储大约6W条数据,因为虽然WEBservice比较方便,但是每次请求时都要传输这6W条数据,不免有点费流量,毕竟客户端用的都是3G的笔记本。 于是就开始在网上寻求解决方案。首先想到的是XML,但后来

 这是前几天上面派下来的需求,说要在本地存储大约6W条数据,因为虽然WEBservice比较方便,但是每次请求时都要传输这6W条数据,不免有点费流量,毕竟客户端用的都是3G的笔记本。

于是就开始在网上寻求解决方案。首先想到的是XML,但后来马上就否了,读取文件的速度太慢了,会影响用户体验。接下来就是数据库,MSsql就算了,臃肿不说,客户必然不愿意在自己的机器上装些MS的服务;SQL Server也算了,也是需要服务的;SQLite不错,不需要单独安装服务,还有C/C++api,就它了!

去官网(猛戳传送)上下载了最新的SQLite的dll+源代码,然后就可以开始了。

SQLite并没有一次性做到位,只有下载这些东西是不能放在vs2010中并马上使用的,下载下来的文件中有sqlite3.c/h/dll/def,还是不够用的。我们需要的sqlite3.lib文件并不在其中,需要我们自己动手了。

这儿要用到visual studio提供的Visual Studio Command Prompt工具了。打开之后,进入含有sqlite3.dll和sqlite3.def的目录下,输入以下命令:

  1. LIB /DEF:sqlite3.def /MacHINE:IX86  

就能生成sqlite3.exp和sqlite3.lib文件了,这样在工程中就可以加入lib文件进行编译了。

SEC 1:

因为只是演示API,所以这次在vs2010下建立一个空的win32工程SQLite3Test,在工程的属性-链接-输入中添加sqlite3.lib的引用。添加新的文件main.cpp,写一个main函数,并编译一下。

好,接下来把sqlite3.h/def/exp/lib通通放进SQLite3Test\SQLite3Test\目录下,跟main.cpp在一起,如图:

把sqlite3.dll跟生成的exe放在一起。

SEC 2:

接下来开始进行sqlite3的使用。引入sqlite3.h头文件,并写下如下代码:

  1. #include <iOStream> 
  2. #include "sqlite3.h" 
  3.  
  4. using namespace std; 
  5.  
  6. int main(int arGC, char** argv) 
  7.     sqlite3 * conn = NULL; 
  8.     char * err_msg = NULL; 
  9.     char sql[200] = ""; 
  10.  
  11.     // 打开数据库, 创建连接 
  12.     if(sqlite3_open("test.db", &conn) != SQLITE_OK) 
  13.     { 
  14.         printf("无法打开!"); 
  15.     }
  16.  
  17.     // 关闭连接。 
  18.     if (sqlite3_close(conn) != SQLITE_OK) 
  19.     { 
  20.         printf("无法关闭,错误代码: %s\n", sqlite3_errmsg(conn)); 
  21.         exit(-1); 
  22.     } 
  23.  
  24.     printf("操作成功!\n"); 
  25.  
  26.     return 0; 

sqlite3_open的函数原型如下:

  1. SQLITE_API int sqlite3_open( 
  2.   const char *filename,    
  3.   sqlite3 **ppDb           
  4. ); 

作用就不言而喻了,打开数据库。

第一个参数是数据库文件的名称,如果没有,那就会自动创建一个。

第二个参数是sqlite3的实例句柄的指针的指针。。(看到这儿我想起来,当时在linux下自己写Mysqlc++api的时候,也是用的双重指针,搞死个人哟。。)

常言道:“有打开,就有关闭!”,所以sqlite3_close()就起了这个作用。

不过sqlite3_close的原型是这样的:

  1. SQLITE_API int sqlite3_close(sqlite3 *); //要格外注意双重指针和普通指针。。

有了上面的万金油例子,想必已经对初始化有所了解了。运行后就在Debug目录下多了个test.db文件,不过大小为0KB,因为木有内容嘛!

SEC 3:

在数据库中创建表并插入数据。在open和close的之间写入如下代码:

  1. // 执行SQL  
  2. sprintf(sql, "CREATE TABLE test_for_cpp \
  3. (id int, name varchar(20), age int)");  
  4. if (sqlite3_exec(conn, sql, NULL, NULL, &err_msg) != SQLITE_OK)  
  5. {  
  6.     printf("操作失败,错误代码: %s", err_msg);  
  7.     exit(-1);  
  8. }  
  9.  
  10. //添加10条记录 
  11. for (int i = 0; i < 10; i++) 
  12.     // 执行SQL 
  13.     sprintf(sql, "INSERT INTO test_for_cpp \
  14. (id, name, age) VALUES \
  15. (%d, '%s', %d)", i, "testPeople", i); 
  16.     if (sqlite3_exec(conn, sql, NULL, NULL, &err_msg) != SQLITE_OK)  
  17. {      
  18. printf("操作失败,错误代码: %s", err_msg);      
  19. exit(-1);  
  20. }  

sqlite3_exec的原型如下:

  1. SQLITE_API int sqlite3_exec( 
  2.   sqlite3*,                                   
  3.   const char *sql,                            
  4.   int (*callback)(void*,int,char**,char**),   
  5.   void *,                                     
  6.   char **errmsg                               
  7. ); 

第一个参数为sqlite3实例。

第二个参数为要执行的sql语句。

第三个参数为回调函数的指针。因为这里只是创建表和插入数据,并没有数据返回,所以不需要填写回调函数。以NULL代替。

第四个参数为回调函数所要使用的参数。同第三条。

第五个参数为错误信息。

这次再运行一下,就可以看到test.db已经不再是0KB了。

SEC 4:

再常言道:“有插入,就有读取!”下面来读取数据库文件中的数据。

刚才提到了sqlite3_exec的回调函数,现在需要这个函数了。首先声明一个回调函数:

  1. int sqlite3_exec_callback(void *data, int nColumn,  
  2. char **colValues, char **colNames); 

四个参数的类型不能变。

然后写下该回调函数的实现:

  1. int sqlite3_exec_callback(void *data, int nColumn, char **colValues, char **colNames) 
  2.     for (int i = 0; i < nColumn; i++) 
  3.     { 
  4.         printf("%s\t", colValues[i]); 
  5.     } 
  6.     printf("\n"); 
  7.  
  8.     return 0; 

接下来在插入条目语句的后面写下下面的语句:

  1. // 查询 
  2. sprintf(sql, "SELECT * FROM test_for_cpp"); 
  3. sqlite3_exec(conn, sql, &sqlite3_exec_callback, 0, &err_msg); 

TIP: 前面创建表、插入数据的代码可以先注释掉,否则运行一次就会插入10条数据,会造成点困扰。

运行就可以看到结果了:

因为该回调函数每从数据库中取出一条数据就要调用一次,所以这是最耗时间的过程,这块代码应该尽量高效。

这只是一个简单的例子,不过已经足够平时的小众软件使用了。一些高级的用法比如sqlite3_db_mutex(读写互斥)、sqlite3_backup_step(差异备份)等等,就可以看看sqlite3官方的教程了(猛戳传送)。

--结束END--

本文标题: SQLite3与C/C++的结合应用

本文链接: https://www.lsjlt.com/news/191468.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作