SQLiteTbl,一个为 SQLite 提供类似 CRecordSet 接口的 C++ 类






4.97/5 (20投票s)
一个用于 SQLite 数据库表的类似 CRecordSet 的接口。
引言
我正在开发一个通过 ODBC 连接到 Jet 数据库引擎的应用程序,它有一个 CRecordSet
接口。它运行正常,我们遇到的问题很少。但偶尔,我们会遇到一些客户,他们的 MDAC/ODBC 安装不知何故损坏了,远程修复非常麻烦。
考虑到这一点,我认为使用一个更受我们自己控制的不同数据库引擎会更好。经过一些研究,SQLite 的选择是显而易见的。该引擎完全免费且开源。它也很快,可以直接编译到您的应用程序中。不再依赖其他系统软件。有关更多信息,请参见此链接。
SQLite 是一个免费数据库。 这是他们网站上的介绍:“SQLite 是一个进程内库,它实现了一个独立的、无服务器的、零配置的、事务性的 SQL 数据库引擎。 SQLite 的代码位于公共领域,因此可以免费用于任何目的,无论是商业用途还是私人用途。”
所有这些听起来都很令人兴奋,直到我意识到要重写我们的代码以停止使用 CRecordSet
接口并不容易。我四处寻找,但找不到任何类似的东西。考虑到这一点,我决定创建自己的包装类。
我希望 SQLiteTbl
非常相似,但不一定是 CRecordSet 的完全替代品。 我从头开始创建了 SQLiteTbl
。 我这样做没有依赖任何其他模板/库,例如 MFC 或 STL。 我需要一个用于 BLOB 数据以及字符串数据的容器,所以我创建了自己的 SQLiteBlob
和 SQLiteString
对象。 SQLiteTbl
提供了对指定表中数据值进行数据成员访问的能力。 您可以排序、过滤、删除和添加新记录。 如果需要,您也可以直接执行 SQL 语句。
使用代码
为了使用 SQLiteTbl
,您需要下载 SQLite 并将其添加到您的项目中。 SQLiteTbl
希望在您的 include 路径中找到 *sqlite3.h* 和 *sqliteInt.h*。 我有一个示例 MFC Visual Studio 项目,展示了如何使用 SQLiteTble
。
SQLiteTbl
是一个抽象基类。 您需要实例化一个派生的 SQLiteTbl
才能使此工作正常。 您需要为数据库中的每个表都有一个派生的 SQLiteTbl
。
示例类
这是一个数据库中 *Cars* 表的示例
cars.h:
class CarsTbl : public SQLiteTbl
{
public:
CarsTbl();
virtual bool Open(const char* pFile);
virtual const char* TableName();
virtual int ItemCount();
//data members of the table
//0
SQLiteString m_make;
SQLiteString m_model;
int m_year;
double m_weight;
SQLiteString m_color;
//5
SQLiteString m_license;
SQLiteBlob m_picture;
};
cars.cpp:
#include “SQLiteTbl.h”
CarsTbl::CarsTbl()
{
//these must match table in .h
//0
SetItem(0, "Make", MYDB_TYPE_TEXT, &m_make);
SetItem(1, "Model", MYDB_TYPE_TEXT, &m_model);
SetItem(2, "Year", MYDB_TYPE_INT, &m_year);
SetItem(3, "Weight", MYDB_TYPE_DOUBLE, &m_weight);
SetItem(4, "Color", MYDB_TYPE_TEXT, &m_color);
//5
SetItem(5, "License", MYDB_TYPE_TEXT, &m_license);
SetItem(6, "Color Picture", MYDB_TYPE_BLOB, &m_picture);
}
int CarsTbl::ItemCount() { return 7; } //must match items listed above
const char* CarsTbl::TableName() { return "DMV Cars"; }
bool CarsTbl::Open(const char* pFile)
{
if (SQLiteTbl::Open(pFile)) {
if (Query())
return true;
}
//anything goes wrong, close and return false
Close();
return false;
}
这里有一些使用它的基本代码
CarsTbl myTable;
If (myTable.Open(“c:\temp\cars.sqlite”)) {
//access data
myTable.MoveFirst();
const char* pMake = myTable.m_make;
const char* pModel = myTable.m_model;
int year = myTable.m_year;
...
//add new item
myTable.AddNew();
myTable.m_make = “Ford”;
myTable.m_model = “Focus”;
myTable.m_year = 2002;
myTable.Update();
//get the table count
int count = myTable.GetCount();
//sort
myTable.SetSort(“[Make] ASC, [Year] DESC”);
myTable.Query();
//filter
myTable.SetFilter(“[Make]=\’Ford\’, [Model]=\’Mustang\’”);
myTable.Query();
}
示例项目,“SQLiteTbl Test”
我包含了一个可以在 Visual Studio 2005 或 Visual C++ 6.0 上编译的示例项目。 您应该从此处获取最新版本的 SQLite。 项目中有一个 *readme.txt*,描述了如何构建项目。 这是一个简单的基于对话框的应用程序,它使用 SQLiteTbl
类作为 CarsTbl
。
关注点
顺便说一句,有一个名为“SQLite Manager”的 Firefox 插件,我在使用 SQLite 数据库时发现它非常有用。
如果您还没有看过 SQLite 许可证,请看这里
** The author disclaims copyright to this source code. In place of
** a legal notice, here is a blessing:
**
** May you do good and not evil.
** May you find forgiveness for yourself and forgive others.
** May you share freely, never taking more than you give.
**
****************************************************
这不是一个很棒的许可证吗?
历史
- 1.3 版 - 2008 年 12 月 2 日。