Share via


CDaoDatabase 类

表示使用数据访问对象 (DAO) 与 Access 数据库的连接。 DAO 通过 Office 2013 获得支持。 DAO 3.6 是最终版本,被视为已过时。

语法

class CDaoDatabase : public CObject

成员

公共构造函数

名称 描述
CDaoDatabase::CDaoDatabase 构造 CDaoDatabase 对象。 调用 Open 以将对象连接到数据库。

公共方法

名称 描述
CDaoDatabase::CanTransact 如果数据库支持事务,则返回非零。
CDaoDatabase::CanUpdate 如果 CDaoDatabase 对象可更新(非只读),则返回非零。
CDaoDatabase::Close 关闭数据库连接。
CDaoDatabase::Create 创建基础 DAO 数据库对象并初始化 CDaoDatabase 对象。
CDaoDatabase::CreateRelation 定义数据库中表之间的新关系。
CDaoDatabase::DeleteQueryDef 删除保存在数据库的 QueryDefs 集合中的 querydef 对象。
CDaoDatabase::DeleteRelation 删除数据库中表之间的现有关系。
CDaoDatabase::DeleteTableDef 删除数据库中表的定义。 这会删除实际表及其所有数据。
CDaoDatabase::Execute 执行操作查询。 为返回结果的查询调用 Execute 会引发异常。
CDaoDatabase::GetConnect 返回用于将 CDaoDatabase 对象连接到数据库的连接字符串。 用于 ODBC。
CDaoDatabase::GetName 返回当前正在使用的数据库的名称。
CDaoDatabase::GetQueryDefCount 返回为数据库定义的查询数。
CDaoDatabase::GetQueryDefInfo 返回有关数据库中定义的指定查询的信息。
CDaoDatabase::GetQueryTimeout 返回数据库查询操作超时后的秒数。影响所有后续打开、新增、更新和编辑操作以及(仅)对 ODBC 数据源的其他操作,例如 Execute 调用。
CDaoDatabase::GetRecordsAffected 返回受上次更新、编辑或添加操作或通过调用 Execute 影响的记录数。
CDaoDatabase::GetRelationCount 返回数据库中表之间定义的关系数。
CDaoDatabase::GetRelationInfo 返回有关数据库中表之间定义的指定关系的信息。
CDaoDatabase::GetTableDefCount 返回数据库中定义的表数。
CDaoDatabase::GetTableDefInfo 返回有关数据库中指定的表的信息。
CDaoDatabase::GetVersion 返回与数据库关联的数据库引擎的版本。
CDaoDatabase::IsOpen 如果 CDaoDatabase 对象当前连接到数据库,则返回非零。
CDaoDatabase::Open 建立到数据库的连接。
CDaoDatabase::SetQueryTimeout 设置数据库查询操作(仅对 ODBC 数据源上)超时后的秒数。影响所有后续打开、新增、更新和删除操作。

公共数据成员

“属性” 描述
CDaoDatabase::m_pDAODatabase 指向基础 DAO 数据库对象的指针。
CDaoDatabase::m_pWorkspace 指向包含数据库并定义其事务空间的 CDaoWorkspace 对象的指针。

备注

有关支持的数据库格式的信息,请参阅 GetName 成员函数。 可以在给定的“工作区”中同时激活一个或多个 CDaoDatabase 对象,该“工作区”由 CDaoWorkspace 对象表示。 该工作区维护一组打开的数据库对象,称为“Databases 集合”。

使用情况

创建记录集对象时,可以隐式创建数据库对象。 但也可以显式创建数据库对象。 要通过 CDaoDatabase 显式使用现有数据库,请执行以下任一操作:

  • 构造一个 CDaoDatabase 对象,传递一个指向打开的 CDaoWorkspace 对象的指针。

  • 或者,构造一个 CDaoDatabase 对象,不指定工作区(MFC 创建一个临时工作区对象)。

若要创建新的 Microsoft Jet (.MDB) 数据库,请构造一个 CDaoDatabase 对象,并调用其 Create 成员函数。 不要Create 之后调用 Open

若要打开现有数据库,请构造一个 CDaoDatabase 对象,并调用其 Open 成员函数。

这些技术中的任何一种都会将 DAO 数据库对象追加到工作区的 Databases 集合中,并打开一个与数据的连接。 然后,在构造 CDaoRecordsetCDaoTableDefCDaoQueryDef 对象以对连接的数据库执行操作时,请将指向 CDaoDatabase 对象的指针传递给这些对象的构造函数。 使用完连接后,调用 Close 成员函数并销毁 CDaoDatabase 对象。 Close 关闭之前未关闭的所有记录集。

