Share via


CDaoWorkspace 类

管理单个用户从登录到注销的已命名并受密码保护的数据库会话。 DAO 通过 Office 2013 获得支持。 DAO 3.6 是最终版本,被视为已过时。

语法

class CDaoWorkspace : public CObject

成员

公共构造函数

名称 描述
CDaoWorkspace::CDaoWorkspace 构造工作区对象。 之后,调用 CreateOpen

公共方法

名称 描述
CDaoWorkspace::Append 将新创建的工作区追加到数据库引擎的 Workspaces 集合中。
CDaoWorkspace::BeginTrans 开始一个新事务,该事务适用于工作区中打开的所有数据库。
CDaoWorkspace::Close 关闭工作区及其包含的所有对象。 挂起的事务将回滚。
CDaoWorkspace::CommitTrans 完成当前事务并保存更改。
CDaoWorkspace::CompactDatabase 压缩(或复制)数据库。
CDaoWorkspace::Create 创建新的 DAO 工作区对象。
CDaoWorkspace::GetDatabaseCount 返回工作区的 Databases 集合中的 DAO 数据库对象数。
CDaoWorkspace::GetDatabaseInfo 返回有关工作区的 Databases 集合中定义的指定 DAO 数据库的信息。
CDaoWorkspace::GetIniPath 返回 Windows 注册表中 Microsoft Jet 数据库引擎初始化设置的位置。
CDaoWorkspace::GetIsolateODBCTrans 返回一个值,此值指示涉及相同 ODBC 数据源的多个事务是否通过与数据源的强制多个连接进行隔离。
CDaoWorkspace::GetLoginTimeout 返回用户尝试登录 ODBC 数据库的最长时间(超过此时间将发生错误)。
CDaoWorkspace::GetName 返回工作区对象的用户定义名称。
CDaoWorkspace::GetUserName 返回创建工作区时指定的用户名。 这是工作区所有者的名称。
CDaoWorkspace::GetVersion 返回一个字符串,其中包含与工作区关联的数据库引擎版本。
CDaoWorkspace::GetWorkspaceCount 返回数据库引擎的 Workspaces 集合中的 DAO 工作区对象数。
CDaoWorkspace::GetWorkspaceInfo 返回有关数据库引擎的 Workspaces 集合中定义的指定 DAO 工作区的信息。
CDaoWorkspace::Idle 允许数据库引擎执行后台任务。
CDaoWorkspace::IsOpen 如果工作区处于打开状态,则返回非零值。
CDaoWorkspace::Open 显式打开与 DAO 的默认工作区关联的工作区对象。
CDaoWorkspace::RepairDatabase 尝试修复损坏的数据库。
CDaoWorkspace::Rollback 结束当前事务,不保存更改。
CDaoWorkspace::SetDefaultPassword 设置在创建不含特定密码的工作区对象时数据库引擎使用的密码。
CDaoWorkspace::SetDefaultUser 设置在创建不含特定用户名的工作区对象时数据库引擎使用的用户名。
CDaoWorkspace::SetIniPath 在 Windows 注册表中设置 Microsoft Jet 数据库引擎的初始化设置的位置。
CDaoWorkspace::SetIsolateODBCTrans 指定是否通过强制与数据源建立多个连接来隔离涉及同一 ODBC 数据源的多个事务。
CDaoWorkspace::SetLoginTimeout 设置用户尝试登录 ODBC 数据源的最长时间(超过此时间将发生错误)。

公共数据成员

“属性” 描述
CDaoWorkspace::m_pDAOWorkspace 指向基础 DAO 工作区对象。

备注

在大多数情况下,不需要多个工作区,也不需要创建显式工作区对象:在你打开数据库和记录集对象后,它们使用 DAO 的默认工作区。 但是,如果需要,可以通过创建其他工作区对象来一次运行多个会话。 每个工作区对象都可以在其自己的 Databases 集合中包含多个打开的数据库对象。 在 MFC 中,工作区主要是事务管理器,指定同一“事务空间”中的全部打开的一组数据库。

注意

DAO 数据库类不同于基于开放式数据库连接 (ODBC) 的 MFC 数据库类。 所有 DAO 数据库类名都具有“CDao”前缀。 通常,基于 DAO 的 MFC 类比基于 ODBC 的 MFC 类功能更强。 基于 DAO 的类通过 Microsoft Jet 数据库引擎(包括 ODBC 驱动程序)访问数据。 它们还支持数据定义语言 (DDL) 操作,例如通过类创建数据库和添加表和字段,而无需直接调用 DAO。

功能

