Sqlite确实是一个比较好的本地数据库,从接触它的时候就喜欢上了它,它可以在很多情况下简化应用。不过以前都是在Java里面使用,或者Linux C下使用的,现在有个项目(C++)可能我会用到sqlite做数据持久化,所以先热热身。

第一步:下载相关文件
 


首先到
这里
下载
sqlite-source-3_6_12.zip
、
sqlite-3_6_12.zip
、 
sqlitedll-3_6_12.zip
三个包,并分别解压。

第二步:生成SQLite的lib文件
 


cmd进入命令行后输入: LIB /DEF:SQLITE3.DEF /MACHINE:IX86 


如果找不到命令LIB,则需要将Microsoft Visual Studio\VC98\Bin这个目录添加到环境变量里。这样就生成了sqlite3.lib文件,我们在后面需要用到这个库,用于链接win32程序

如果设置了环境变量,利用LIB仍不能编译成功,可把SQLITE3.DEF,sqlite3.dll拷贝到VS对应的Bin下,来执行Lib命令。我的开发环境是Win7 64,VS2010.

在C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64 路径下lib成功。

第三步:编写测试工程
 


新建项目,将sqlite3.h(在源码包里)、sqlite3.dll、sqlite3.lib设置到工程环境里,或者直接拷贝到工程目录下。 


然后我们将cmd切换到sqlite3的目录下,里面有个sqlite3.exe。执行命令: 


> sqlite3 D:\sql.db   ;生成sql.db的数据库文件 
sqlite3 > create table test_tab (f1 int, f2 long); 
sqlite3 > .q
 


这样我们就生成了一张test_tab的表。 


然后编写如下代码:

  1. #include "sqlite3.h"
  2. #include <iostream>
  3. #include <sstream>
  4. using namespace std;
  5. sqlite3 * pDB;
  6. int createTable()
  7. {
  8. char* errMsg;
  9. std::string dropTab = "drop table test_tab;";
  10. string strSQL= "create table test_tab (f1 int, f2 long);";
  11. int res= sqlite3_exec(pDB , dropTab.c_str() , 0 , 0 , &errMsg);
  12. if (res != SQLITE_OK)
  13. {
  14. std::cout << "执行SQL 出错." << errMsg << std::endl;
  15. return -1;
  16. }
  17. res = sqlite3_exec(pDB , strSQL.c_str() ,0 ,0, &errMsg);
  18. if (res != SQLITE_OK)
  19. {
  20. std::cout << "执行创建table的SQL 出错." << errMsg << std::endl;
  21. return -1;
  22. }
  23. else
  24. {
  25. std::cout << "创建table的SQL成功执行."<< std::endl;
  26. }
  27. return 0;
  28. }
  29. int insert1()
  30. {
  31. char* errMsg;
  32. int res = sqlite3_exec(pDB,"begin transaction;",0,0, &errMsg);
  33. for (int i= 1; i < 10; ++i)
  34. {
  35. std::stringstream strsql;
  36. strsql << "insert into test_tab  values(";
  37. strsql  << i << ","<< (i+10) << ");";
  38. std::string str = strsql.str();
  39. res = sqlite3_exec(pDB,str.c_str(),0,0, &errMsg);
  40. if (res != SQLITE_OK)
  41. {
  42. std::cout << "执行SQL 出错." << errMsg << std::endl;
  43. return -1;
  44. }
  45. }
  46. res = sqlite3_exec(pDB,"commit transaction;",0,0, &errMsg);
  47. std::cout << "SQL成功执行."<< std::endl;
  48. return 0;
  49. }
  50. static int callback(void *NotUsed, int argc, char **argv, char **azColName)
  51. {
  52. for(int i = 0 ; i < argc ; i++)
  53. {
  54. std::cout << azColName[i] << " = " << (argv[i] ? argv[i] : "NULL") << ", " ;
  55. }
  56. std::cout<< "\n";
  57. return 0;
  58. }
  59. int select1()
  60. {
  61. char* errMsg;
  62. string strSQL= "select * from test_tab;";
  63. int res = sqlite3_exec(pDB, strSQL.c_str(), callback , 0 , &errMsg);
  64. if (res != SQLITE_OK)
  65. {
  66. std::cout << "执行SQL 出错." << errMsg << std::endl;
  67. return -1;
  68. }
  69. else
  70. {
  71. std::cout << "SQL成功执行."<< std::endl;
  72. }
  73. return 0;
  74. }
  75. int main()
  76. {
  77. int res = sqlite3_open("D:\\sql.db", &pDB);
  78. if( res ){
  79. std::cout << "Can't open database: "<< sqlite3_errmsg(pDB);
  80. sqlite3_close(pDB);
  81. return -1;
  82. }
  83. res = createTable();
  84. if (res != 0)
  85. {
  86. return 0;
  87. }
  88. res = insert1();
  89. if (res != 0)
  90. {
  91. return 0;
  92. }
  93. select1();
  94. return 0;
  95. }