事务

数据库事务处理是在工作区级别提供的,请参阅 CDaoWorkspace 类的 BeginTransCommitTransRollback 成员函数。

ODBC 连接

使用 ODBC 数据源的建议方法是将外部表附加到 Microsoft Jet (.MDB) 数据库。

集合

每个数据库都维护自己的 tabledef、querydef、记录集和关系对象的集合。 CDaoDatabase 类提供了用于操作这些对象的成员函数。

注意

这些对象存储在 DAO 中,而不是存储在 MFC 数据库对象中。 MFC 为 tabledef、querydef 和记录集对象提供类,但不为关系对象提供类。

继承层次结构

CObject

CDaoDatabase

要求

标头:afxdao.h

CDaoDatabase::CanTransact

调用此成员函数以确定数据库是否允许事务。

BOOL CanTransact();

返回值

如果数据库支持事务,则为非零;否则为 0。

备注

事务在数据库的工作区中进行管理。

CDaoDatabase::CanUpdate

调用此成员函数以确定 CDaoDatabase 对象是否允许更新。

BOOL CanUpdate();

返回值

如果 CDaoDatabase 对象允许更新,则为非零;否则为 0,表示在打开 CDaoDatabase 对象时在 bReadOnly 中传递了 TRUE,或者数据库本身是只读的。 请参阅 Open 成员函数。

备注

有关数据库可更新性的信息,请参阅 DAO 帮助中的主题“Updatable 属性”。

CDaoDatabase::CDaoDatabase

构造 CDaoDatabase 对象。

CDaoDatabase(CDaoWorkspace* pWorkspace = NULL);

参数

pWorkspace
指向将包含新数据库对象的 CDaoWorkspace 对象的指针。 如果接受默认值 NULL,构造函数会创建一个使用默认 DAO 工作区的临时 CDaoWorkspace 对象。 可以通过 m_pWorkspace 数据成员获取指向工作区对象的指针。

备注

构造对象后,如果要创建新的 Microsoft Jet (.MDB) 数据库,请调用对象的 Create 成员函数。 如果要打开现有数据库,则调用对象的 Open 成员函数。

完成对象的构造后,应调用其 Close 成员函数,然后销毁 CDaoDatabase 对象。

你可能会发现,将 CDaoDatabase 对象嵌入到文档类中是很方便的。

注意

如果打开 CDaoRecordset 对象而不传递指向现有 CDaoDatabase 对象的指针,也会隐式创建 CDaoDatabase 对象。 此数据库对象会在你关闭记录集对象时关闭。

CDaoDatabase::Close

调用此成员函数以断开与数据库的连接,并关闭与数据库关联的所有打开的记录集、tabledef 和 querydef。

virtual void Close();

备注

在调用此成员函数之前,最好自行关闭这些对象。 关闭 CDaoDatabase 对象会将其从关联的工作区中的 Databases 集合中移除。 由于 Close 不会销毁 CDaoDatabase 对象,因此可以通过打开相同的数据库或不同的数据库来重用该对象。

注意

在关闭数据库之前,对所有打开的记录集对象调用 Update 成员函数(如果有挂起的编辑)和 Close 成员函数。 如果退出在堆栈上声明 CDaoRecordsetCDaoDatabase 对象的函数,数据库将关闭,所有未保存的更改都将丢失,所有挂起的事务都将回滚,并且对数据的任何挂起的编辑都将丢失。

注意

如果尝试在任何记录集对象打开时关闭一个数据库对象,或者如果尝试在属于某特定工作区的任何数据库对象打开时关闭一个工作区对象,这些记录集对象将被关闭,任何挂起的更新或编辑都将回滚。 如果尝试在属于工作区对象的任何数据库对象打开时关闭一个工作区对象,该操作将关闭属于该特定工作区对象的所有数据库对象,这可能会导致未关闭的记录集对象被关闭。 如果不关闭数据库对象,MFC 会在调试生成中报告断言失败。

如果数据库对象是在函数范围之外定义的,并且你在没有关闭它的情况下退出函数,数据库对象将保持打开状态,直到被显式关闭或定义该函数的模块超出范围。

CDaoDatabase::Create

要创建新的 Microsoft Jet (.MDB) 数据库,请在构造 CDaoDatabase 对象后调用此成员函数。

virtual void Create(
    LPCTSTR lpszName,
    LPCTSTR lpszLocale = dbLangGeneral,
    int dwOptions = 0);

参数

