C++访问sqlite3实践
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的表。
然后编写如下代码:
- #include "sqlite3.h"
- #include <iostream>
- #include <sstream>
- using namespace std;
- sqlite3 * pDB;
- int createTable()
- {
- char* errMsg;
- std::string dropTab = "drop table test_tab;";
- string strSQL= "create table test_tab (f1 int, f2 long);";
- int res= sqlite3_exec(pDB , dropTab.c_str() , 0 , 0 , &errMsg);
- if (res != SQLITE_OK)
- {
- std::cout << "执行SQL 出错." << errMsg << std::endl;
- return -1;
- }
- res = sqlite3_exec(pDB , strSQL.c_str() ,0 ,0, &errMsg);
- if (res != SQLITE_OK)
- {
- std::cout << "执行创建table的SQL 出错." << errMsg << std::endl;
- return -1;
- }
- else
- {
- std::cout << "创建table的SQL成功执行."<< std::endl;
- }
- return 0;
- }
- int insert1()
- {
- char* errMsg;
- int res = sqlite3_exec(pDB,"begin transaction;",0,0, &errMsg);
- for (int i= 1; i < 10; ++i)
- {
- std::stringstream strsql;
- strsql << "insert into test_tab values(";
- strsql << i << ","<< (i+10) << ");";
- std::string str = strsql.str();
- res = sqlite3_exec(pDB,str.c_str(),0,0, &errMsg);
- if (res != SQLITE_OK)
- {
- std::cout << "执行SQL 出错." << errMsg << std::endl;
- return -1;
- }
- }
- res = sqlite3_exec(pDB,"commit transaction;",0,0, &errMsg);
- std::cout << "SQL成功执行."<< std::endl;
- return 0;
- }
- static int callback(void *NotUsed, int argc, char **argv, char **azColName)
- {
- for(int i = 0 ; i < argc ; i++)
- {
- std::cout << azColName[i] << " = " << (argv[i] ? argv[i] : "NULL") << ", " ;
- }
- std::cout<< "\n";
- return 0;
- }
- int select1()
- {
- char* errMsg;
- string strSQL= "select * from test_tab;";
- int res = sqlite3_exec(pDB, strSQL.c_str(), callback , 0 , &errMsg);
- if (res != SQLITE_OK)
- {
- std::cout << "执行SQL 出错." << errMsg << std::endl;
- return -1;
- }
- else
- {
- std::cout << "SQL成功执行."<< std::endl;
- }
- return 0;
- }
- int main()
- {
- int res = sqlite3_open("D:\\sql.db", &pDB);
- if( res ){
- std::cout << "Can't open database: "<< sqlite3_errmsg(pDB);
- sqlite3_close(pDB);
- return -1;
- }
- res = createTable();
- if (res != 0)
- {
- return 0;
- }
- res = insert1();
- if (res != 0)
- {
- return 0;
- }
- select1();
- return 0;
- }
编译、链接、执行,看看效果吧。
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实践的更多相关文章
- 自己整理的一个访问SQLite3数据库的C++类
原文地址:自己整理的一个访问SQLite3数据库的C++类作者:vigra 近日,对SQLite3的使用进行了研究.真不愧是优秀的嵌入数据库,API接口也极其简捷.基本上只要使用以下几个接口就能完成数 ...
- 企业运维实践-Nginx使用geoip2模块并利用MaxMind的GeoIP2数据库实现处理不同国家或城市的访问最佳实践指南
关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 本章目录 目录 0x00 前言 ...
- Python访问sqlite3数据库取得dictionary的正路!
[引子] 很多人都知道,Python里是内置了很好用的sqlite3的.但这个库有个缺陷,在执行fetchall()/fetchone()等方法后,得到的是一个tuple.以前吧,做自己的小项目,tu ...
- NIO网络访问模式实践
1.创建NioNest12类 一个线程监听5个端口的事件 public class NioTest12 { public static void main(String[] args) throws ...
- linux centos7 开启 mysql 3306 端口 外网访问 的实践
第〇步:思路 3306 端口能否被外网访问,主要要考虑: (1)mysql的3306 端口是否开启?是否没有更改端口号? (2)mysql 是否允许3306 被外网访问? (3)linux 是否已经开 ...
- C++访问sqlite3的初体验
Sqlite确实是一个比较好的本地数据库,从接触它的时候就喜欢上了它,它可以在很多情况下简化应用.不过以前都是在Java里面使用,或者Linux C下使用的,现在有个项目(C++)可能我会用到sqli ...
- 十二.HTTPS网站安全访问实践
期中集群架构-第十二章-HTTPS安全证书访问连接实践配置========================================= 01:网络安全涉及的问题: ①. 网络安全问题-数据机密性 ...
- 如何打通CMDB,实现就近访问
CMDB在企业中,一般用于存放与机器设备.应用.服务等相关的元数据.当企业的机器及应用达到一定规模后就需要这样一个系统来存储和管理它们的元数据.有一些广泛使用的属性,例如机器的IP.主机名.机房.应用 ...
- 阿里巴巴是如何打通 CMDB,实现就近访问的?
CMDB在企业中,一般用于存放与机器设备.应用.服务等相关的元数据.当企业的机器及应用达到一定规模后就需要这样一个系统来存储和管理它们的元数据.有一些广泛使用的属性,例如机器的IP.主机名.机房.应用 ...
随机推荐
- EF5.0 对一个或多个实体的验证失败。有关详细信息,请参见“EntityValidationErrors”属性
使用asp.net+EF5.0练习的时候,遇到这样一个问题: 对一个或多个实体的验证失败.有关详细信息,请参见“EntityValidationErrors”属性 但是感到很疑惑,去百度,说是关闭EF ...
- 在ajax当中使用url重写来避免url的暴露
记得一次面试,有这样一道面试题:jsp页面当中需要用到ajax的实现,此时需要调用java的url:此时的问题是如果用户查看页面源码就能看到真是的url,这个问题如何避免.说实话,AJAX我用的只是皮 ...
- 在Eclipse中搭建C/C++环境
在Eclipse中搭建C/C++环境 本文地址:http://blog.csdn.net/you_and_me12/article/details/7389934 习惯了使用eclipse编程后,现在 ...
- nutch http file 截断问题
问题: 列表页预计抽取 355+6 但实际只抽取到220条链接. 原因是nutch对http下载的内容的长度进行了限制. 解决方案:这里将这个属性扩大10倍. vim conf/nutch-defal ...
- Python零散收集:
Python零散收集 转义字符 描述 \(在行尾时) 续行符 \\ 反斜杠符号 \’ 单引号 \” 双引号 \a 响铃 \b 退格(Backspace) \e 转义 \000 空 \n 换行 \v 纵 ...
- Word中表格内容被遮挡
RT,输入内容后下面的主任签字会被遮挡,解决办法:选中整个表格右键,表格属性,行高值设置为最小值,然后设置允许跨页断行:有人说右键按内容调整表格也行,没试过............
- hdu 4435
一道枚举+搜索题: 很容易看出这道题目要求尽量不在大的城市里面建加油站: 所以从最大的城市开始枚举! 代码: #include<cstdio> #include<cmath> ...
- 深入浅出Z-Stack 2006 OSAL多任务资源分配机制
转自深入浅出Z-Stack 2006 OSAL多任务资源分配机制 一.概述 OSAL (Operating System Abstraction Layer),翻译为"操作系统抽象层&quo ...
- eclipse中配置c++开发环境 Eclipse + CDT + MinGW
转自eclipse中配置c++开发环境 Eclipse + CDT + MinGW 基本框架:Eclipse + CDT + MinGW 背景知识: CDT:CDT 是完全用 Java 实现的开放源码 ...
- POP3、SMTP、IMAP和Exchange的区别在哪里?
著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:永遇乐链接:http://www.zhihu.com/question/24605584/answer/29039357来源: ...