CDaoWorkspace 提供以下内容:

  • 在需要的情况下,显式访问通过初始化数据库引擎创建的默认工作区。 通常,通过创建数据库和记录集对象来隐式使用 DAO 的默认工作区。

  • 事务空间,其中事务应用于工作区中打开的所有数据库。 可以创建其他工作区来管理单独的事务空间。

  • 基础 Microsoft Jet 数据库引擎的许多属性的接口(请参阅静态成员函数)。 打开或创建工作区,或在打开或创建之前调用静态成员函数,初始化数据库引擎。

  • 访问数据库引擎的 Workspaces 集合,此集合存储已追加到该集合中的所有活动工作区。 你还可以创建和使用工作区,而无需将它们追加到集合中。

安全性

MFC 不会在 DAO 中实现 Users 和 Groups 集合,这两个集合用于安全控制。 如果需要 DAO 的这些方面,则必须通过直接调用 DAO 接口自行编程。 有关信息,请参阅技术说明 54

使用情况

可以使用类 CDaoWorkspace 来执行以下操作:

  • 显式打开默认工作区。

    通常,将以隐式方式使用默认工作区,在你打开新的 CDaoDatabaseCDaoRecordset 对象时便会使用默认工作区。 但可能需要显式访问默认工作区, 例如,访问数据库引擎属性或 Workspaces 集合。 请参阅下面的“默认工作区的隐式使用”。

  • 创建新的工作区。 如果要将其添加到 Workspaces 集合,请调用 Append

  • 在 Workspaces 集合中打开现有工作区。

Create 成员函数中介绍了如何创建 Workspaces 集合中尚不存在的新工作空间。 工作区对象在数据数据库引擎会话之间不会以任何方式保留。 如果您的应用程序静态链接 MFC,则结束应用程序会取消初始化数据库引擎。 如果您的应用程序与 MFC 动态链接,则在卸载 MFC DLL 时数据库引擎将取消初始化。

Open 成员函数中介绍了如何显式打开默认工作区或打开 Workspaces 集合中的现有工作区。

通过使用 Close 成员函数关闭工作区,以此结束工作区会话。 Close 关闭以前未关闭的任何数据库,同时回滚任何未提交的事务。

事务

DAO 在工作区级别管理事务;因此,具有多个打开数据库的工作区上的事务适用于所有数据库。 例如,如果两个数据库有未提交的更新并且您调用 CommitTrans,则所有更新都已提交。 如果要将事务限制到单个数据库,则需要一个单独的工作区对象。

默认工作区的隐式使用

MFC 在以下情况下隐式使用 DAO 的默认工作区:

  • 如果创建新 CDaoDatabase 对象但未通过现有 CDaoWorkspace 对象执行此操作,MFC 会为你创建一个临时工作区对象,该对象对应于 DAO 的默认工作区。 如果对多个数据库执行此操作,则所有数据库对象都与默认工作区相关联。 可以通过 CDaoDatabase 数据成员访问数据库的工作区。

  • 类似地,如果你在不提供指向 CDaoDatabase 对象的指针的情况下创建 CDaoRecordset 对象,则 MFC 会创建一个临时数据库对象,并且通过扩展创建一个临时工作区对象。 你可以通过 CDaoRecordset 数据成员访问记录集的数据库,并间接访问其工作区。

其他操作

还提供了其他数据库操作,例如修复损坏的数据库或压缩数据库。

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

继承层次结构

CObject

CDaoWorkspace

要求

标头:afxdao.h

CDaoWorkspace::Append

调用 Create 后调用此成员函数。

virtual void Append();

备注

Append 将新创建的工作区对象追加到数据库引擎的 Workspaces 集合中。 工作区不会在数据库引擎会话之间持续存在;它们只存储在内存中,而不是磁盘上。 你不必附加工作区;即使你没有附加工作区,也可以使用工作区。

在你调用其 Close 成员函数之前,附加的工作空间将保持在 Workspaces 集合中,处于活动的打开状态。

有关信息,请参阅 DAO 帮助中的主题“Append 方法”。

CDaoWorkspace::BeginTrans

调用此成员函数以启动事务。

void BeginTrans();

注解

在你调用 BeginTrans 之后,你对数据或数据库结构所做的更新会在你提交事务时生效。 因为工作区定义了单个事务空间,所以事务适用于工作区中所有打开的数据库。 有两种方式可以完成事务:

  • 调用 CommitTrans 成员函数来提交事务并将更改保存到数据源。

  • 或者调用 Rollback 成员函数来取消事务。

在事务挂起时关闭工作区对象或数据库对象会回滚所有挂起的事务。

如果你需要将一个 ODBC 数据源上的事务与另一个 ODBC 数据源上的事务隔离开,请参阅 SetIsolateODBCTrans 成员函数。

CDaoWorkspace::CDaoWorkspace