lpszName
一个字符串表达式,它是要创建的数据库文件的名称。 它可以是完整的路径和文件名,例如“C:\\MYDB.MDB”。 必须提供名称。 如果没有提供文件扩展名,则会追加 .MDB。 如果你的网络支持统一命名约定 (UNC),还可以指定一个网络路径,例如“\\\\MYSERVER\\MYSHARE\\MYDIR\\MYDB”。 只有 Microsoft Jet (.MDB) 数据库文件可以使用此成员函数创建。 (字符串字面量中需要双反斜杠,因为“\”是 C++ 转义字符。)

lpszLocale
用于指定创建数据库的整理顺序的字符串表达式。 默认值是 dbLangGeneral。 可能的值为:

  • dbLangGeneral 英语、德语、法语、葡萄牙语、意大利语和现代西班牙语

  • dbLangArabic 阿拉伯语

  • dbLangCyrillic 俄语

  • dbLangCzech 捷克语

  • dbLangDutch 荷兰语

  • dbLangGreek 希腊语

  • dbLangHebrew 希伯来语

  • dbLangHungarian 匈牙利语

  • dbLangIcelandic 冰岛语

  • dbLangNordic 北欧语言(仅限 Microsoft Jet 数据库引擎版本 1.0)

  • dbLangNorwdan 挪威语和丹麦语

  • dbLangPolish 波兰语

  • dbLangSpanish 传统西班牙语

  • dbLangSwedfin 瑞典语和芬兰语

  • dbLangTurkish 土耳其语

dwOptions
一个整数,指示一个或多个选项。 可能的值为:

  • dbEncrypt 创建一个加密的数据库。

  • dbVersion10 使用 Microsoft Jet 数据库版本 1.0 创建数据库。

  • dbVersion11 使用 Microsoft Jet 数据库版本 1.1 创建数据库。

  • dbVersion20 使用 Microsoft Jet 数据库版本 2.0 创建数据库。

  • dbVersion30 使用 Microsoft Jet 数据库版本 3.0 创建数据库。

如果省略加密常量,则会创建一个未加密的数据库。 只能指定一个版本常量。 如果省略版本常量,则会创建一个使用 Microsoft Jet 数据库版本 3.0 的数据库。

注意

如果数据库未加密,即使实施了用户/密码安全,也有可能直接读取可构成数据库的二进制磁盘文件。

备注

Create 创建数据库文件和基础 DAO 数据库对象,并初始化 C++ 对象。 该对象被追加到关联的工作区的 Databases 集合。 数据库对象处于打开状态;不要在 Create 之后调用 Open*

注意

使用 Create,只能创建 Microsoft Jet (.MDB) 数据库。 无法创建 ISAM 数据库或 ODBC 数据库。

CDaoDatabase::CreateRelation

调用此成员函数以建立数据库主表中的一个或多个字段与外部表(数据库中的另一个表)中的一个或多个字段之间的关系。

void CreateRelation(
    LPCTSTR lpszName,
    LPCTSTR lpszTable,
    LPCTSTR lpszForeignTable,
    long lAttributes,
    LPCTSTR lpszField,
    LPCTSTR lpszForeignField);

void CreateRelation(CDaoRelationInfo& relinfo);

参数

lpszName
关系对象的唯一名称。 名称必须以字母开头,最多可以包含 40 个字符。 它可以包含数字和下划线字符,但不能包含标点符号或空格。

lpszTable
关系中主表的名称。 如果表不存在,MFC 将引发 CDaoException 类型的异常。

lpszForeignTable
关系中外表的名称。 如果表不存在,MFC 将引发 CDaoException 类型的异常。

lAttributes
一个长值,其中包含有关关系类型的信息。 此外,还可以使用此值强制实施引用完整性。 可以使用按位或运算符 (|) 来组合以下任何值(只要组合有意义):

  • dbRelationUnique 关系是一对一的。

  • dbRelationDontEnforce 不强制实施关系(没有引用完整性)。

  • dbRelationInherited 关系存在于包含两个附加表的非当前数据库中。

  • dbRelationUpdateCascade 更新将级联(有关级联的详细信息,请参阅“注解”)。

  • dbRelationDeleteCascade 删除将级联。

lpszField
一个指向以 null 结尾的字符串的指针,该字符串包含主表(由 lpszTable 命名)中一个字段的名称。

lpszForeignField
一个指向以 null 结尾的字符串的指针,该字符串包含外表(由 lpszForeignTable 命名)中一个字段的名称。

relinfo
CDaoRelationInfo 对象的引用,该对象包含有关要创建的关系的信息。

备注

该关系不能涉及来自外部数据库的查询或附加表。

