MFC:结合文档和视图使用数据库类

你可以使用带或不带文档/视图体系结构的 MFC 数据库类。 本主题强调使用文档和视图。 本主题介绍以下内容:

对于替代方案,请参阅MFC:不结合文档和视图使用数据库类

编写基于窗体的应用程序

许多数据访问应用程序都基于窗体。 用户界面是一种包含控件的窗体,用户可以在其中检查、输入或编辑数据。 要使你的应用程序是基于窗体,请使用 CRecordView 类。 当你运行 MFC 应用程序向导并在“数据库支持”页面上选择 ODBC 客户端类型时,该项目将用于视图类。CRecordView

在基于窗体的应用程序中,每个记录视图对象都存储一个指向 CRecordset 对象的指针。 框架的记录字段交换 (RFX) 机制可在记录集和数据源之间交换数据。 对话数据交换 (DDX) 机制在记录集对象的字段数据成员与窗体上的控件之间交换数据。 CRecordView 还提供默认的命令处理函数,用于在窗体上从记录导航到记录。

要使用应用程序向导创建基于窗体的应用程序,请参阅创建基于窗体的 MFC 应用程序数据库支持,MFC 应用程序向导

有关窗体的完整讨论,请参阅记录视图

在文档和视图中使用记录集

许多简单的基于窗体的应用程序不需要文档。 如果你的应用程序更复杂,你可能希望使用文档作为数据库的代理,用于存储连接到数据源的 CDatabase 对象。 基于窗体的应用程序通常在视图中存储指向记录集对象的指针。 其他类型的数据库应用程序在文档中存储记录集和 CDatabase 对象。 以下是在数据库应用程序中使用文档的一些可能性:

  • 如果你在本地上下文中访问记录集,请根据需要在文档或视图的成员函数中以局部方式创建 CRecordset 对象。

    将记录集对象声明为函数中的局部变量。 将 NULL 传递给构造函数,这会导致框架为你创建并打开一个临时 CDatabase 对象。 作为替代方案,传递一个指向 CDatabase 对象的指针。 使用函数内的记录集,并让记录集在函数退出时自动销毁。

    当你将 NULL 传递给记录集构造函数时,框架使用记录集的 GetDefaultConnect 成员函数返回的信息来创建 CDatabase 对象并打开此对象。 向导为你实现 GetDefaultConnect

  • 如果你在文档的生命周期内访问记录集,请在文档中嵌入一个或多个 CRecordset 对象。

    在初始化文档时或根据需要构造记录集对象。 你可以编写一个函数来执行以下操作:如果记录集已经存在,则返回指向记录集的指针;如果记录集尚不存在,则构造并打开记录集。 根据需要关闭、删除和重新创建记录集,或调用其 Requery 成员函数以刷新记录。

  • 如果你在文档的生命周期内访问数据源,请在文档中嵌入 CDatabase 对象,或在文档中存储指向 CDatabase 对象的指针。

    CDatabase 对象管理与你的数据源的连接。 此对象在文档构造过程中自动构造,在初始化文档时调用其 Open 成员函数。 当你在文档成员函数中构造记录集对象时,你传递一个指向文档的 CDatabase 对象的指针。 这将每个记录集与其数据源相关联。 数据库对象通常在文档关闭时被销毁。 记录集对象通常在它们退出函数作用域时被销毁。

其他因素

基于窗体的应用程序通常对框架的文档序列化机制没有任何用处,因此你可能希望移除、禁用或替换“文件”菜单上的“新建”和“打开”命令。 请参阅序列化:序列化与数据库输入/输出的对比一文。

你可能还想利用框架可以支持的许多用户界面可能性。 例如,你可以在拆分器窗口中使用多个 CRecordView 对象,在不同的多文档界面 (MDI) 子窗口中打开多个记录集,等等。

你可能希望打印视图中的任何内容,无论它是使用 CRecordView 实现的表单还是其他内容。 作为派生自 CFormView 的类,CRecordView 不支持打印,但你可以重写 OnPrint 成员函数以允许打印。 有关详细信息,请参阅 CFormView

你可能根本不想使用文档和视图。 在这种情况下,请参阅MFC:不结合文档和视图使用数据库类

另请参阅

MFC 数据库类