构造 CDaoWorkspace 对象。

CDaoWorkspace();

注解

构造 C++ 对象后,你有两个选择:

  • 调用对象的 Open 成员函数以打开默认工作区或打开 Workspaces 集合中的现有对象。

  • 或者调用对象的 Create 成员函数以创建一个新的 DAO 工作区对象。 这会显式启动一个新的工作区会话,你可以通过 CDaoWorkspace 对象引用该会话。 调用 Create 后,如果要将工作空间添加到数据库引擎的 Workspaces 集合中,可以调用 Append

有关何时需要显式创建 CDaoWorkspace 对象的信息,请参阅 CDaoWorkspace 的类概述。 通常,您将使用隐式创建的工作区,这些工作区是你在打开 CDaoDatabase 对象而没有指定工作区或打开 CDaoRecordset 对象而不指定数据库对象时隐式创建的。 以这种方式创建的 MFC DAO 对象使用 DAO 的默认工作区,此工作区创建一次并重复使用。

要释放工作区及其包含的对象,请调用工作区对象的 Close 成员函数。

CDaoWorkspace::Close

调用此成员函数以关闭工作区对象。

virtual void Close();

备注

关闭打开的工作区对象会释放基础 DAO 对象,如果工作区是 Workspaces 集合的成员,则将其从集合中删除。 调用 Close 是很好的编程习惯。

注意

关闭工作区对象会关闭工作区中所有打开的数据库。 这会导致在数据库中打开的任何记录集也被关闭,并且任何挂起的编辑或更新都将回滚。 相关信息请参见 CDaoDatabase::CloseCDaoRecordset::CloseCDaoTableDef::CloseCDaoQueryDef::Close 成员函数。

工作区对象不是永久的;只有存在对工作区对象的引用时,工作区对象才存在。 这意味着当数据库引擎会话结束时,工作区及其 Databases 集合便不再存在。 你必须通过再次打开工作区和数据库来为下一次会话重新创建工作区及其 Databases 集合。

有关信息,请参阅 DAO 帮助中的主题“Close 方法”。

CDaoWorkspace::CommitTrans

调用此成员函数来提交事务,也就是将一组编辑和更新保存到工作区中的一个或多个数据库。

void CommitTrans();

注解

事务由对数据库数据或其结构的一系列更改组成,从调用 BeginTrans 开始。 完成事务后,提交事务或者使用 Rollback 回滚事务(取消更改)。 默认情况下,如果没有事务,对记录的更新会立即提交。 调用 BeginTrans 会导致延迟提交更新,直至你调用 CommitTrans

注意

在一个工作空间内,事务对于工作空间始终是全局的,并且不仅限于一个数据库或记录集。 如果你在工作区事务中对多个数据库或记录集执行操作,则 CommitTrans 将提交所有挂起的更新,并且 Rollback 还原对这些数据库和记录集的所有操作。

当你关闭带有待处理事务的数据库或工作区时,所有事务都会回滚。

注意

这不是两阶段提交机制。 如果某个更新提交失败,其他更新仍将提交。

CDaoWorkspace::CompactDatabase

调用此成员函数以压缩指定的 Microsoft Jet (.MDB) 数据库。

static void PASCAL CompactDatabase(
    LPCTSTR lpszSrcName,
    LPCTSTR lpszDestName,
    LPCTSTR lpszLocale = dbLangGeneral,
    int nOptions = 0);

static void PASCAL CompactDatabase(
    LPCTSTR lpszSrcName,
    LPCTSTR lpszDestName,
    LPCTSTR lpszLocale,
    int nOptions,
    LPCTSTR lpszPassword);

参数

lpszSrcName
现有的已关闭数据库的名称。 它可以是完整的路径和文件名,例如“C:\\MYDB.MDB”。 如果文件名有扩展名,必须指定扩展名。 如果你的网络支持统一命名约定 (UNC),还可以指定网络路径,如“\\\\MYSERVER\\MYSHARE\\MYDIR\\MYDB.MDB”。 (路径字符串中需要双反斜杠,因为“\”是 C++ 转义字符。)

lpszDestName
正在创建的压缩数据库的完整路径。 还可以像使用 lpszSrcName 一样指定网络路径。 不能使用 lpszDestName 参数来指定与 lpszSrcName 相同的数据库文件。

lpszPassword
密码,用于压缩受密码保护的数据库。 请注意,如果你使用需要密码的 CompactDatabase 版本,则必须提供所有参数。 此外,因为这是一个连接参数,它需要特殊格式,如下所示:;PWD= lpszPassword。 例如:;PWD="Happy"。 (前导分号是必需的。)