当关系涉及两个表中的每一个表的一个字段时,使用该函数的第一个版本。 当关系涉及多个字段时,使用第二个版本。 关系中的最大字段数为 14。

此操作创建一个基础 DAO 关系对象,但这是一个 MFC 实现详细信息,因为 MFC 对关系对象的封装包含在 CDaoDatabase 类中。 MFC 并没有为关系提供一个类。

如果设置关系对象的属性以激活级联操作,那么,当对相关主键表进行更改时,数据库引擎会自动更新或删除一个或多个其他表中的记录。

例如,假设你在 Customers 表和 Orders 表之间建立了一个级联删除关系。 当你从 Customers 表中删除记录时,也会删除与该客户相关的 Orders 表中的记录。 此外,如果在 Orders 表和其他表之间建立级联删除关系,则在从 Customers 表中删除记录时,这些表中的记录会自动删除。

要了解相关信息,请参阅 DAO 帮助中的主题“CreateRelation 方法”。

CDaoDatabase::DeleteQueryDef

调用此成员函数以从 CDaoDatabase 对象的 QueryDefs 集合中删除指定的 querydef(已保存的查询)。

void DeleteQueryDef(LPCTSTR lpszName);

参数

lpszName
要删除的已保存查询的名称。

备注

之后,该查询不再在数据库中定义。

有关如何创建 querydef 对象的信息,请参阅 CDaoQueryDef 类。 当你构造 CDaoQueryDef 对象时,querydef 对象将与特定的 CDaoDatabase 对象相关联,并将指向数据库对象的指针传递给它。

CDaoDatabase::DeleteRelation

调用此成员函数以从数据库对象的 Relations 集合中删除现有关系。

void DeleteRelation(LPCTSTR lpszName);

参数

lpszName
要删除的关系的名称。

备注

之后,关系不再存在。

要了解相关信息,请参阅 DAO 帮助中的主题“Delete 方法”。

CDaoDatabase::DeleteTableDef

调用此成员函数以从 CDaoDatabase 对象的 TableDefs 集合中删除指定的表及其所有数据。

void DeleteTableDef(LPCTSTR lpszName);

参数

lpszName
要删除的 tabledef 的名称。

备注

之后,该表不再在数据库中定义。

注意

要非常小心,不要删除系统表。

有关如何创建 tabledef 对象的信息,请参阅 CDaoTableDef 类。 当你构造 CDaoTableDef 对象时,tabledef 对象将与特定的 CDaoDatabase 对象相关联,并将指向数据库对象的指针传递给它。

要了解相关信息,请参阅 DAO 帮助中的主题“Delete 方法”。

CDaoDatabase::Execute

调用此成员函数以运行操作查询或对数据库执行 SQL 语句。

void Execute(
    LPCTSTR lpszSQL,
    int nOptions = dbFailOnError);

参数

lpszSQL
指向一个以 null 结尾的字符串的指针,该字符串包含要执行的有效 SQL 命令。

nOptions
一个整数,指定与查询完整性相关的选项。 可以使用按位或运算符 (|) 来组合以下任何常量(前提是组合有意义,例如,不会将 dbInconsistentdbConsistent 组合):

  • dbDenyWrite 拒绝其他用户的写入权限。

  • dbInconsistent(默认)更新不一致。

  • dbConsistent 更新一致。

  • dbSQLPassThrough SQL 直通。 导致将 SQL 语句传递到 ODBC 数据源进行处理。

  • dbFailOnError 如果发生错误,则回滚更新。

  • dbSeeChanges 如果其他用户正在更改你正在编辑的数据,则会生成运行时错误。

注意

如果同时包含 dbInconsistentdbConsistent 或都不包含,则结果为默认值。 有关这些常量的说明,请参阅 DAO 帮助中的主题“Execute 方法”。

注解

Execute 仅适用于不返回结果的操作查询或 SQL 直通查询。 它不适用于返回记录的选择查询。

有关操作查询的定义和信息,请参阅 DAO 帮助中的主题“操作查询”和“Execute 方法”。

提示

如果有一个语法正确的 SQL 语句和适当的权限,即使没有一行可以进行修改或删除,Execute 成员函数也不会失败。 因此,在使用 Execute 成员函数运行更新或删除查询时,请始终使用 dbFailOnError 选项。 此选项会导致 MFC 引发 CDaoException 类型的异常,并在任何受影响的记录被锁定且无法更新或删除时,回滚所有成功的更改。 请注意,始终可以调用 GetRecordsAffected 以查看受影响的记录数。

