一、前言:
 
今天试了下如何用C++类实现接口封装,感觉蛮好 。用于封装的类主要有两个,SQLiteStatement类和SQLiteWrapper类,是一个老外写的。我看了下源码,主要是对C接口进行了封装,好处自然不用说,可以重用。很佩服老外的技巧,在这里就引用下他们的代码供大家分享下他们的思想。
 
源代码链接: http://www.adp-gmbh.ch/sqlite/wrapper.html
 
二、类源码:
 
1.头文件:SQLiteWrapper.h
 
按 Ctrl+C 复制代码
 
按 Ctrl+C 复制代码
2.类实现文件:SQLiteWrapper.cpp
 
按 Ctrl+C 复制代码
 
按 Ctrl+C 复制代码
3.实例文件:
 
3.1 创建数据库和数据库表:Create_DB_Table.cpp
 
 
 
1/*
2 * 功能:创建数据库和数据库表。
3 * open():若指定数据库不存在,则创建;否则打开
4 * DirectStatement():可以用于执行大部分SQL语句,但对SELECT语句有些例外。
5 *
6 */
7 #include <iostream>
8 #include "SQLiteWrapper.h"
9
10int main() {
11 SQLiteWrapper sqlite;
12if (sqlite.Open("SQLiteWrapper.db")) {
13 std::cout<<"SQLiteWrapper.db created or opened"<<std::endl;
14 }
15else {
16 std::cout<<"couldn't open SQLiteWrapper.db"<<std::endl;
17 }
18
19if(sqlite.DirectStatement("Create table foo(bar,baz)")){
20 std::cout<<"table foo created"<<std::endl;
21 }
22else
23 std::cout<<"couldn't insert into foo"<<std::endl;
24
25return0;
26 }
 
3.2 插入数据:Insert_DB_Data.cpp
 
 
 
1/*
2 * 功能:向数据库表插入记录
3 *
4 */
5 #include <iostream>
6
7 #include "SQLiteWrapper.h"
8
9int main() {
10 SQLiteWrapper sqlite;
11if (sqlite.Open("SQLiteWrapper.db")) {
12 std::cout<<"SQLiteWrapper.db created or opened"<<std::endl;
13 }
14else {
15 std::cout<<"couldn't open SQLiteWrapper.db"<<std::endl;
16 }
17
18if(sqlite.DirectStatement("insert into foo values(1,2)")){
19 std::cout<<"values(1,2) into foo inserted"<<std::endl;
20
21 }
22else
23 std::cout<<"couldn't insert into foo"<<std::endl;
24
25return0;
26 }
 
3.3 绑定参数执行:Bind_Param_Execute.cpp
 
 
 
1/*
2 * 功能:Bind()封装sqlite3_bind_*系列函数,类中表现为重载函数,给SQL声明中的通配符赋值,若未绑定,则为空
3 * Execute():实现Sqlite3_step(s) 和Sqlite3_reset(s)机制。
4 */
5 #include <iostream>
6
7 #include "SQLiteWrapper.h"
8
9int main(){
10 SQLiteWrapper sqlite;
11if(sqlite.Open("SQLiteWrapper.db")){
12 std::cout<<"SQLiteWrapper.db created or opened"<<std::endl;
13 }
14else{
15 std::cout<<"couldn't open SQLiteWrapper.db"<<std::endl;
16 }
17
18 SQLiteStatement* stmt=sqlite.Statement("insert into foo values(?,?)");
19
20if(stmt->Bind(0,3)){
21 std::cout<<"value 3 successfully bound at pos 0"<<std::endl;
22 }
23else{
24 std::cout<<"value 3 NOT successfully bound at pos 0: "<<sqlite.LastError()<<std::endl;
25 }
26if(stmt->Bind(1, 4)){
27 std::cout<<"value 4 successfully bound at pos 1"<<std::endl;
28 }
29else{
30 std::cout<<"value 4 NOT successfully bound at pos 1:"<<sqlite.LastError()<<std::endl;
31 }
32
33// 第一次执行Execute
34if(stmt->Execute()){
35 std::cout<<"statement executed"<<std::endl;
36 }
37else{
38 std::cout<<"error executing statement: "<<sqlite.LastError()<<std::endl;
39 }
40
41if(stmt->Bind(0, 5)){
42 std::cout<<"value 5 successfully bound at pos 0"<<std::endl;
43 }
44else{
45 std::cout<<"value 5 NOT successfully bound at pos 0"<<std::endl;
46 }
47
48if(stmt->Bind(1, 6)){
49 std::cout<<"value 6 successfully bound at pos 1"<<std::endl;
50 }
51else{
52 std::cout<<"value 6 NOT successfully bound at pos 1"<<std::endl;
53 }
54
55// 第二次执行Execute
56if(stmt->Execute()){
57 std::cout<<"statement executed"<<std::endl;
58 }
59else {
60 std::cout<<"error executing statement: "<<sqlite.LastError()<<std::endl;
61 }
62
63return0;
64 }
 
3.4 输出数据库数据:Print_DB_Data.cpp
 
 
 