lpszLocale
用于指定创建 lpszDestName 的整理顺序的字符串表达式。 如果你通过接受 dbLangGeneral 的默认值(见下文)而省略此参数,则新数据库的区域设置与旧数据库的区域设置相同。 可能的值为:

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

  • dbLangArabic 阿拉伯语

  • dbLangCyrillic 俄语

  • dbLangCzech 捷克语

  • dbLangDutch 荷兰语

  • dbLangGreek 希腊语

  • dbLangHebrew 希伯来语

  • dbLangHungarian 匈牙利语

  • dbLangIcelandic 冰岛语

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

  • dbLangNorwdan 挪威语和丹麦语

  • dbLangPolish 波兰语

  • dbLangSpanish 传统西班牙语

  • dbLangSwedfin 瑞典语和芬兰语

  • dbLangTurkish 土耳其语

nOptions
指示目标数据库 lpszDestName 的一个或多个选项。 如果你通过接受默认值省略此参数,则 lpszDestName 将具有与 lpszSrcName 相同的加密和相同的版本。 你可以使用按位或运算符将 dbEncryptdbDecrypt 选项与其中一个版本选项结合起来。 指定数据库格式而不是数据库引擎版本的可能值有:

  • dbEncrypt 压缩时加密数据库。

  • dbDecrypt 压缩时解密数据库。

  • dbVersion10 创建一个在压缩时使用 Microsoft Jet 数据库引擎 1.0 版本的数据库。

  • dbVersion11 创建一个在压缩时使用 Microsoft Jet 数据库引擎 1.1 版本的数据库。

  • dbVersion20 创建一个在压缩时使用 Microsoft Jet 数据库引擎 2.0 版本的数据库。

  • dbVersion30 创建一个在压缩时使用 Microsoft Jet 数据库引擎 3.0 版本的数据库。

可以在选项参数中使用 dbEncryptdbDecrypt 来指定在压缩数据库时是加密还是解密数据库。 如果你省略一个加密常量或者如果你同时包含 dbDecryptdbEncrypt,lpszDestName 将与 lpszSrcName 具有相同的加密。 你可以使用选项参数中的版本常量之一来指定压缩数据库的数据格式的版本。 此常量仅影响 lpszDestName 数据格式的版本。 只能指定一个版本常量。 如果省略版本常量,lpszDestName 将具有与 lpszSrcName 相同的版本。 只能将 lpszDestName 压缩到与 lpszSrcName 相同或更高的版本。

注意

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

备注

更改数据库中的数据时,数据库文件可能会变得碎片化,并使用不必要的磁盘空间。 你应该定期压缩数据库以对数据库文件进行碎片整理。 压缩的数据库通常更小。 还可以在复制和压缩数据库时选择更改整理顺序、加密或数据格式的版本。

注意

CompactDatabase 成员函数无法正确地将完整的 Microsoft Access 数据库从一个版本转换为另一个版本。 仅转换数据格式。 Microsoft Access 定义的对象(例如窗体和报表)不会被转换。 但是,数据会正确进行转换。

提示

你还可以使用 CompactDatabase 来复制数据库文件。

有关压缩数据库的详细信息,请参阅 DAO 帮助中的“CompactDatabase 方法”主题。

CDaoWorkspace::Create

调用此成员函数来创建一个新的 DAO 工作区对象并将其与 MFC CDaoWorkspace 对象相关联。

virtual void Create(
    LPCTSTR lpszName,
    LPCTSTR lpszUserName,
    LPCTSTR lpszPassword);

参数

lpszName
一个最多包含 14 个字符的字符串,用于唯一命名新工作区对象。 必须提供名称。 要了解相关信息,请参阅 DAO 帮助中的主题“Name 属性”。

lpszUserName
工作区所有者的用户名。 有关要求,请参阅 SetDefaultUser 成员函数的 lpszDefaultUser 参数。 相关信息请参阅 DAO 帮助中的“UserName 属性”主题。

lpszPassword
新工作区对象的密码。 密码的最大长度为 14 个字符,并且可以包含除 ASCII 0(空)以外的任何字符。 密码是区分大小写的。 要了解相关信息,请参阅 DAO 帮助中的主题“Password 属性”。

备注

整个创建过程如下:

  1. 构造一个 CDaoWorkspace 对象。

  2. 调用对象的 Create 成员函数来创建基础 DAO 工作区。 你必须指定一个工作区名称。

  3. 如果要将工作区添加到数据库引擎的 Workspaces 集合,可以选择调用 Append。 你可以在不附加工作区的情况下使用工作区。

调用 Create 后,工作区对象处于打开状态,可供使用。 你没有在 Create 后面调用 Open。 如果 Workspaces 集合中已存在工作区,则不要调用 Create。 如果尚未为你的应用程序初始化数据库引擎,则 Create 会初始化数据库引擎。