调用数据库对象的 GetRecordsAffected 成员函数以确定受最近一次 Execute 调用影响的记录数。 例如,GetRecordsAffected 返回有关在执行操作查询时删除、更新或插入的记录数的信息。 当级联更新或删除生效时,返回的计数不会反映相关表中的更改。

Execute 不返回记录集。 在选择记录的查询上使用 Execute 会导致 MFC 引发 CDaoException 类型的异常。 (没有类似于 CDatabase::ExecuteSQLExecuteSQL 成员函数。)

CDaoDatabase::GetConnect

调用此成员函数以检索用于将 CDaoDatabase 对象连接到 ODBC 或 ISAM 数据库的连接字符串。

CString GetConnect();

返回值

如果 Open 已在 ODBC 数据源上被成功调用,则为连接字符串;否则,为空字符串。 对于 Microsoft Jet (.MDB) 数据库,该字符串始终为空,除非将其设置为用于与 Execute 成员函数一起使用的 dbSQLPassThrough 选项,或者在打开记录集时使用。

备注

该字符串提供有关打开的数据库或直通查询中使用的数据库的源的信息。 连接字符串由数据库类型说明符和零个或多个用分号分隔的参数组成。

注意

使用 MFC DAO 类通过 ODBC 连接到数据源的效率比通过附加表进行连接要低。

注意

连接字符串用于根据需要将附加信息传递给 ODBC 和某些 ISAM 驱动程序。 它不用于 .MDB 数据库。 对于 Microsoft Jet 数据库基表,连接字符串是一个空字符串 (""),除非将它用于 SQL 直通查询,如上面的“返回值”下的内容所述。

有关如何创建连接字符串的说明,请参阅 Open 成员函数。 在 Open 调用中设置连接字符串后,可以稍后使用它来检查设置,以确定数据库的类型、路径、用户 ID、密码或 ODBC 数据源。

CDaoDatabase::GetName

调用此成员函数以检索当前打开的数据库的名称,可以是现有数据库文件的名称,也可以是已注册的 ODBC 数据源的名称。

CString GetName();

返回值

如果成功,则为数据库的完整路径和文件名;否则,为空的 CString

备注

如果你的网络支持统一命名约定 (UNC),还可以指定网络路径,例如“\\\\MYSERVER\\MYSHARE\\MYDIR\\MYDB.MDB”。 (字符串字面量中需要双反斜杠,因为“\”是 C++ 转义字符。)

例如,你可能想要在标题中显示此名称。 如果在检索名称时出错,MFC 将引发 CDaoException 类型的异常。

注意

为了在访问外部数据库时获得更好的性能,我们建议将外部数据库表附加到 Microsoft Jet 数据库 (.MDB),而不是直接连接到数据源。

数据库类型由路径指向的文件或目录指示,如下所示:

Pathname 指向.. 数据库类型
.MDB 文件 Microsoft Jet 数据库 (Microsoft Access)
包含 .DBF 文件的目录 dBASE 数据库
包含 .XLS 文件的目录 Microsoft Excel 数据库
包含 .PDX 文件的目录 Paradox 数据库
包含适当格式的文本数据库文件的目录 文本格式数据库

对于 SQL Server 和 Oracle 等 ODBC 数据库,数据库的连接字符串标识由 ODBC 注册的数据源名称 (DSN)。

CDaoDatabase::GetQueryDefCount

调用此成员函数以检索数据库的 QueryDefs 集合中定义的查询数。

short GetQueryDefCount();

返回值

数据库中定义的查询数。

备注

如果需要循环访问 QueryDefs 集合中的所有 querydef,则 GetQueryDefCount 很有用。 若要获取有关集合中给定的查询的信息,请参阅 GetQueryDefInfo

CDaoDatabase::GetQueryDefInfo

调用此成员函数以获取有关数据库中定义的查询的各种信息。

void GetQueryDefInfo(
    int nIndex,
    CDaoQueryDefInfo& querydefinfo,
    DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);

void GetQueryDefInfo(
    LPCTSTR lpszName,
    CDaoQueryDefInfo& querydefinfo,
    DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);

参数

nIndex
数据库的 QueryDefs 集合中预定义查询的索引,用于按索引查找。

querydefinfo
对返回所请求信息的 CDaoQueryDefInfo 对象的引用。

dwInfoOptions
指定要检索记录集的哪些信息的选项。 此处列出了可用的选项,以及它们导致函数返回有关记录集的原因:

  • AFX_DAO_PRIMARY_INFO(默认)名称、类型

  • AFX_DAO_SECONDARY_INFO 主要信息以及:创建日期、上次更新日期、返回记录、可更新

  • AFX_DAO_ALL_INFO 主要和次要信息以及:SQL、Connect、ODBCTimeout

