dbAx:用于 ActiveX 数据对象 (ADO) 的 C++ 库






4.93/5 (22投票s)
ADO 的 C++ 类包装器。
引言
我长期以来从事数据库设计和实现工作,主要使用 Microsoft SQL Server。我还是一个铁杆的 C++ 爱好者。老一代的技术为我们提供了 Data Access Objects (DAO),它为 C++ 用户提供了一个相当不错的接口。然后 ActiveX Data Objects (ADO) 出现了。这是一个很棒的环境,但对 C++ 开发者支持不多。我感觉自己像个红头发的孤儿继子。
正如我所说,我生活、吃饭、睡觉都在 C++ 中。我对文档管理(这是另一个话题)以及与其他许多应用程序和库的接口也非常热情,其中大多数都涉及到某种形式的数据库访问。我知道,我知道。有 VB:我不想去那里。还有 .NET:我还没有(完全)在那里!
直奔主题:这激励我开发了自己的类集,以减轻所有 C++ 开发者在数据库操作方面的痛苦。我没有想出任何包含“A”、“D”和“O”的其他变体,而是选择了 dbAx 这个名字。
背景
实际上,dbAx
是一个由 C++ 类组成的库,这些类统称为 AxLib
,还有一个名为 AxGen
的小型实用程序。AxLib
包含连接到数据源和命令的类,以及用于处理实际数据表的 recordset
类。AxGen
实用程序允许您轻松创建自定义版本的命令和 recordset
类,以应对当前的挑战。
使用 dbAx
的一些好处包括:无需处理 COM 接口和指针,可以轻松实现参数化查询(存储过程),并避免操作变体数据类型。该库会自动处理与原生 C++ 类数据成员之间的转换。
在继续之前,应该指出的是,可下载的文件中包含了一个 Windows 编译的帮助文件,其中涵盖了 dbAx
的所有方面。我在这里只提主要几点。此外,还有一个名为 CardFile
的示例应用程序,演示了 dbAx
库的许多功能。
Using the Code
AxLib
定义了六个类,其中一些类具有 virtual
方法,并 intended to act as a base class for an application-specific version。主要类是:CAxConnection
、CAxCommand
和 CAxRecordset
。正如您可能猜到的,这些类支持数据库信息的连接和访问。
为了支持这些主要类,还有 CAxException
、CAxConnectionEvents
和 CAxRecordsetEvents
。CAxException
类提供了异常处理功能,而 CAxConnectionEvents
和 CAxRecordsetEvents
类则能够处理数据提供者可能引发的事件。
以下是入门的快速指南。同样,包含的帮助文件提供了更详细的信息。
- 将
AxLib
中包含的所有文件添加到您的项目中。它们是:AxLib.h、AxConnection.cpp、AxCommand.cpp、AxRecordset.cpp 和 AxException.cpp。 - 创建
CAxCommand
的派生版本(如果涉及存储过程),并实现虚函数_CreateParameters
和_UpdateParameters
。 - 创建
CAxRecordset
的派生版本,并实现虚函数_SetDefaultValues
和DoFieldExchange
。 - 创建
CAxConnection
对象以及派生版本的CAxCommand
和CAxRecordset
对象的实例(成员变量)。
在您的应用程序中,通常主程序会
- 调用
dbAx::Init()
方法来初始化库。 - 设置将与
CAxConnection
对象一起使用的连接字符串。 - 设置并初始化每个
CAxCommand
对象(如果存在)。 - 打开
CAxRecordset
对象,可以直接打开,也可以通过关联的CAxCommand
对象打开。 - 在程序终止时,调用
dbAx::Term()
方法。
AxGen
如前所述,CAxCommand
和 CAxRecordset
类定义了通常会被覆盖的虚函数,并且包含对其他类方法的调用,用于创建和更新参数,以及交换 recordset
的字段数据。这涉及到将数据库字段映射到成员变量并指示正确的 SQL 数据类型。这可能会变得非常繁琐且容易出错,尤其是在表具有大量数据字段的情况下。
AxGen
是一个实用程序,它尝试连接到目标数据提供者并读取存储过程和数据表的架构。然后,您可以指定一个名称并快速生成自定义派生类的源代码。这可以节省大量时间,尤其是在数据库结构可能处于不断变化状态的开发过程中。AxGen
还实现了 Microsoft 的连接向导,您可以在其中为特定的数据提供者构建所需的连接字符串。下面是一个由 AxGen
创建的 CAxRecordset
类的示例
/**************************************************************************
File: AxAccountSet.hpp
Date: 11/22/2007
By: Data Management Systems (www.dmsic.com)
DESCRIPTION
The following source code was generated using the AxGen utility and is
intended to be used in conjunction with the dbAx library. This class
facilitates the exchange of data with the ADO data source from which
it was derived.
Table: (local)\CardFile\ACCOUNT
Include this file in your project.
DISCLAIMER
This source code is provided AS-IS with no warranty as to its
suitability or usefulness in any application in which it may be used.
**************************************************************************/
#pragma once
#include <AxLib.h>
using namespace dbAx;
class CAxAccountSet :
public CAxRecordset
{
public:
CAxAccountSet() { _SetDefaultValues(); }
~CAxAccountSet() { }
CString m_szAccountID;
CString m_szName;
CString m_szAddress;
CString m_szPhone1;
CString m_szPhone2;
CString m_szEmail;
CString m_szNote;
//Set default values of class members
void _SetDefaultValues()
{
m_szAccountID = _T("");
m_szName = _T("");
m_szAddress = _T("");
m_szPhone1 = _T("");
m_szPhone2 = _T("");
m_szEmail = _T("");
m_szNote = _T("");
};
//Exchange field values with data provider
void DoFieldExchange(bool bSave = FALSE)
{
FX_VarChar (bSave, _T("AccountID"), m_szAccountID);
FX_VarChar (bSave, _T("Name"), m_szName);
FX_Text (bSave, _T("Address"), m_szAddress);
FX_VarChar (bSave, _T("Phone1"), m_szPhone1);
FX_VarChar (bSave, _T("Phone2"), m_szPhone2);
FX_VarChar (bSave, _T("Email"), m_szEmail);
FX_Text (bSave, _T("Note"), m_szNote);
};
};
结论
开发该库让我对 ADO、COM 和编程有了更深入的了解。我可以肯定地说,我已经尽了最大的努力来生产一个可用且无 bug 的库,但我的工作/测试环境有限,总会有一两个会漏掉。当然,欢迎任何关于错误和可用性的反馈。我希望 dbAx
对所有决定尝试它的人来说都能证明是有用的。
历史
- 21/12/07 v1.0 初始发布
- 25/01/08 修正了
AxGen
模块中的错误,这些错误导致生成了错误的源代码 - 05/03/08 v1.10 多项更新、代码修复、代码生成以及更多内容;详情请参阅 AxLib.h 修订历史记录
- 01/20/09 v1.2 错误修复和代码更新。详情请参阅 AxLib.h