CDaoWorkspace::GetDatabaseCount

调用此成员函数以检索工作区的 Databases 集合中的 DAO 数据库对象的数量吗,也就是工作区中打开的数据库的数量。

short GetDatabaseCount();

返回值

工作区中打开的数据库数。

备注

如果你需要遍历工作区的 Databases 集合中所有已定义的数据库,GetDatabaseCount 将非常有用。 要获取有关集合中给定数据库的信息,请参阅 GetDatabaseInfo。 典型用法是调用 GetDatabaseCount 以获取打开数据库的数量,然后将该数字用作重复调用 GetDatabaseInfo 的循环索引。

CDaoWorkspace::GetDatabaseInfo

调用此成员函数可获取有关工作区中打开的数据库的各种信息。

void GetDatabaseInfo(
    int nIndex,
    CDaoDatabaseInfo& dbinfo,
    DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);

void GetDatabaseInfo(
    LPCTSTR lpszName,
    CDaoDatabaseInfo& dbinfo,
    DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);

参数

nIndex
工作区的 Databases 集合中数据库对象的从零开始的索引,用于按索引查找。

dbinfo
对返回所请求信息的 CDaoDatabaseInfo 对象的引用。

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

  • AFX_DAO_PRIMARY_INFO(默认)名称、可更新、事务

  • AFX_DAO_SECONDARY_INFO 主要信息加:版本、整理顺序、查询超时

  • AFX_DAO_ALL_INFO 主要和次要信息加:连接

lpszName
数据库对象的名称,用于按名称查找。 该名称是一个最多包含 14 个字符的字符串,用于唯一地命名新的工作区对象。

注解

该函数的一个版本允许按索引查找数据库。 另一个版本允许你按名称查找数据库。

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

CDaoWorkspace::GetIniPath

调用此成员函数以获取 Microsoft Jet 数据库引擎的初始化设置在 Windows 注册表中的位置。

static CString PASCAL GetIniPath();

返回值

包含注册表位置的 CString

备注

可以使用该位置来获取有关数据库引擎设置的信息。 返回的信息实际上是注册表子项的名称。

有关相关信息,请参阅 DAO 帮助中的“IniPath 属性”和“自定义 Windows 注册表设置以进行数据访问”主题。

CDaoWorkspace::GetIsolateODBCTrans

调用此成员函数以获取工作区的 DAO IsolateODBCTrans 属性的当前值。

BOOL GetIsolateODBCTrans();

返回值

如果 ODBC 事务被隔离,则为非零;否则为 0。

备注

在某些情况下,您可能需要在同一个 ODBC 数据库上同时挂起多个事务。 为此,您需要为每个事务打开一个单独的工作区。 请记住,虽然每个工作区都可以拥有自己的与数据库的 ODBC 连接,但这会降低系统性能。 因为通常不需要事务隔离,所以由同一用户打开的多个工作区对象的 ODBC 连接默认处于共享状态。

某些 ODBC 服务器(例如 Microsoft SQL Server)不允许在单个连接上同时进行事务处理。 如果需要一次对此类数据库挂起多个事务,请在打开该数据库后,在每个工作区上将 IsolateODBCTrans 属性设置为 TRUE。 这会强制每个工作区使用单独的 ODBC 连接。

相关信息请参阅 DAO 帮助中的“IsolateODBCTrans 属性”主题。

CDaoWorkspace::GetLoginTimeout

调用此成员函数以获取工作区的 DAO LoginTimeout 属性的当前值。

static short PASCAL GetLoginTimeout();

返回值

用户尝试登录 ODBC 数据库的最长时间(超过此时间将发生错误)。

备注

此值表示用户尝试登录 ODBC 数据库的最长时间(超过此时间将发生错误)。 LoginTimeout 的默认设置为 20 秒。 当 LoginTimeout 设置为 0 时,不会发生超时并且与数据源的通信可能会停止响应。

当你尝试登录 ODBC 数据库(例如 Microsoft SQL Server)时,连接可能会因网络错误或服务器未运行而失败。 你可以指定数据库引擎在产生错误之前等待多长时间,而不是等待默认的 20 秒进行连接。 登录到服务器是作为许多不同事件的一部分隐式发生的,例如在外部服务器数据库上运行查询。

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

CDaoWorkspace::GetName

调用该成员函数获取 CDaoWorkspace 对象基础的 DAO 工作区对象的用户自定义名称。

CString GetName();

返回值

包含 DAO 工作区对象的用户定义名称的 CString

注解

此名称对于按名称访问数据库引擎的 Workspaces 集合中的 DAO 工作区对象很有用。

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