lpszName
一个字符串,其中包含在数据库中定义的查询名称,用于按名称查找。

备注

提供了两个版本的函数,因此可以通过数据库的 QueryDefs 集合中的索引或查询的名称来选择查询。

有关 querydefinfo 中返回的信息的说明,请参阅 CDaoQueryDefInfo 结构。 此结构的成员对应于上述 dwInfoOptions 说明中列出的信息项。 如果请求某一级别的信息,还将获得任何先前级别的信息。

CDaoDatabase::GetQueryTimeout

调用此成员函数以检索在连接的数据库上的后续操作超时之前允许的当前秒数。

short GetQueryTimeout();

返回值

包含超时值的短整数(以秒为单位)。

备注

由于网络访问问题、查询处理时间过长等原因,操作可能会超时。 当设置生效时,它会影响与此 CDaoDatabase 对象关联的任何记录集上的所有打开、新增、更新和删除操作。 可以通过调用 SetQueryTimeout 来更改当前超时设置。 打开后更改记录集的查询超时值不会更改记录集的值。 例如,后续的 Move 操作不使用新值。 默认值是在初始化数据库引擎时初始设置的。

查询超时的默认值取自 Windows 注册表。 如果没有注册表设置,则默认值为 60 秒。 并非所有数据库都支持设置查询超时值的功能。 如果将查询超时值设置为 0,则不会发生超时;并且与数据库的通信可能会停止响应。 此行为在开发过程中可能很有用。 如果调用失败,MFC 将引发 CDaoException 类型的异常。

要了解相关信息,请参阅 DAO 帮助中的主题“QueryTimeout 属性”。

CDaoDatabase::GetRecordsAffected

调用此成员函数以确定受最近一次调用 Execute 成员函数影响的记录数。

long GetRecordsAffected();

返回值

一个长整数,其中包含受影响的记录数。

备注

返回的值包括使用 Execute 运行的操作查询删除、更新或插入的记录数。 当级联更新或删除生效时,返回的计数不会反映相关表中的更改。

要了解相关信息,请参阅 DAO 帮助中的主题“RecordsAffected 属性”。

CDaoDatabase::GetRelationCount

调用此成员函数以获取数据库中表之间定义的关系数。

short GetRelationCount();

返回值

数据库中表之间定义的关系数。

备注

如果需要循环访问数据库的 Relations 集合中所有已定义的关系,则 GetRelationCount 很有用。 若要获取有关集合中给定关系的信息,请参阅 GetRelationInfo

为了说明关系的概念,考虑一个 Suppliers 表和一个 Products 表,它们可能有一对多的关系。 在此关系中,一个供应商可以提供多个产品。 其他关系是一对一和多对多。

CDaoDatabase::GetRelationInfo

调用此成员函数以获取有关数据库的 Relations 集合中指定关系的信息。

void GetRelationInfo(
    int nIndex,
    CDaoRelationInfo& relinfo,
    DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);

void GetRelationInfo(
    LPCTSTR lpszName,
    CDaoRelationInfo& relinfo,
    DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);

参数

nIndex
数据库的 Relations 集合中关系对象的索引,用于按索引查找。

relinfo
对返回所请求信息的 CDaoRelationInfo 对象的引用。

dwInfoOptions
指定要检索关系的哪些信息的选项。 此处列出了可用的选项,以及它们导致函数返回有关关系的原因:

  • AFX_DAO_PRIMARY_INFO(默认)名称、表、外表

  • AFX_DAO_SECONDARY_INFO 属性,字段信息

字段信息是一个 CDaoRelationFieldInfo 对象,其中包含关系中涉及的主表中的字段。

lpszName
一个字符串,其中包含关系对象的名称,用于按名称查找。

注解

此函数的两个版本按索引或按名称提供访问权限。 有关 relinfo 中返回的信息的说明,请参阅 CDaoRelationInfo 结构。 此结构的成员对应于上述 dwInfoOptions 说明中列出的信息项。 如果请求某一级别的信息,还可以获得任何先前级别的信息。

注意

如果设置关系对象的属性以激活级联操作(dbRelationUpdateCascadesdbRelationDeleteCascades),那么,当对相关主键表进行更改时,Microsoft Jet 数据库引擎会自动更新或删除一个或多个其他表中的记录。 例如,假设你在 Customers 表和 Orders 表之间建立了一个级联删除关系。 当你从 Customers 表中删除记录时,也会删除与该客户相关的 Orders 表中的记录。 此外,如果在 Orders 表和其他表之间建立级联删除关系,则在从 Customers 表中删除记录时,这些表中的记录会自动删除。

