Visual Studio .NET 的 DAO 类向导






2.80/5 (5投票s)
2002 年 8 月 27 日
10分钟阅读

83683

636
在 Visual Studio .NET 中为 MS Access 表创建和维护 CDAORecordset 类
这是什么?
这是 Visual Studio .NET C++ 开发人员的附加组件,它可以帮助您创建和维护 CDaoRecordset
类。CDaoRecordset
类通常用于处理 Microsoft Access 表。由于 Microsoft 已移除其在 Visual Studio .NET 中的原始 DAO 类向导(您可能从以前的 VStudio 版本(例如 6.0)中知道这一点),因此需要手动添加和维护 .NET 中的 CDaoRecordsets
、字段变量以及所有其他内容。现在,您可以使用此向导再次处理 Access 数据库。此向导也具有高度可配置性。您可以自定义新类的样式和一些基本功能,并使用自定义 DFX 例程、数据类型和变量初始化器。
为什么会有这个?
当我从 Visual Studio 6.0 切换到 .NET 时,我不得不继续处理一个使用了 100 多个 Microsoft Access 表的大型项目,而且只有一半的表已经完成并连接到 CDaoRecordset
类。我想使用 Visual Studio .NET 和 MFC 7.0 的一些新功能。这就是为什么我选择在 .NET 中继续该项目,而不是在 Visual Studio 6.0 中。该项目使用非默认 DFX 例程和自定义数据类型。此外,新表类的基类不是 CDaoRecordset
而是 CIBTable
。(原始向导仅创建直接派生自 CDaoRecordset
的类)。使用旧的原始 DAO 类向导,我不得不手动重命名所有成员变量的类型标识符,手动调整 DFX 调用,手动添加其他 include 文件,手动调整构造函数参数和基类。现在,在 .NET 中,我甚至不得不手动创建类。我想要回 DAO 类向导!由于没有,所以我决定开发这个。
源代码和功能
此程序是匆忙编写的,因此请注意可能存在的 bug。源代码未包含,因为它是一团糟,第三方阅读起来会很痛苦。如果您发现 bug 或遗漏了什么,请通过 drice@ageone.de 与我联系,我可能会实现或修复它。但是,如果您确实想要源代码,您可以向我索取。
使用 DAOClassWizard
DAOClassWizard 只能与 C++ 项目一起使用,不能与 C# 或其他语言一起使用。您在 Visual-Studio .NET IDE 中加载的解决方案可以包含 C# 或其他项目,但必须至少包含一个 C++ 项目。
要使用该向导,请启动 Visual Studio NET IDE 并加载一个 C++ 项目,然后运行 DAOClassWizard.exe。该向导将自动连接到您的 Visual Studio .NET IDE 并查询有关已加载解决方案的信息。运行该向导时,您将看到一个包含一些组合框、按钮和一个大型列表视图的对话框。
在对话框顶部,有两个输入行。第一个(灰色)是当前加载的数据库的名称(完整路径)。第二个是一个组合框,列出了数据库中所有可用的表。
在数据库字段下方是另一个包含两个组合框的组框。上面的组合框包含当前解决方案中的所有项目。第二个包含所选项目中的可用类。请注意,类组合框中只包含与记录集(表)相关的类。其他类不显示。
“绑定”列表视图列出了所选类的成员变量以及所选数据库中绑定到成员变量的字段。请注意,“成员变量”一词仅指在类声明中的 //{{AFX_FIELD ... //}}AFX_FIELD
注释块中包含的变量。
列表视图有四列,分别名为 DB.Field
、DB.Type
、C++ 类型和 C++ 变量标识符。第一列包含所选表字段的原始名称。DB.Type 列列出了相应的数据库类型。第三列包含 C++ 类型标识符(例如 long、CString
...),第四列列出了变量标识符(例如 m_dwMyValue1
...)。
根据您选择的表和类,列表视图将显示多行。每行都指一个成员变量和/或表字段。
如果表包含一个名为 FIELD1 的字段,但没有类变量绑定到该字段,则 C++ 类型和 C++ 变量标识符列为空。如果存在未绑定到任何字段的成员变量,则 DB.Field 和 DB.Type 列为空。
DAOClassWizard 使用您 .CPP 文件中的 //{{AFX_FIELD_MAP ... //}}AFX_FIELD_MAP
注释块的内容来确定哪个字段绑定到哪个变量。
添加、重命名和删除变量
首先选择要处理的表和类。要添加、重命名或删除变量,请在“绑定”列表视图中选择一个项目,单击鼠标右键,然后从出现的上下文菜单中选择一个命令。单击“添加变量”时,会弹出一个对话框,DAOClassWizard 会建议一个 C++ 类型和变量标识符,您可以对其进行修改。
您可以为特定字段类型配置应建议的 C++ 类型。例如,如果您为一个名为“UserName”且类型为 TEXT 的字段添加变量,该向导会建议 CString
作为类型标识符,并建议 m_csUserName
作为变量名。类型 CString
和变量前缀 m_cs
可以配置。
为表添加新类
要为表添加新类,请先选择一个表,然后单击“创建类”。该向导会建议类的名称以及声明/实现该类的文件名。您可以更改类名和文件名。
在出现的对话框中,单击“确定”来创建类。请注意,此时不会创建任何文件,也不会向您的 Visual Studio 项目添加任何项。新类的文件将在您在主对话框中单击“确定/应用更改”按钮时创建并添加到项目中。
配置 DAOClassWizard
您可能已经注意到,DAOClassWizard 对话框的左上角有一个名为“设置”的菜单。有两个命令:“类创建选项”和“数据库/C++ 类型设置”。
类创建选项
您可以使用类创建选项来修改 DAOClassWizard 创建新类的样式。“类创建选项”对话框中有几个字段,将在下面进行解释。
新类前缀、后缀、参数、基类名称和初始化字符串
当您使用 DAOClassWizard 创建新类时,该向导会建议一个新类的名称。您可以使用“新类前缀”和“后缀”字段来配置此建议。建议的类名将按以下方式构成:<prefix>+<TableName>+<Suffix></code>
因此,如果您的表名为 Employees
,前缀为 C
,后缀为 Table
,则建议的类名将是 CEmployeesTable
。您可以在类创建时在另一个对话框中修改此名称。这里的这些设置只是为了帮助您加快过程。
您可能知道,大多数类都派生自基类。这个基类的名称可以在“基类名称”字段中指定。通常,您在此字段中输入字符串 CDaoRecordset。继续我们的 employees 示例,类声明将如下所示:class CEmployeesTable : CDaoRecorsdset {
如果将“基类名称”字段留空,则类声明将是:class CEmployeesTable {
您创建的每个类都有一个构造函数。该构造函数在 .H 文件中声明,在 .CPP 文件中实现。构造函数可以有参数,并且基类可以使用这些参数进行初始化。使用“新类参数”和“基类初始化字符串”字段来修改此行为:新类的构造函数声明将按以下方式创建:<classname>+"("+<parameters>+")"
因此,如果您在“参数”字段中输入字符串 CDaoDatabase *pDB,则 .H 文件中的构造函数声明将如下所示。CEmployeesTable(CDaoDatabase *pDB) {
要初始化基类,请在“基类初始化”中输入整个参数字符串,例如 (pDB)
。构造函数的实现将如下所示:CEmployeesTable::CEmployeesTable(CDaoDatabase *pDB) : public CDaoRecordset(pDB) {
};
如果将“基类初始化字符串”留空,则构造函数将是:CEmployeesTable::CEmployeesTable(CDaoDatabase *pDB) {
};
缩进
创建新类的代码时,您可以控制代码行的缩进。使用作用域修饰符缩进,您可以控制 private、public 等关键字的缩进。使用 AFX_FIELD
块缩进,您可以控制其他代码的缩进。我不想在此详细解释,请自行尝试。
其他文件内容
当向导创建新类的文件时,您可以指定应插入到文件开头的其他代码。通常在此处输入您的 #include 预处理器语句。默认是 #include "stdafx.h"。
数据库/C++ 类型设置
激活此命令时,将出现一个带有网格(这是 Chris Maunder 的 MFCGridControl
)的对话框。该网格包含 30 行和 5 列标题,分别为 DB.Type、C++ Type、Var.Prefix、Initializer 和 DFX-Routine。当向导创建代码或建议任何内容(如类型标识符、变量名...)时,它会查找此表。
当向导为您建议变量名或类型标识符时,它会在网格中查找数据库字段的字段类型,然后从相应的行中获取 C++ 类型标识符和变量前缀,并将其应用于建议。
例如,如果您激活“绑定”列表视图中的“添加变量”命令,用于一个 MEMO 类型的数据库字段(我们将其命名为 Notes),则向导知道该字段的类型是 dbMemo。然后它会在网格中查找字符串 dbMemo,从找到的行中获取 C++ 类型和变量标识符前缀,并建议 CString 作为类型标识符,m_csNotes 作为变量标识符。
当向导创建新类时,它必须创建代码。此代码主要由三个部分组成,这些部分包含在注释块中。您可能已经知道我在说什么了。//{{AFX_FIELD
注释。
这些部分具有开始注释,如 //{{AFX_FIELD
、//{{AFX_FIELD_INIT
和 //{{AFX_FIELD_MAP
,以及相应的结束注释,如 //}}AFX_FIELD
、//}}AFX_FIELD_INIT
和 //}}AFX_FIELD_MAP
。这些注释之间的行是向导维护的代码。
//AFX_FIELD
块包含在 .H 文件中,包含变量声明,//AFX_FIELD_INIT
和 //AFX_FIELD_MAP
块位于 .CPP 文件中。//AFX_FIELD_INIT
字段位于类的构造函数内,用于在类初始化时将变量初始化为默认值。//AFX_FIELD_INIT
部分可能如下所示:
//{{AFX_FIELD_INIT(CEmployeesTable)
m_csFirstName = _T("");
m_csLastName = _T("");
m_dtBirthday = COleDateTime(0);
m_fSalary = 0.0;
//}}AFX_FIELD_INIT
初始化器(赋值运算符 = 右侧)来自网格的初始化器列。当向导为此部分编写代码时,它会在网格中查找 C++ 类型标识符(C++ Type 列),并使用找到的行中的初始化器。
例如,如果您有一个名为 FirstName
的字段(它是 TEXT (dbText) 类型字段),并且您将变量 CString m_csFirstName
绑定到该字段,则向导会在网格中查找 CString
,然后获取初始化器,即 CString
的默认值 _T("")
,并输出 m_csFirstName = _T("");
如果网格中的初始化器字符串留空,则变量不会在 //AFX_FIELD_INIT
部分中初始化。
某些变量(类的实例)无法赋值,或者必须通过调用类的某个方法来初始化。如果网格中的初始化器字符串以句点 (.) 开头,则向导不会编写赋值语句,但会编写一个方法调用。
例如,如果您将 CString
行中的初始化器 _T("")
替换为 .Empty()
,则向导会创建代码 m_csFirstName.Empty();
而不是 m_csFirstName = _T("");
//AFX_FIELD_MAP
部分用于在类的成员变量和数据库字段之间进行数据交换。MFC 提供了几种标准的 DFX 例程,但您也可以编写自己的自定义 DFX 例程(有关如何编写自定义 DFX 例程的更多信息,请参阅 MSDN 库)。
同样,当向导为此部分编写代码时,它会在网格中查找成员变量的 C++ 数据类型,并使用相应的 DFX 例程。
例如,如果您再次拥有变量 CString m_csFirstName
,则向导会在网格中查找 CString
,找到 DFX 例程 DFX_Text
,并输出代码:DFX_Text(pFX, _T("[FirstName]"), m_csFirstName);
重置配置
如果您想恢复向导的默认配置,请退出向导,打开注册表编辑器,转到 HKEY_CURRENT_USER\Software\BluePearl
并删除那里的 DAOClassWizard
键。然后重新启动 DAOClassWizard。
结论
好了,就是这样!如果您有任何疑问或意见,请通过 drice@ageone.de 与我联系。