65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (22投票s)

2007年12月21日

CPOL

4分钟阅读

viewsIcon

108640

downloadIcon

2408

ADO 的 C++ 类包装器。

Screenshot - dbAx.jpg

引言

我长期以来从事数据库设计和实现工作,主要使用 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。主要类是:CAxConnectionCAxCommandCAxRecordset。正如您可能猜到的,这些类支持数据库信息的连接和访问。

为了支持这些主要类,还有 CAxExceptionCAxConnectionEventsCAxRecordsetEventsCAxException 类提供了异常处理功能,而 CAxConnectionEventsCAxRecordsetEvents 类则能够处理数据提供者可能引发的事件。

以下是入门的快速指南。同样,包含的帮助文件提供了更详细的信息。

  1. AxLib 中包含的所有文件添加到您的项目中。它们是:AxLib.hAxConnection.cppAxCommand.cppAxRecordset.cppAxException.cpp
  2. 创建 CAxCommand 的派生版本(如果涉及存储过程),并实现虚函数 _CreateParameters_UpdateParameters
  3. 创建 CAxRecordset 的派生版本,并实现虚函数 _SetDefaultValuesDoFieldExchange
  4. 创建 CAxConnection 对象以及派生版本的 CAxCommandCAxRecordset 对象的实例(成员变量)。

在您的应用程序中,通常主程序会

  • 调用 dbAx::Init() 方法来初始化库。
  • 设置将与 CAxConnection 对象一起使用的连接字符串。
  • 设置并初始化每个 CAxCommand 对象(如果存在)。
  • 打开 CAxRecordset 对象,可以直接打开,也可以通过关联的 CAxCommand 对象打开。
  • 在程序终止时,调用 dbAx::Term() 方法。

AxGen

如前所述,CAxCommandCAxRecordset 类定义了通常会被覆盖的虚函数,并且包含对其他类方法的调用,用于创建和更新参数,以及交换 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
© . All rights reserved.