CDaoDatabase::GetTableDefCount

调用此成员函数以检索数据库中定义的表数。

short GetTableDefCount();

返回值

数据库中定义的 tabledef 数。

备注

如果需要循环访问数据库的 TableDefs 集合中的所有 tabledef,则 GetTableDefCount 很有用。 若要获取有关集合中给定的表的信息,请参阅 GetTableDefInfo

CDaoDatabase::GetTableDefInfo

调用此成员函数以获取有关数据库中定义的表的各种信息。

void GetTableDefInfo(
    int nIndex,
    CDaoTableDefInfo& tabledefinfo,
    DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);

void GetTableDefInfo(
    LPCTSTR lpszName,
    CDaoTableDefInfo& tabledefinfo,
    DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);

参数

nIndex
数据库的 TableDefs 集合中 tabledef 对象的索引,用于按索引查找。

tabledefinfo
对返回所请求信息的 CDaoTableDefInfo 对象的引用。

dwInfoOptions
指定要检索表的哪些信息的选项。 此处列出了可用的选项,以及它们导致函数返回有关关系的原因:

  • AFX_DAO_PRIMARY_INFO(默认)名称、可更新、属性

  • AFX_DAO_SECONDARY_INFO 主要信息以及:创建日期、上次更新日期、源表名称、连接

  • AFX_DAO_ALL_INFO 主要和次要信息以及:验证规则、验证文本、记录计数

lpszName
tabledef 对象的名称,用于按名称查找。

备注

提供了两个版本的函数,因此可以通过数据库的 TableDefs 集合中的索引或表的名称来选择表。

有关 tabledefinfo 中返回的信息的说明,请参阅 CDaoTableDefInfo 结构。 此结构的成员对应于上述 dwInfoOptions 说明中列出的信息项。 如果请求某一级别的信息,还可以获得任何先前级别的信息。

注意

AFX_DAO_ALL_INFO 选项提供的信息获取速度可能很慢。 在这种情况下,如果有很多记录,计算表中的记录可能会非常耗时。

CDaoDatabase::GetVersion

调用此成员函数以确定 Microsoft Jet 数据库文件的版本。

CString GetVersion();

返回值

一个 CString,指示与对象关联的数据库文件的版本。

备注

返回的值以“major.minor”形式表示版本号;例如 “3.0”。 产品版本号(例如 3.0)由版本号 (3)、一个句点和发行版号 (0) 组成。 到目前为止的版本为 1.0、1.1、2.0 和 3.0。

要了解相关信息,请参阅 DAO 帮助中的主题“Version 属性”。

CDaoDatabase::IsOpen

调用此成员函数以确定 CDaoDatabase 对象当前是否在数据库上打开。

BOOL IsOpen() const;

返回值

如果 CDaoDatabase 对象当前处于打开状态,则为非零;否则为 0。

备注

CDaoDatabase::m_pDAODatabase

包含一个指向 CDaoDatabase 对象基础的 DAO 数据库对象的 OLE 接口的指针。

备注

如果需要直接访问 DAO 接口,请使用此指针。

有关直接调用 DAO 的信息,请参阅技术说明 54

CDaoDatabase::m_pWorkspace

包含一个指向 CDaoWorkspace 对象的指针,该对象包含数据库对象。

备注

如果需要直接访问工作区,请使用此指针,例如,用来获取指向工作区的 Databases 集合中其他数据库对象的指针。

CDaoDatabase::Open

必须调用此成员函数来初始化表示现有数据库的新构造的 CDaoDatabase 对象。

virtual void Open(
    LPCTSTR lpszName,
    BOOL bExclusive = FALSE,
    BOOL bReadOnly = FALSE,
    LPCTSTR lpszConnect = _T(""));

参数

lpszName
一个字符串表达式,它是现有 Microsoft Jet (.MDB) 数据库文件的名称。 如果文件名具有扩展名,则它是必需的。 如果你的网络支持统一命名约定 (UNC),还可以指定网络路径,如“\\\\MYSERVER\\MYSHARE\\MYDIR\\MYDB.MDB”。 (字符串字面量中需要双反斜杠,因为“\”是 C++ 转义字符。)

在使用 lpszName 时,有一些注意事项。 如果它:

  • 引用已打开供另一个用户独占访问的数据库,MFC 会引发 CDaoException 类型的异常。 捕获该异常,让用户知道数据库不可用。

  • 是一个空字符串 ("") 并且 lpszConnect 为“ODBC;”,将显示一个对话框,其中列出了所有已注册的 ODBC 数据源名称,使用户可以选择数据库。 应避免直接连接到 ODBC 数据源;请改用附加表。

  • 不引用现有数据库或有效的 ODBC 数据源名称,MFC 将引发 CDaoException 类型的异常。

