SQLite之C++封装库CppSQLite使用方法

SQLite之C++封装库CppSQLite使用方法,第1张

概述SQLite是一个超轻量级的开源数据库,从官网上下载的source是一个用c写的文件,在C++(VC)中调用时难免会碰到一些问题,这时就可使用CppSQLite。 CppSQLite(最近版本为CppSQLite3)是对SQLite进行二次封装后的C++类库。 SQLite官网:http://www.sqlite.org/ cppsqlite下载地址:https://github.com/lmmi

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、执行selectexecquery,执行deleteupdateinsertexecDML

2、数据库文件名传入utf-8格式字符串,否则文件库文件名包含中文时会打开失败。

Gbkutf-8函数可以参考下面这篇文章或开源库libiconv

https://blog.csdn.net/bladeandmaster88/article/details/54800287
3
、如果发现有的数据库能打开,有的打不开,则到官网下载并替换最新版的sqlite.dll即可。

总结

以上是内存溢出为你收集整理的SQLite之C++封装库CppSQLite使用方法全部内容,希望文章能够帮你解决SQLite之C++封装库CppSQLite使用方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1161613.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存