CDaoWorkspace::GetUserName

调用此成员函数获取工作区所有者的名称。

CString GetUserName();

返回值

表示工作区对象所有者的 CString

注解

获取或设置工作区所有者的权限,直接调用 DAO 查看 Permissions 属性设置;这决定了用户拥有什么权限。 要使用权限,你需要一个 SYSTEM.MDA 文件。

有关直接调用 DAO 的信息,请参阅技术说明 54。 相关信息请参阅 DAO 帮助中的“UserName 属性”主题。

CDaoWorkspace::GetVersion

调用此成员函数以确定使用中的 Microsoft Jet 数据库引擎的版本。

static CString PASCAL GetVersion();

返回值

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

注解

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

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

CDaoWorkspace::GetWorkspaceCount

调用此成员函数以检索数据库引擎的 Workspaces 集合中的 DAO 工作区对象的数量。

short GetWorkspaceCount();

返回值

Workspaces 集合中打开的工作空间的数量。

备注

此计数不包括已打开但未附加到集合的任何工作区。 如果你需要遍历 Workspaces 集合中所有已定义的工作区,GetWorkspaceCount 将非常有用。 要获取有关集合中给定工作区的信息,请参阅 GetWorkspaceInfo。 典型用法是调用 GetWorkspaceCount 以获取打开工作区的数量,然后将该数字用作重复调用 GetWorkspaceInfo 的循环索引。

CDaoWorkspace::GetWorkspaceInfo

调用此成员函数可获取有关会话中打开的工作区的各种信息。

void GetWorkspaceInfo(
    int nIndex,
    CDaoWorkspaceInfo& wkspcinfo,
    DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);

void GetWorkspaceInfo(
    LPCTSTR lpszName,
    CDaoWorkspaceInfo& wkspcinfo,
    DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);

参数

nIndex
Workspaces 集合中数据库对象的从零开始的索引,用于按索引查找。

wkspcinfo
对返回所请求信息的 CDaoWorkspaceInfo 对象的引用。

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

  • AFX_DAO_PRIMARY_INFO(默认)名称

  • AFX_DAO_SECONDARY_INFO 主要信息加:用户名

  • AFX_DAO_ALL_INFO 主要和次要信息加:隔离 ODBCTrans

lpszName
工作区对象的名称,用于按名称查找。 该名称是一个最多包含 14 个字符的字符串,用于唯一地命名新的工作区对象。

备注

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

CDaoWorkspace::Idle

调用 Idle 以使数据库引擎有机会执行由于密集的数据处理而可能不是最新的后台任务。

static void PASCAL Idle(int nAction = dbFreeLocks);

参数

nAction
在空闲处理期间要执行的操作。 目前唯一有效的操作是 dbFreeLocks

备注

在多用户、多任务环境中,由于没有足够的后台处理时间来保持记录集中的所有记录都是最新的,因此通常是这种情况。

注意

使用 Microsoft Jet 数据库引擎 3.0 版创建的数据库不需要调用 Idle。 对于使用早期版本创建的数据库,只能使用 Idle

通常,只有在没有其他操作(包括鼠标移动)发生时,才会删除读取锁并更新本地动态集类型记录集对象中的数据。 如果定期调用 Idle,则可以通过释放不需要的读锁为数据库引擎提供时间来赶上后台处理任务。 将 dbFreeLocks 常量指定为参数会导致处理延迟,直到释放所有读锁之后才会进行处理。

除非正在运行应用程序的多个实例,否则在单用户环境中不需要此成员函数。 Idle 成员函数可以提高多用户环境中的性能,因为此成员函数会强制数据库引擎将数据刷新到磁盘,从而释放内存锁。 还可以通过将操作作为事务的一部分来释放读锁。

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

CDaoWorkspace::IsOpen

调用此成员函数以确定 CDaoWorkspace 对象是否打开,即 MFC 对象是否已通过调用 Open 或调用 Create 进行初始化。

BOOL IsOpen() const;

返回值

如果工作区对象处于打开状态,则为非零值;否则为 0。

备注

你可以调用处于打开状态的工作区的任何成员函数。

CDaoWorkspace::m_pDAOWorkspace

指向基础 DAO 工作区对象的指针。

备注

如果你需要直接访问基础 DAO 对象,请使用此数据成员。 可以通过此指针调用 DAO 对象的接口。

有关直接访问 DAO 对象的信息,请参阅技术说明 54

CDaoWorkspace::Open

显式打开与 DAO 的默认工作区关联的工作区对象。

virtual void Open(LPCTSTR lpszName = NULL);

参数