注意

有关 DAO 错误代码的详细信息,请参阅 DAOERR.H 文件。 要了解相关信息,请参阅 DAO 帮助中的主题“可捕获数据访问错误”。

bExclusive
一个布尔值,如果数据库被打开用于独占(非共享)访问,则值为 TRUE;如果数据库被打开用于共享访问,则值为 FALSE。 如果省略此参数,则数据库被打开用于共享访问。

bReadOnly
一个布尔值,如果数据库被打开用于只读访问,则值为 TRUE;如果数据库被打开用于读/写访问,则值为 FALSE。 如果省略此参数,则数据库被打开用于读/写访问。 所有依赖记录集都继承此属性。

lpszConnect
用于打开数据库的字符串表达式。 此字符串构成 ODBC 连接参数。 必须提供独占参数和只读参数才能提供源字符串。 如果数据库是 Microsoft Jet 数据库 (.MDB),则此字符串为空 ("")。 默认值的语法(_T(""))为应用程序的 Unicode 和 ANSI 版本提供了可移植性。

备注

Open 将数据库与基础 DAO 对象相关联。 在数据库对象被初始化之前,不能使用它来构造记录集、tabledef 或 querydef 对象。 Open 将数据库对象追加到关联的工作区的 Databases 集合。

按如下方式使用参数:

  • 如果要打开 Microsoft Jet (.MDB) 数据库,请使用 lpszName 参数,并为 lpszConnect 参数传递一个空字符串或传递一个“;PWD=password”形式的密码字符串,前提是数据库受密码保护(仅限 .MDB 数据库)。

  • 如果要打开 ODBC 数据源,请在 lpszConnect 中传递一个有效的 ODBC 连接字符串,在 lpszName 中传递一个空字符串。

要了解相关信息,请参阅 DAO 帮助中的主题“OpenDatabase 方法”。

注意

为了在访问外部数据库(包括 ISAM 数据库和 ODBC 数据源)时获得更好的性能,建议将外部数据库表附加到 Microsoft Jet 引擎数据库 (.MDB),而不是直接连接到数据源。

例如,如果 DBMS 主机不可用,则连接尝试可能会超时。 如果连接尝试失败,Open 将引发 CDaoException 类型的异常。

其余注解仅适用于 ODBC 数据库:

如果数据库是 ODBC 数据库,并且 Open 调用中的参数没有包含足够的信息来建立连接,ODBC 驱动程序会打开一个对话框以从用户那里获取必要的信息。 调用 Open 时,连接字符串 lpszConnect 会以私密方式存储,并可通过调用 GetConnect 成员函数获得。

如果需要,可以在调用 Open 之前打开你自己的对话框,以从用户那里获取信息(例如密码),然后将该信息添加到你传递给 Open 的连接字符串中。 或者,你可能希望保存你传递的连接字符串(可能在 Windows 注册表中),以便下次应用程序在 CDaoDatabase 对象上调用 Open 时重用它。

此外,还可以将连接字符串用于多个级别的登录授权(每个级别用于不同的 CDaoDatabase 对象),或传达其他特定于数据库的信息。

CDaoDatabase::SetQueryTimeout

调用此成员函数以重写在连接的数据库上的后续操作超时之前允许的默认秒数。

void SetQueryTimeout(short nSeconds);

参数

nSeconds
在查询尝试超时之前允许的秒数。

备注

由于网络访问问题、查询处理时间过长等原因,操作可能会超时。 如果要更改查询超时值,请在打开记录集之前或在调用记录集的 AddNewUpdateDelete 成员函数之前调用 SetQueryTimeout。 此设置会影响对与此 CDaoDatabase 对象关联的任何记录集的所有后续OpenAddNewUpdate、和 Delete 和调用。 打开后更改记录集的查询超时值不会更改记录集的值。 例如,后续的 Move 操作不使用新值。

查询超时的默认值是 60 秒。 并非所有数据库都支持设置查询超时值的功能。 如果将查询超时值设置为 0,则不会发生超时;与数据库的通信可能会停止响应。 此行为在开发过程中可能很有用。

要了解相关信息,请参阅 DAO 帮助中的主题“QueryTimeout 属性”。

另请参阅

CObject 类
层次结构图
CDaoWorkspace 类
CDaoRecordset 类
CDaoTableDef 类
CDaoQueryDef 类
CDatabase 类
CDaoException 类