1/*
2 * 功能:演示了使用类成员函数获取数据库表的数据,并将数据输出到屏幕
3 * Statement():返回一个指向SQLiteStatement类的指针
4 * NextRow():只要数据未取完,就返回True
5 * DataType():返回访问列的数据类型
6 * ValueString():返回std::string.
7 */
8 #include <iostream>
9 #include "SQLiteWrapper.h"
10
11int main(){
12 SQLiteWrapper sqlite;
13if (sqlite.Open("SQLiteWrapper.db")){
14 std::cout<<"SQLiteWrapper.db created or opened"<<std::endl;
15 }
16else{
17 std::cout<<"couldn't open SQLiteWrapper.db"<<std::endl;
18 }
19
20 SQLiteStatement* stmt=sqlite.Statement("select * from foo");
21
22while(stmt->NextRow()){
23 std::cout<<stmt->DataType (0)<<" - "<<stmt->DataType (1) <<" | "<<
24 stmt->ValueString(0)<<" - "<<stmt->ValueString(1)<<std::endl;
25 }
26
27return0;
28 }
 
三、后记:
 
感叹SQLite的博大精深。
 
~~~路漫漫其修远兮,吾将上下而求索。
 

sqlite3-入门日记4-实现C++类封装的更多相关文章

  1. .Net Core ORM选择之路,哪个才适合你 通用查询类封装之Mongodb篇 Snowflake(雪花算法)的JavaScript实现 【开发记录】如何在B/S项目中使用中国天气的实时天气功能 【开发记录】微信小游戏开发入门——俄罗斯方块

    .Net Core ORM选择之路,哪个才适合你   因为老板的一句话公司项目需要迁移到.Net Core ,但是以前同事用的ORM不支持.Net Core 开发过程也遇到了各种坑,插入条数多了也特别 ...

  2. 090 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 04 使用包进行类管理(2)——导入包

    090 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  3. 089 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 使用包进行类管理(1)——创建包

    089 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  4. 小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_40、Redis工具类封装讲解和实战

    笔记 4.Redis工具类封装讲解和实战     简介:高效开发方式 Redis工具类封装讲解和实战         1.常用客户端 https://redisdesktop.com/download ...

  5. XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)

    XML序列化   #region 序列化 /// <summary> /// XML序列化 /// </summary> /// <param name="ob ...

  6. ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪

    ASP.NET MVC深入浅出(被替换)   一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...

  7. 092 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 02 static关键字(中)

    092 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  8. 091 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 01 static关键字(上)

    091 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  9. salesforce 零基础学习(四十八)自定义列表分页之Pagination基类封装 ※※※

    我们知道,salesforce中系统标准列表页面提供了相应的分页功能,如果要使用其分页功能,可以访问http://www.cnblogs.com/zero-zyq/p/5343287.html查看相关 ...

随机推荐

  1. ElasticSearch 索引查询使用指南

    1.检测集群是否健康,我们通常用下面的命令.确保9200端口号可用: http://localhost:9200/_cat/health?v 或者 http://localhost:9200/_clu ...

  2. IK的整个分词处理过程

    首先,介绍一下IK的整个分词处理过程: 1. Lucene的分词基类是Analyzer,所以IK提供了Analyzer的一个实现类IKAnalyzer.首先,我们要实例化一个IKAnalyzer,它有 ...

  3. IRP FLAGS

    IRP所有标识位的含义,是 _IRP . flags 这个成员 IRP_NOCACHE 0x00000001 //表示I/O请求从存储的媒介而不是高速缓存中读取数据 IRP_PAGING_IO 0x0 ...

  4. 在Linux(centos)下,安装Apache和PHP环境

    1001  ll /opt/lampp/modules/ 1002  history | grep httpd 1003  vim /etc/httpd/conf/httpd.conf 1004  v ...

  5. JS对象 String 字符串对象定义字符串的方法就是直接赋值。比如: var mystr = "I love JavaScript!"

    String 字符串对象 在之前的学习中已经使用字符串对象了,定义字符串的方法就是直接赋值.比如: var mystr = "I love JavaScript!" 定义mystr ...

  6. JS事件 失焦事件(onblur)onblur事件与onfocus是相对事件,当光标离开当前获得聚焦对象的时候,触发onblur事件,同时执行被调用的程序。

    失焦事件(onblur) onblur事件与onfocus是相对事件,当光标离开当前获得聚焦对象的时候,触发onblur事件,同时执行被调用的程序. 如下代码, 网页中有用户和密码两个文本框.当前光标 ...

  7. ASP.NET MVC easyUI-datagrid 的当前页合计and总合计

    一.HTML代码 <table id="dg" class="easyui-datagrid" style="width: 100%; heig ...

  8. 【2-SAT】[JSOI2010]满汉全席

    感觉方法和题解差不多,但是题解写的好烦啊...也不是烦,就是很复杂 这里建议开一个数组表示当前这个点选或者不选的编号,这样之后自己理思路也会清楚一点 然而我调了一个小时才发现我是Tarjan写错了.. ...

  9. Es567严格模式

    Es5 严格模式 http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html 除了正常运行模式(混杂模式),ES5添加了第二种 ...

  10. PHP微信公众号支付弹出“NaN:undefined”解决方法

    最近研究php微信支付开发,从微信官方下载了微信支付的demo后,测试时总是弹出NaN:Undefined这样的错误提示.不过这个并不影响支付的操作,支付成功后依然可以正常获取到支付状态,并进行跳转. ...