lpszName
要打开的 DAO 工作区对象的名称,这是一个最多包含 14 个字符的字符串,用于唯一命名工作区。 接受默认值 NULL 以显式打开默认工作区。 有关命名要求,请参阅 Create 的 lpszName 参数。 要了解相关信息,请参阅 DAO 帮助中的主题“Name 属性”。

注解

构造 CDaoWorkspace 对象后,调用此成员函数执行以下操作之一:

  • 显式打开默认工作区。 为 lpszName 传递 NULL。

  • 按名称打开现有 CDaoWorkspace 对象,这是 Workspaces 集合的成员。 传递现有工作区对象的有效名称。

Open 会将工作区对象置于打开状态,如果尚未为你的应用程序初始化数据库引擎,则还初始化数据库引擎。

虽然许多 CDaoWorkspace 成员函数只能在工作区打开后才能调用,但以下在数据库引擎上运行的成员函数在构造 C++ 对象之后即可使用,无需等到调用 Open

CDaoWorkspace::RepairDatabase

如果访问 Microsoft Jet 数据库引擎的数据库损坏,你需要尝试修复,请调用此成员函数。

static void PASCAL RepairDatabase(LPCTSTR lpszName);

参数

lpszName
现有 Microsoft Jet 引擎数据库文件的路径和文件名。 如果省略路径,则仅搜索当前目录。 如果你的系统支持统一命名约定 (UNC),还可以指定网络路径,如“\\\\MYSERVER\\MYSHARE\\MYDIR\\MYDB.MDB”。 (路径字符串中需要双反斜杠,因为“\”是 C++ 转义字符。)

备注

在 lpszName 指定的数据库被修复之前,必须关闭该数据库。 在多用户环境中,在你修复 lpszName 指定的数据库时,其他用户无法打开 lpszName。 如果 lpszName 未关闭或不可独占使用,则会发生错误。

此成员函数尝试修复一个被不完整的写操作标记为可能损坏的数据库。 如果使用 Microsoft Jet 数据库引擎的应用程序由于断电或计算机硬件问题而意外关闭,则可能会发生这种情况。 如果你完成操作并调用 Close 成员函数或以通常的方式退出应用程序,则不会将数据库标记为可能已损坏。

注意

修复数据库后,最好是使用 CompactDatabase 成员函数对其进行压缩以对文件进行碎片整理并恢复磁盘空间。

有关修复数据库的详细信息,请参阅 DAO 帮助中的“RepairDatabase 方法”主题。

CDaoWorkspace::Rollback

调用此成员函数可结束当前事务并将工作区中的所有数据库恢复到事务开始之前的状态。

void Rollback();

备注

注意

在一个工作区对象内,事务对于工作空间始终是全局的,并且不仅限于一个数据库或记录集。 如果你在工作区事务中对多个数据库或记录集执行操作,则 Rollback 将还原对所有这些数据库和记录集的所有操作。

如果你关闭工作区对象而不保存或回滚任何挂起的事务,则事务将自动回滚。 如果你直接调用 CommitTransRollback,而没有先调用 BeginTrans,则会发生错误。

注意

当你开始一个事务时,数据库引擎将其操作记录在一个文件中,该文件保存在工作站上由 TEMP 环境变量指定的目录中。 如果事务日志文件耗尽了 TEMP 驱动器上的可用存储空间,数据库引擎将导致 MFC 引发 CDaoException(DAO 错误 2004)。 此时,如果你调用 CommitTrans,将提交不确定数量的操作,但剩余未完成的操作将丢失,并且必须重新启动操作。 调用 Rollback 将释放事务日志并回滚事务中的所有操作。

CDaoWorkspace::SetDefaultPassword

调用此成员函数以设置数据库引擎在创建工作区对象时使用的默认密码,而无需特定密码。

static void PASCAL SetDefaultPassword(LPCTSTR lpszPassword);

参数

lpszPassword
默认密码。 密码的最大长度为 14 个字符,并且可以包含除 ASCII 0(空)以外的任何字符。 密码是区分大小写的。

备注

你设置的默认密码适用于你在调用后创建的新工作区。 创建后续工作区时,无需在 Create 调用中指定密码。

要使用此成员函数:

  1. 构造一个 CDaoWorkspace 对象但不调用 Create

  2. 调用 SetDefaultPassword,如果你愿意,也可以调用 SetDefaultUser

  3. 对此工作区对象或后续对象调用 Create,无需指定密码。

默认情况下,DefaultUser 属性设置为“admin”,DefaultPassword 属性设置为空字符串 ("")。

有关安全性的更多信息,请参阅 DAO 帮助中的“Permissions 属性”主题。 要了解相关信息,请参阅 DAO 帮助中的“DefaultPassword 属性”和“DefaultUser 属性”主题。

CDaoWorkspace::SetDefaultUser