编译、链接、执行,看看效果吧。 


SQLite不愧是数据存储的 "瑞士军刀".不像使用某些数据库,要配置ODBC,还要把一大堆的dll一起打包到最终的用户程序中去.还得使用depends之类的工具看要打包哪些.dll.

更多学习参看sqlite提供的document啦```

第四步,测试通过了,如果要应用的项目里,使用sqlite3提供的借口,不是很方便,需要再封装一层。推荐一个不错的 开源的wapper:SQLiteCpp.

地址:https://github.com/SRombauts/SQLiteCpp

SQLiteC++ (SQLiteCpp) is a smart and easy to use C++ SQLite3 wrapper.

C++访问sqlite3实践的更多相关文章

  1. 自己整理的一个访问SQLite3数据库的C++类

    原文地址:自己整理的一个访问SQLite3数据库的C++类作者:vigra 近日,对SQLite3的使用进行了研究.真不愧是优秀的嵌入数据库,API接口也极其简捷.基本上只要使用以下几个接口就能完成数 ...

  2. 企业运维实践-Nginx使用geoip2模块并利用MaxMind的GeoIP2数据库实现处理不同国家或城市的访问最佳实践指南

    关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 本章目录 目录 0x00 前言 ...

  3. Python访问sqlite3数据库取得dictionary的正路!

    [引子] 很多人都知道,Python里是内置了很好用的sqlite3的.但这个库有个缺陷,在执行fetchall()/fetchone()等方法后,得到的是一个tuple.以前吧,做自己的小项目,tu ...

  4. NIO网络访问模式实践

    1.创建NioNest12类 一个线程监听5个端口的事件 public class NioTest12 { public static void main(String[] args) throws ...

  5. linux centos7 开启 mysql 3306 端口 外网访问 的实践

    第〇步:思路 3306 端口能否被外网访问,主要要考虑: (1)mysql的3306 端口是否开启?是否没有更改端口号? (2)mysql 是否允许3306 被外网访问? (3)linux 是否已经开 ...

  6. C++访问sqlite3的初体验

    Sqlite确实是一个比较好的本地数据库,从接触它的时候就喜欢上了它,它可以在很多情况下简化应用.不过以前都是在Java里面使用,或者Linux C下使用的,现在有个项目(C++)可能我会用到sqli ...

  7. 十二.HTTPS网站安全访问实践

    期中集群架构-第十二章-HTTPS安全证书访问连接实践配置========================================= 01:网络安全涉及的问题: ①. 网络安全问题-数据机密性 ...

  8. 如何打通CMDB,实现就近访问

    CMDB在企业中,一般用于存放与机器设备.应用.服务等相关的元数据.当企业的机器及应用达到一定规模后就需要这样一个系统来存储和管理它们的元数据.有一些广泛使用的属性,例如机器的IP.主机名.机房.应用 ...

  9. 阿里巴巴是如何打通 CMDB,实现就近访问的?

    CMDB在企业中,一般用于存放与机器设备.应用.服务等相关的元数据.当企业的机器及应用达到一定规模后就需要这样一个系统来存储和管理它们的元数据.有一些广泛使用的属性,例如机器的IP.主机名.机房.应用 ...

随机推荐

  1. C# net部署图片分布式存储服务器的小案例

    如果web服务用户多了,访问多了,用户上传的图片,文件等内容放在一块,想必服务器是承受不住的,这个时候,我们就需要考虑分布式存储的方法了. 如图所示:一个web服务器拖2个图片服务器 如何做到用户上传 ...

  2. 如何使用Github仓库创建网站

    官方文档:https://help.github.com/categories/github-pages-basics/ 1.创建一个仓库 2.额外建立一个gh-pages分支 3.添加CNAME文件 ...

  3. 李洪强漫谈iOS开发[C语言-028]-逗号表达式

  4. SPRING IN ACTION 第4版笔记-第二章-003-以Java形式注入Bean、@Bean的用法

    1. package soundsystem; import org.springframework.context.annotation.Bean; import org.springframewo ...

  5. C#连接数据库的一些鲜为人知的方法

    用过VS2008和VS2010的开发人员肯定知道在安装这个IDE的时候会自动安装了一个精简版的SQL数据库服务SqlExpress,这个数据库系统少了最重要的企业管理器,也就是说不能用它来建数据表和一 ...

  6. BZOJ3188: [Coci 2011]Upit

    3188: [Coci 2011]Upit Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 72  Solved: 24[Submit][Status] ...

  7. android学习之BUG——The connection to adb is down, and a severe error has occured.

    开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选&qu ...

  8. TOAD Menu Shortcuts 快捷键

    TOAD Menu Shortcuts Category Command Shortcut Conflict File AWR Browser File Compare Files File DBMS ...

  9. [JLOI2013]卡牌游戏

    [题目描述 Description] N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡 ...

  10. JavaScript高级程序设计51.pdf

    (续上篇) 模拟鼠标事件 var btn=document.getElementById("myBtn"); //创建事件对象 var event=document.createE ...