sqlite是一个超轻量级的开源数据库,从官网上下载的source是一个用c写的文件,在C++(VC)中调用时难免会碰到一些问题,这时就可使用Cppsqlite。Cppsqlite(最近版本为Cppsqlite3)是对sqlite进行二次封装后的C++类库。
sqlite官网:http://www.sqlite.org/
cppsqlite下载地址:https://github.com/lmmir/Cppsqlite3
一、使用前需要包含sqlite3头文件和库文件。
(1)Cppsqlite3.h 和Cppsqlite3.cpp
(2)sqlite3.h、sqlite3.lib和sqlite3.dll
在使用这个类的时候,你需要确保几件事情:首先你要下载上面5个文件。其次就是在你的工程中引入,sqlite3.lib,最后要将Cppsqlite3.h 和Cppsqlite3.cpp添加到你的工程中。
二、使用方法
1、打开数据库
Cppsqlite3DB db; db.open("data.db"); db.close();
Cppsqlite3DB是一个核心类,之后的查询等数据库 *** 作都要借助这个类。打开,关闭就像 *** 作一个文件。
2、查询
const char *sRoute = "x://..."; //设置sqlite数据库文件的路径Cppsqlite3DB db;try{ db.open(sRoute); //打开数据库 Cppsqlite3query q = db.execquery("select * from t_table"); //执行查询 for(int i = 0; i <= q.numFIElds() - 1; i++) //遍历并打印表头 { printf("%s\t",q.fIEldname(i)); } printf("\n"); while(!q.eof()) //遍历所有行 { for(int i = 0; i<=q.numFIElds()-1; i++) { printf("%s\t",q.getStringFIEld(i)); } printf("\n"); q.nextRow();}q.finalize();//结束查询,释放内存}catch(Cppsqlite3Exception& e){ printf("%s",e.errorMessage());}db.close()
Cppsqlite3query是一个查询返回对象,查询完后可以利用此类。这里就使用了Cppsqlite3DB的一个函数execquery,只要将查询sql传入即可。
eof函数:判断是否还有数据;
nextRow函数:移到下一条记录;
getStringFIEld函数:将获得相应字段的内容,以字符串形式返回;
getIntFIEld函数:将获得相应字段的内容,以整形形式返回。
注意的是这个类产生之后要finalize。
3、数据库更改 *** 作
db.execDML("insert into t_table(name,age)values('xiaomi',25)"); db.execDML("update t_table set age = 21 where name = 'xiaomi'");
执行insert、update、deleteSQL语句,无需取返回结果。
4、statement对象
Cppsqlite3Statementsmt = db.compileStatement("insert into t_table(name,age) values(?,?)"); for (int i = 0 ; i < 10; ++i) { smt.bind(1,"test_"); smt.bind(2,i); smt.execDML(); } smt.finalize();
Cppsqlite也提供Statement对象,用法也相当简单。注意的是,Cppsqlite3Statement和Cppsqlite3query一样,最后也要finalize。
5、sqlite一条SQL语句插入多条记录,批量插入
用sqlite才发现这个语法并非标准sql,故而sqlite并不支持。网络上推荐的方法:
INSERT INTO table(col1,col2) SELECT val11,val12 UNION ALL SELECT val21,val22 ;
这样的写法是属于复合SQL语句,表示先把两个SELECT的结果集进行无删减的联合,再把联合结果插入到table中。
6、异常处理
try { code…… } catch(Cppsqlite3Exception & e) { }
将 *** 作代码放入try里面,使用Cppsqlite3Exception & 来catch。
完整实例:
#include "Cppsqlite3.h" Class Testsqlite{ //定义db指针 private: Cppsqlite3DB* m_psqlDb; Testsqlite() { m_psqlDb = NulL; Init(); } ~Testsqlite() { if ( m_psqlDb ) { m_psqlDb.Close(); delete m_psqlDb; m_psqlDb = NulL; } } //初始化 BOol Init() { //初始化sqlite指针 if ( m_psqlDb || !(m_psqlDb = new Cppsqlite3DB)) { return FALSE; } try { string strDbfile = "D:\data.s3db"; m_psqlDb->open( strDbfile.c_str() );//打开指定位置的本地数据库 } catch (Cppsqlite3Exception& e)//处理sqlite异常 { return FALSE; } return TRUE; } public: //读出db中指定名称的表数据 voID ReadAllline(map<int,int>& mpDbInfo,const string &Tblname) { try { char szCmd[256]; sprintf( szCmd,"SELECT ID,testnum FROM %s;",Tblname); Cppsqlite3query query = m_psqlDb->execquery( szCmd );//执行查询语句 while(!query.eof()) { int ID = query.getIntFIEld( "ID"); //列项为ID的值 int testnum = query.getIntFIEld( "testnum"); //列项testnum的值 mpDbInfo.insert(make_pair(ID,testnum));//插入map query.nextRow();//继续下一行 } query.finalize();//结束查询,释放内存 } catch (Cppsqlite3Exception& e) { return; } } //更新指定数据 BOol Deleteline(const string& Tblname,const int& ID,const int& num) { try { char szCmd[256]; sprintf( szCmd,"update %s set num = %d WHERE ID=%d;",Tblname,num,ID);//更新内容 m_psqlDb->execDML( szCmd ); } catch (Cppsqlite3Exception& e) { return FALSE; } return TRUE; } //删除指定数据 BOol Deleteline(const string& Tblname,const int& ID) { try { char szCmd[256]; sprintf( szCmd,"DELETE FROM %d WHERE ID=%d;",ID);//删除语句 m_psqlDb->execDML( szCmd ); } catch (Cppsqlite3Exception& e) { return FALSE; } return TRUE; } };
三、注意事项
1、执行select用execquery,执行delete,update,insert用execDML。
2、数据库文件名传入utf-8格式字符串,否则文件库文件名包含中文时会打开失败。
Gbk转utf-8函数可以参考下面这篇文章或开源库libiconv
https://blog.csdn.net/bladeandmaster88/article/details/54800287
3、如果发现有的数据库能打开,有的打不开,则到官网下载并替换最新版的sqlite.dll即可。
以上是内存溢出为你收集整理的SQLite之C++封装库CppSQLite使用方法全部内容,希望文章能够帮你解决SQLite之C++封装库CppSQLite使用方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)