调用此成员函数以设置数据库引擎在创建工作区对象时使用的默认用户名,而无需特定用户名。

static void PASCAL SetDefaultUser(LPCTSTR lpszDefaultUser);

参数

lpszDefaultUser
默认用户名。 用户名的长度可以是 1 - 20 个字符,包括字母字符、重音字符、数字、空格和符号,但以下字符除外:"(引号)、/(正斜杠)、\(反斜杠)、[ ](括号)、:(冒号)、|(管道符号)、<(小于号)、>(大于号)、+(加号)、=(等号)、;(分号)、,(逗号)、*(问号)、(星号)、前导空格和控制字符(ASCII 00 到 ASCII 31)。 相关信息请参阅 DAO 帮助中的“UserName 属性”主题。

备注

你设置的默认用户名适用于你在调用后创建的新工作区。 创建后续工作区时,无需在 Create 调用中指定用户名。

要使用此成员函数:

  1. 构造一个 CDaoWorkspace 对象但不调用 Create

  2. 调用 SetDefaultUser,如果你愿意,也可以调用 SetDefaultPassword

  3. 对此工作区对象或后续对象调用 Create,无需指定用户名。

默认情况下,DefaultUser 属性设置为“admin”,DefaultPassword 属性设置为空字符串 ("")。

有关相关信息,请参阅 DAO 帮助中的“DefaultUser 属性”和“DefaultPassword 属性”主题。

CDaoWorkspace::SetIniPath

调用此成员函数来指定 Microsoft Jet 数据库引擎的 Windows 注册表设置的位置。

static void PASCAL SetIniPath(LPCTSTR lpszRegistrySubKey);

参数

lpszRegistrySubkey
一个字符串,其中包含 Windows 注册表子项的名称,用于 Microsoft Jet 数据库引擎设置或可安装 ISAM 数据库所需参数的位置。

注解

仅当需要指定特殊设置时才调用 SetIniPath。 有关详细信息,请参阅 DAO 帮助中的“IniPath 属性”主题。

注意

在应用程序安装期间调用 SetIniPath,而不是在应用程序运行时调用。 SetIniPath 必须在打开任何工作区、数据库或记录集之前调用;否则,MFC 将引发异常。

你可以使用此机制使用用户提供的注册表设置来配置数据库引擎。 此属性的范围仅限于你的应用程序,并且在不重新启动应用程序的情况下无法更改。

CDaoWorkspace::SetIsolateODBCTrans

调用此成员函数来设置工作区的 DAO IsolateODBCTrans 属性的值。

void SetIsolateODBCTrans(BOOL bIsolateODBCTrans);

参数

bIsolateODBCTrans
如果要开始隔离 ODBC 事务,则传递 TRUE。 如果要停止隔离 ODBC 事务,则传递 FALSE。

备注

在某些情况下,您可能需要在同一个 ODBC 数据库上同时挂起多个事务。 为此,您需要为每个事务打开一个单独的工作区。 虽然每个工作区都可以拥有自己的与数据库的 ODBC 连接,但这会降低系统性能。 因为通常不需要事务隔离,所以由同一用户打开的多个工作区对象的 ODBC 连接默认处于共享状态。

某些 ODBC 服务器(例如 Microsoft SQL Server)不允许在单个连接上同时进行事务处理。 如果需要一次对此类数据库挂起多个事务,请在打开该数据库后,在每个工作区上将 IsolateODBCTrans 属性设置为 TRUE。 这会强制每个工作区使用单独的 ODBC 连接。

CDaoWorkspace::SetLoginTimeout

调用此成员函数以设置工作区的 DAO LoginTimeout 属性的值。

static void PASCAL SetLoginTimeout(short nSeconds);

参数

nSeconds
用户尝试登录 ODBC 数据库的最长时间(超过此时间将发生错误)。

备注

此值表示用户尝试登录 ODBC 数据库的最长时间(超过此时间将发生错误)。 LoginTimeout 的默认设置为 20 秒。 当 LoginTimeout 设置为 0 时,不会发生超时并且与数据源的通信可能会停止响应。

当你尝试登录 ODBC 数据库(例如 Microsoft SQL Server)时,连接可能会因网络错误或服务器未运行而失败。 你可以指定数据库引擎在产生错误之前等待多长时间,而不是等待默认的 20 秒进行连接。 登录到服务器是作为许多不同事件的一部分隐式发生的,例如在外部服务器数据库上运行查询。 超时值由 LoginTimeout 属性的当前设置确定。

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

另请参阅

CObject 类
层次结构图
CDaoDatabase 类
CDaoRecordset 类
CDaoTableDef 类
CDaoQueryDef 类
CDaoException 类