CDaoDatabase 类
表示使用数据访问对象 (DAO) 与 Access 数据库的连接。
注意
通过 Office 2013 支持数据访问对象(DAO)。 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 集合中,并打开一个与数据的连接。 然后,在构造 CDaoRecordset、CDaoTableDef 或 CDaoQueryDef 对象以对连接的数据库执行操作时,请将指向 CDaoDatabase
对象的指针传递给这些对象的构造函数。 使用完连接后,调用 Close 成员函数并销毁 CDaoDatabase
对象。 Close
关闭尚未关闭的任何记录集。
事务
数据库事务处理在工作区级别提供 ,请参阅类的 BeginTrans、 CommitTrans 和 Rollback 成员 CDaoWorkspace
函数。
ODBC 连接
使用 Open Database Base Connectivity (ODBC) 数据源的建议方法是将外部表附加到 Microsoft Jet (.MDB
) 数据库。
集合
每个数据库都维护自己的 tabledef、querydef、记录集和关系对象的集合。 CDaoDatabase
类提供了用于操作这些对象的成员函数。
注意
这些对象存储在 DAO 中,而不是存储在 MFC 数据库对象中。 MFC 为 tabledef、querydef 和记录集对象提供类,但不为关系对象提供类。
继承层次结构
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
成员函数。 如果退出在堆栈上声明 CDaoRecordset 或 CDaoDatabase
对象的函数,数据库将关闭,所有未保存的更改都将丢失,所有挂起的事务都将回滚,并且对数据的任何挂起的编辑都将丢失。
注意
如果尝试在任何记录集对象打开时关闭一个数据库对象,或者如果尝试在属于某特定工作区的任何数据库对象打开时关闭一个工作区对象,这些记录集对象将被关闭,任何挂起的更新或编辑都将回滚。 如果尝试在属于工作区对象的任何数据库对象打开时关闭一个工作区对象,该操作将关闭属于该特定工作区对象的所有数据库对象,这可能会导致未关闭的记录集对象被关闭。 如果不关闭数据库对象,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
调用此成员函数,从对象的 QueryDefs 集合中删除指定的 querydef(已保存的查询 CDaoDatabase
)。
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
一个整数,指定与查询完整性相关的选项。 可以使用按位 OR 运算符 () 组合以下任意常量,|
前提是组合有意义。 例如,你不会与 dbInconsistent
dbConsistent
:
dbDenyWrite
拒绝其他用户的写入权限。dbInconsistent
(默认)更新不一致。dbConsistent
更新一致。dbSQLPassThrough
SQL 直通。 导致将 SQL 语句传递到 ODBC 数据源进行处理。dbFailOnError
如果发生错误,则回滚更新。dbSeeChanges
如果其他用户正在更改你正在编辑的数据,则会生成运行时错误。
注意
如果同时包含 dbInconsistent
和 dbConsistent
或都不包含,则结果为默认值。 有关这些常量的说明,请参阅 DAO 帮助中的主题“Execute 方法”。
注解
Execute
仅适用于不返回结果的操作查询或 SQL 传递查询。 它不适用于返回记录的选择查询。
有关操作查询的定义和信息,请参阅 DAO 帮助中的主题“操作查询”和“Execute 方法”。
提示
给定语法正确的 SQL 语句和适当的权限,即使不能修改或删除单个行, Execute
成员函数也不会失败。 因此,在使用 Execute
成员函数运行更新或删除查询时,请始终使用 dbFailOnError
选项。 此选项会导致 MFC 引发 CDaoException 类型的异常,并在任何受影响的记录被锁定且无法更新或删除时,回滚所有成功的更改。 请注意,始终可以调用 GetRecordsAffected
以查看受影响的记录数。
调用数据库对象的 GetRecordsAffected 成员函数以确定受最近一次 Execute
调用影响的记录数。 例如,GetRecordsAffected
返回有关在执行操作查询时删除、更新或插入的记录数的信息。 当级联更新或删除生效时,返回的计数不会反映相关表中的更改。
Execute
不返回记录集。 在选择记录的查询上使用 Execute
会导致 MFC 引发 CDaoException
类型的异常。 (没有类似于 CDatabase::ExecuteSQL
的 ExecuteSQL
成员函数。)
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 来更改当前超时设置。 打开后更改记录集的查询超时值不会更改记录集的值。 例如,后续 移动 操作不使用新值。 默认值是在初始化数据库引擎时初始设置的。
查询超时的默认值取自 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 说明中列出的信息项。 如果请求某一级别的信息,还可以获得任何先前级别的信息。
注意
如果设置关系对象的属性以激活级联操作(dbRelationUpdateCascades
或 dbRelationDeleteCascades
),那么,当对相关主键表进行更改时,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 对象的指针,该对象包含数据库对象。
注解
如果需要直接访问工作区,请使用此指针。 例如,若要获取指向工作区“数据库”集合中其他数据库对象的指针。
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 对象之前,不能使用数据库对象来构造记录集、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
在查询尝试超时之前允许的秒数。
备注
由于网络访问问题、查询处理时间过长等原因,操作可能会超时。 如果要更改查询超时值,请在打开记录集之前或在调用记录集的 AddNew、Update 或 Delete 成员函数之前调用 SetQueryTimeout
。 此设置会影响对与此 CDaoDatabase
对象关联的任何记录集的所有后续OpenAddNew
、Update
、和 Delete
和调用。 打开后更改记录集的查询超时值不会更改记录集的值。 例如,后续 移动 操作不使用新值。
查询超时的默认值是 60 秒。 并非所有数据库都支持设置查询超时值的功能。 如果将查询超时值设置为 0,则不会发生超时;与数据库的通信可能会停止响应。 此行为在开发过程中可能很有用。
要了解相关信息,请参阅 DAO 帮助中的主题“QueryTimeout 属性”。
另请参阅
CObject 类
层次结构图
CDaoWorkspace 类
CDaoRecordset 类
CDaoTableDef 类
CDaoQueryDef 类
CDatabase 类
CDaoException 类