CDatabase

表示与数据源的连接,通过此连接可操作数据源。

语法

class CDatabase : public CObject

成员

公共构造函数

名称 描述
CDatabase::CDatabase 构造 CDatabase 对象。 必须通过调用 OpenExOpen 来初始化对象。

公共方法

名称 描述
CDatabase::BeginTrans 在连接的数据源上启动一个“事务”,即一系列对 CRecordset 类的 AddNewEditDeleteUpdate 成员函数的可逆调用。 数据源必须支持事务才能使 BeginTrans 生效。
CDatabase::BindParameters 允许在调用 CDatabase::ExecuteSQL 之前绑定参数。
CDatabase::Cancel 从第二个线程取消异步操作或进程。
CDatabase::CanTransact 如果数据库支持事务,则返回非零。
CDatabase::CanUpdate 如果 CDatabase 对象可更新(非只读),则返回非零。
CDatabase::Close 关闭数据源连接。
CDatabase::CommitTrans 完成由 BeginTrans 开始的事务。 执行更改数据源的事务中的命令。
CDatabase::ExecuteSQL 执行 SQL 语句。 不返回任何数据记录。
CDatabase::GetBookmarkPersistence 标识书签用于保存在记录集对象上的操作。
CDatabase::GetConnect 返回用于将 CDatabase 对象连接到数据源的 ODBC 连接字符串。
CDatabase::GetCursorCommitBehavior 标识提交事务对打开的记录集对象的影响。
CDatabase::GetCursorRollbackBehavior 标识回退事务对打开的记录集对象的影响。
CDatabase::GetDatabaseName 返回当前正在使用的数据库的名称。
CDatabase::IsOpen 如果 CDatabase 对象当前连接到数据源,则返回非零。
CDatabase::OnSetOptions 由框架调用以设置标准连接选项。 默认实现设置查询超时值。 可通过调用 SetQueryTimeout 来提前建立这些选项。
CDatabase::Open 建立与数据源的连接(通过 ODBC 驱动程序)。
CDatabase::OpenEx 建立与数据源的连接(通过 ODBC 驱动程序)。
CDatabase::Rollback 撤销当前事务期间所做的更改。 数据源返回到之前的状态,就像 BeginTrans 调用时定义的那样,没有改变。
CDatabase::SetLoginTimeout 设置数据源连接尝试超时后的秒数。
CDatabase::SetQueryTimeout 设置数据库查询操作超时后的秒数。影响所有后续记录集 OpenAddNewEditDelete 调用。

公共数据成员

“属性” 描述
CDatabase::m_hdbc 到数据源的开放式数据库连接 (ODBC) 连接句柄。 键入 HDBC

备注

数据源是某些数据库管理系统 (DBMS) 托管的特定数据实例。 示例包括 Microsoft SQL Server、Microsoft Access、Borland dBASE 和 xBASE。 可以在应用程序中同时激活一个或多个 CDatabase 对象。

注意

如果使用数据访问对象 (DAO) 类而不是开放式数据库连接 (ODBC) 类,请改用 CDaoDatabase 类。 有关详细信息,请参阅文章概述:数据库编程

若要使用 CDatabase,请构造 CDatabase 对象并调用其 OpenEx 成员函数。 这会打开连接。 然后,构造 CRecordset 对象以便对连接的数据源进行操作时,请将指向 CDatabase 对象的指针传递给记录集构造函数。 使用完连接后,调用 Close 成员函数并销毁 CDatabase 对象。 Close 关闭之前未关闭的所有记录集。

有关 CDatabase 的详细信息,请参阅文章数据源 (ODBC)概述:数据库编程

继承层次结构

CObject

CDatabase

要求

标头afxdb.h

CDatabase::BeginTrans

调用此成员函数以使用连接的数据源开始事务。

BOOL BeginTrans();

返回值

如果调用成功并且仅手动提交更改,则为非零值;否则为 0。

备注

事务由对 CRecordset 对象的 AddNewEditDeleteUpdate 成员函数的一个或多个调用组成。 在开始事务之前,CDatabase 对象必须已通过调用其 OpenExOpen 成员函数连接到数据源。 若要结束事务,请调用 CommitTrans 以接受对数据源的所有更改(并执行)或调用 Rollback 以中止整个事务。 在打开事务中涉及的任何记录集并尽可能接近实际更新操作后调用 BeginTrans

注意

根据 ODBC 驱动程序,在调用 BeginTrans 之前打开记录集可能会导致调用 Rollback 时出现问题。 应检查所使用的特定驱动程序。 例如,使用 Microsoft ODBC Desktop Driver Pack 3.0 中包含的 Microsoft Access 驱动程序时,必须考虑到 Jet 数据库引擎的要求,即不应在任何具有打开游标的数据库上开始事务。 在 MFC 数据库类中,打开的游标表示打开的 CRecordset 对象。 有关详细信息,请参阅技术说明 68

BeginTrans 也可能会锁定服务器上的数据记录,具体取决于请求的并发和数据源的功能。 有关锁定数据的信息,请参阅记录集:锁定记录 (ODBC)一文。

用户定义事务在事务 (ODBC) 一文中进行了说明。

BeginTrans 建立事务序列可以回退(撤销)的状态。 若要为回退建立新状态,请提交任何当前事务,然后再次调用 BeginTrans

注意

再次调用 BeginTrans 而不调用 CommitTransRollback 会出错。

调用 CanTransact 成员函数来确定驱动程序是否支持给定数据库的事务。 还应调用 GetCursorCommitBehaviorGetCursorRollbackBehavior 来确定对游标保留的支持。

有关事务的详细信息,请参阅事务 (ODBC) 一文。

示例

请参阅事务:在记录集中执行事务 (ODBC) 一文。

CDatabase::BindParameters

如果需要在调用 CDatabase::ExecuteSQL 之前绑定参数,请替代 BindParameters

virtual void BindParameters(HSTMT hstmt);

参数

hstmt
要为其绑定参数的 ODBC 语句句柄。

注解

当不需要存储过程的结果集时,此方法非常有用。

在替代的内容中,调用 SQLBindParameters 和相关的 ODBC 函数以绑定参数。 MFC 在你调用 ExecuteSQL 之前先调用你替代的内容。 不需要调用 SQLPrepareExecuteSQL 调用 SQLExecDirect 并销毁 hstmt,后者只使用一次。

CDatabase::Cancel

调用此成员函数以请求数据源从第二个线程取消正在进行的异步操作或进程。

void Cancel();

备注

请注意,MFC ODBC 类不再使用异步处理;若要执行异步操作,必须直接调用 ODBC API 函数 SQLSetConnectOption。 有关详细信息,请参阅异步执行

CDatabase::CanTransact

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

BOOL CanTransact() const;

返回值

如果使用 CDatabase 对象的记录集允许事务,则为非零值;否则为 0。

备注

有关事务的信息,请参阅事务 (ODBC) 一文。

CDatabase::CanUpdate

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

BOOL CanUpdate() const;

返回值

如果 CDatabase 对象允许更新,则为非零值;否则为 0,表示在打开 CDatabase 对象时在 bReadOnly 中传递了 TRUE,或者数据库本身是只读的。 如果对 SQL_DATASOURCE_READ_ONLY 的 ODBC API 函数 SQLGetInfo 的调用返回 y,则数据源为只读。

注解

并非所有驱动程序都支持更新。

CDatabase::CDatabase

构造 CDatabase 对象。

CDatabase();

备注

构造对象后,必须调用其 OpenExOpen 成员函数来建立与指定数据源的连接。

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

示例

此示例演示如何在 CDocument 的派生类中使用 CDatabase

// This fragment is taken from the declaration for CMyDatabaseDoc
// CMyDatabaseDoc is derived from CDocument.
public:
// Declare a CDatabase embedded in the document
CDatabase m_dbCust;

 

// Initialize when needed
CDatabase *CMyDatabaseDoc::GetDatabase()
{
   // Connect the object to a data source
   if (!m_dbCust.IsOpen() && !m_dbCust.OpenEx(NULL))
      return NULL;

   return &m_dbCust;
}

CDatabase::Close

如果要断开数据源的连接,请调用此成员函数。

virtual void Close();

备注

在调用此成员函数之前,必须关闭与 CDatabase 对象关联的任何记录集。 由于 Close 不会销毁 CDatabase 对象,因此可通过打开与同一数据源或其他数据源的新连接来重用该对象。

使用数据库的记录集的所有挂起的 AddNewEdit 语句都将取消,而所有挂起的事务都将回退。 依赖于 CDatabase 对象的任何记录集都处于未定义状态。

示例

// Close the current connection
m_dbCust.Close();

// Perhaps connect the object to a
// different data source
m_dbCust.OpenEx(_T("DSN=MFC_ODBCTest;UID=JOES"));

CDatabase::CommitTrans

完成事务时调用此成员函数。

BOOL CommitTrans();

返回值

如果成功提交更新,则为非零值;否则为 0。 如果 CommitTrans 失败,则数据源的状态未定义。 必须检查数据以确定其状态。

备注

事务由对 CRecordset 对象的 AddNewEditDeleteUpdate 成员函数的一系列调用组成,这些调用以对 BeginTrans 成员函数的调用开始。 CommitTrans 提交事务。 默认情况下,更新会立即提交;调用 BeginTrans 会导致更新提交延迟,直到调用 CommitTrans

在调用 CommitTrans 结束事务之前,可以调用 Rollback 成员函数以中止事务,让数据源保持原始状态。 若要开始新事务,请再次调用 BeginTrans

有关事务的详细信息,请参阅事务 (ODBC) 一文。

示例

请参阅事务:在记录集中执行事务 (ODBC) 一文。

CDatabase::ExecuteSQL

需要直接执行 SQL 命令时调用此成员函数。

void ExecuteSQL(LPCTSTR lpszSQL);

参数

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

备注

将命令创建以 null 结尾的字符串。 ExecuteSQL 不返回数据记录。 如果要对记录进行操作,请改用记录集对象。

数据源的大多数命令通过记录集对象发出,记录集对象支持用于选择数据、插入新记录、删除记录和编辑记录的命令。 但是,数据库类并非直接支持所有 ODBC 功能,因此有时可能需要使用 ExecuteSQL 进行直接 SQL 调用。

示例

try
{
   m_dbCust.ExecuteSQL(
       _T("UPDATE Taxes ")
       _T("SET Rate = '36' ")
       _T("WHERE Name = 'Federal'"));
}
catch (CDBException *pe)
{
   // The error code is in pe->m_nRetCode
   pe->ReportError();
   pe->Delete();
}

CDatabase::GetBookmarkPersistence

在某些操作之后,通过调用此成员函数确定记录集对象上的书签的持久性。

DWORD GetBookmarkPersistence() const;

返回值

用于标识操作的位掩码,书签通过它来保存在记录集对象上。 有关详细信息,请参阅“备注”。

备注

例如,如果调用 CRecordset::GetBookmark,然后调用 CRecordset::Requery,则从 GetBookmark 获取的书签可能不再有效。 在调用 GetBookmarkPersistence 之前应当先调用 CRecordset::SetBookmark

下表列出了位掩码值,这些值可组合成 GetBookmarkPersistence 的返回值。

位掩码值 书签的持久性
SQL_BP_CLOSE 在进行 Requery 操作之后,书签将变为有效。
SQL_BP_DELETE 在某一行上进行 Delete 操作后,该行的书签将变为有效。
SQL_BP_DROP 在进行 Close 操作之后,书签将变为有效。
SQL_BP_SCROLL 在进行任何 Move 操作之后,书签将变为有效。 这只标识记录集上是否支持书签,正如 CRecordset::CanBookmark 返回的值一样。
SQL_BP_TRANSACTION 在提交或回滚事务后,书签将变为有效。
SQL_BP_UPDATE 在某一行上进行 Update 操作后,该行的书签将变为有效。
SQL_BP_OTHER_HSTMT 与某个记录集对象关联的书签在另一个记录集上有效。

有关此返回值的详细信息,请参阅 Windows SDK 中的 ODBC API 函数 SQLGetInfo。 有关书签的详细信息,请参阅文章记录集:书签和绝对位置 (ODBC)

CDatabase::GetConnect

调用此成员函数以检索在调用 OpenExOpen 期间使用的连接字符串,该连接字符串将 CDatabase 对象连接到数据源。

const CString GetConnect() const;

返回值

如果调用了 OpenExOpen,则为包含连接字符串的 constCString;否则为空字符串。

备注

有关如何创建连接字符串的说明,请参阅 CDatabase::Open

CDatabase::GetCursorCommitBehavior

调用此成员函数以确定 CommitTrans 操作如何影响打开的记录集对象上的游标。

int GetCursorCommitBehavior() const;

返回值

指示事务对打开的记录集对象的影响的值。 有关详细信息,请参阅“备注”。

备注

下表列出了 GetCursorCommitBehavior 可能的返回值以及对打开记录集的相应影响。

返回值 CRecordset 对象的影响
SQL_CB_CLOSE 在事务提交后立即调用 CRecordset::Requery
SQL_CB_DELETE 在事务提交后立即调用 CRecordset::Close
SQL_CB_PRESERVE 正常进行 CRecordset 操作。

有关此返回值的详细信息,请参阅 Windows SDK 中的 ODBC API 函数 SQLGetInfo。 有关事务的详细信息,请参阅事务 (ODBC) 一文。

CDatabase::GetCursorRollbackBehavior

调用此成员函数以确定 Rollback 操作如何影响打开的记录集对象上的游标。

int GetCursorRollbackBehavior() const;

返回值

指示事务对打开的记录集对象的影响的值。 有关详细信息,请参阅“备注”。

备注

下表列出了 GetCursorRollbackBehavior 可能的返回值以及对打开记录集的相应影响。

返回值 CRecordset 对象的影响
SQL_CB_CLOSE 在事务回退后立即调用 CRecordset::Requery
SQL_CB_DELETE 在事务回退后立即调用 CRecordset::Close
SQL_CB_PRESERVE 正常进行 CRecordset 操作。

有关此返回值的详细信息,请参阅 Windows SDK 中的 ODBC API 函数 SQLGetInfo。 有关事务的详细信息,请参阅事务 (ODBC) 一文。

CDatabase::GetDatabaseName

调用此成员函数以检索当前连接的数据库的名称(前提是数据源定义了一个名为“database”的对象)。

CString GetDatabaseName() const;

返回值

如果成功,则为包含数据库名称的 CString;否则为空的 CString

备注

这与 OpenExOpen 调用中指定的数据源名称 (DSN) 不同。 GetDatabaseName 返回的内容取决于 ODBC。 通常,数据库是表的集合。 如果此实体具有名称,GetDatabaseName 会返回它的名称。

例如,你可能想要在标题中显示此名称。 如果从 ODBC 检索名称时发生错误,GetDatabaseName 将返回空的 CString

CDatabase::IsOpen

调用此成员函数以确定 CDatabase 对象当前是否连接到数据源。

BOOL IsOpen() const;

返回值

如果 CDatabase 对象当前已连接,则为非零值;否则为 0。

CDatabase::m_hdbc

包含 ODBC 数据源连接的公共句柄 -“连接句柄”。

备注

通常,无需直接访问此成员变量。 相反,框架会在你调用 OpenExOpen 时分配句柄。 在 CDatabase 对象上调用 delete 运算符时,框架会取消分配句柄。 请注意,Close 成员函数不会取消分配句柄。

但在某些情况下,可能需要直接使用句柄。 例如,如果需要直接调用 ODBC API 函数而不是通过类 CDatabase,可能需要一个连接句柄作为参数传递。 请参阅以下代码示例。

示例

// Using m_hdbc for a direct ODBC API call.
// m_dbCust is the CDatabase object; m_hdbc is
// its HDBC member variable
nRetCode = ::SQLGetInfo(m_dbCust.m_hdbc, SQL_ODBC_SQL_CONFORMANCE,
                        &nValue, sizeof(nValue), &cbValue);

CDatabase::OnSetOptions

当用 ExecuteSQL 成员函数直接执行 SQL 语句时,框架会调用此成员函数。

virtual void OnSetOptions(HSTMT hstmt);

参数

hstmt
要为其设置选项的 ODBC 语句句柄。

注解

CRecordset::OnSetOptions 还调用此成员函数。

OnSetOptions 设置登录超时值。 如果之前有对 SetQueryTimeout 和成员函数的调用,OnSetOptions 反映当前值;否则,它会设置默认值。

注意

在 MFC 4.2 之前,OnSetOptions 还会将处理模式设置为同步或异步。 从 MFC 4.2 开始,所有操作都是同步的。 若要执行异步操作,必须直接调用 ODBC API 函数 SQLSetPos

无需替代 OnSetOptions 即可更改超时值。 相反,若要自定义查询超时值,请在创建记录集之前调用 SetQueryTimeoutOnSetOptions 将使用新值。 设置的值适用于所有记录集或直接 SQL 调用的后续操作。

如果要设置其他选项,请替代 OnSetOptions。 替代应在调用 ODBC API 函数 SQLSetStmtOption 之前或之后调用基类 OnSetOptions。 遵循框架的 OnSetOptions 默认实现中所示的方法。

CDatabase::Open

调用此成员函数以初始化新构造的 CDatabase 对象。

virtual BOOL Open(
    LPCTSTR lpszDSN,
    BOOL bExclusive = FALSE,
    BOOL bReadOnly = FALSE,
    LPCTSTR lpszConnect = _T("ODBC;"),
    BOOL bUseCursorLib = TRUE);

参数

lpszDSN
指定数据源名称 - 通过 ODBC 管理员程序向 ODBC 注册的名称。 如果在 lpszConnect 中指定了 DSN 值(格式为“DSN=<data-source>”),则不得在 lpszDSN 中再次指定它。 在这种情况下,lpszDSN 应为 NULL。 否则,如果要向用户显示数据源对话框供用户选择数据源,则可传递 NULL。 有关详细信息,请参阅“注解”。

bExclusive
此版本的类库不支持。 目前,如果此参数为 TRUE,断言将失败。 数据源始终将以共享(非独占)方式打开。

bReadOnly
如果打算将连接设为只读并禁止更新数据源,则为 TRUE。 所有依赖记录集都继承此属性。 默认值为 FALSE

lpszConnect
指定连接字符串。 连接字符串连接信息,其中可能包括数据源名称、在数据源上有效的用户 ID、用户身份验证字符串(密码,如果数据源需要)和其他信息。 整个连接字符串必须以字符串 "ODBC;"(大写或小写)为前缀。 "ODBC;" 字符串用于指示到 ODBC 数据源的连接;当类库的未来版本可能支持非 ODBC 数据源时,这是为了实现后向兼容性。

bUseCursorLib
如果要加载 ODBC 游标库 DLL,则为 TRUE。 游标库掩盖了基础 ODBC 驱动程序的一些功能,从而有效阻止了动态集的使用(如果驱动程序支持动态集)。 如果加载了游标库,则唯一支持的游标是静态快照和只进游标。 默认值为 TRUE。 如果计划直接从 CRecordset 创建记录集对象而不从它派生,则不应加载游标库。

返回值

如果连接成功,则为非零值;否则,如果用户在出现询问更多连接信息的对话框时选择“取消”,则为 0。 在所有其他情况下,框架会引发异常。

备注

必须先初始化数据库对象,然后才能使用它来构造记录集对象。

注意

调用 OpenEx 成员函数是连接到数据源和初始化数据库对象的首选方法。

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

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

此外,还可以将连接字符串用于多个级别的登录授权(每个级别用于不同的 CDatabase 对象),或传达其他特定于数据源的信息。 有关连接字符串的详细信息,请参阅 Windows SDK 中的第 5 章。

例如,如果 DBMS 主机不可用,则连接尝试可能会超时。 如果连接尝试失败,Open 将引发 CDBException

示例

// m_dbCust is a CDatabase object embedded in a CDocument class

if (bDefault)
{
   // Connect the object to a data source (no password)
   // the ODBC connection dialog box will always remain hidden
   m_dbCust.Open(_T("MFC_ODBCTest"), FALSE, FALSE, _T("ODBC;UID=JOES"));
}
else
{
   // ...Or, query the user for all connection information
   m_dbCust.Open(NULL);
}

CDatabase::OpenEx

调用此成员函数以初始化新构造的 CDatabase 对象。

virtual BOOL OpenEx(
    LPCTSTR lpszConnectString,
    DWORD dwOptions = 0);

参数

lpszConnectString
指定 ODBC 连接字符串。 这包括数据源名称以及其他可选信息,例如用户 ID 和密码。 例如,"DSN=SQLServer_Source;UID=SA;PWD=abc123" 是可能的连接字符串。 请注意,如果为 lpszConnectString 传递 NULL,则“数据源”对话框将提示用户选择数据源。

dwOptions
一个位掩码,用于指定以下值的组合。 默认值为 0,这意味着数据库将以共享方式打开,并具有写入权限,ODBC 游标库 DLL 将不会加载,并且仅当没有足够的信息来建立连接时,ODBC 连接对话框才会显示。

  • CDatabase::openExclusive 此版本的类库不支持。 数据源始终将以共享(非独占)方式打开。 目前,如果指定此选项,断言将失败。

  • CDatabase::openReadOnly 以只读方式打开数据源。

  • CDatabase::useCursorLib 加载 ODBC 游标库 DLL。 游标库掩盖了基础 ODBC 驱动程序的一些功能,从而有效阻止了动态集的使用(如果驱动程序支持动态集)。 如果加载了游标库,则唯一支持的游标是静态快照和只进游标。 如果计划直接从 CRecordset 创建记录集对象而不从它派生,则不应加载游标库。

  • CDatabase::noOdbcDialog 无论是否提供了足够的连接信息,都不显示 ODBC 连接对话框。

  • CDatabase::forceOdbcDialog 始终显示 ODBC 连接对话框。

返回值

如果连接成功,则为非零值;否则,如果用户在出现询问更多连接信息的对话框时选择“取消”,则为 0。 在所有其他情况下,框架会引发异常。

备注

必须先初始化数据库对象,然后才能使用它来构造记录集对象。

如果 OpenEx 调用中的 lpszConnectString 参数没有包含足够的信息来建立连接,ODBC 驱动程序会打开一个对话框以从用户那里获取必要的信息,前提是没有在 dwOptions 参数中设置 CDatabase::noOdbcDialogCDatabase::forceOdbcDialog。 调用 OpenEx 时,连接字符串 lpszConnectString 会以私密方式存储在 CDatabase 对象中,可通过调用 GetConnect 成员函数获得。

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

此外,还可以将连接字符串用于多个级别的登录授权(每个级别用于不同的 CDatabase 对象),或传达其他特定于数据源的信息。 有关连接字符串的详细信息,请参阅 ODBC 程序员参考中的第 6 章。

例如,如果 DBMS 主机不可用,则连接尝试可能会超时。 如果连接尝试失败,OpenEx 将引发 CDBException

示例

// m_dbCust is a CDatabase object embedded in a CDocument class.

// Connect the object to a read-only data source where
// the ODBC connection dialog box will always remain hidden
m_dbCust.OpenEx(_T("DSN=MFC_ODBCTest;UID=JOES"),
                CDatabase::openReadOnly | CDatabase::noOdbcDialog);

CDatabase::Rollback

调用此成员函数以撤销在事务期间所做的更改。

BOOL Rollback();

返回值

如果事务已成功撤销,则为非零值;否则为 0。 如果 Rollback 调用失败,则数据源和事务的状态未定义。 如果 Rollback 返回 0,则必须检查数据源以确定其状态。

备注

自上次 BeginTrans 后执行的所有 CRecordsetAddNewEditDeleteUpdate 调用都回退到该调用时的状态。

调用 Rollback 后,事务结束,必须再次调用 BeginTrans 进行另一个事务。 调用 BeginTrans 之前的当前记录在 Rollback 之后再次成为当前记录。

回退后,回退之前的当前记录保持当前状态。 若要详细了解回退后记录集和数据源的状态,请参阅事务 (ODBC) 一文。

示例

请参阅事务:在记录集中执行事务 (ODBC) 一文。

CDatabase::SetLoginTimeout

在调用 OpenExOpen 之前调用此成员函数,以替代在数据源连接尝试超时之前允许的默认秒数。

void SetLoginTimeout(DWORD dwSeconds);

参数

dwSeconds
在连接尝试超时之前允许的秒数。

备注

例如,如果 DBMS 不可用,则连接尝试可能会超时。 在构造未初始化的 CDatabase 对象之后且调用 OpenExOpen 之前调用 SetLoginTimeout

登录超时的默认值是 15 秒。 并非所有数据源都支持指定登录超时值的功能。 如果数据源不支持超时,你会收到跟踪输出,但系统不会引发异常。 值为 0 表示“无限”。

CDatabase::SetQueryTimeout

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

void SetQueryTimeout(DWORD dwSeconds);

参数

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

备注

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

查询超时的默认值是 15 秒。 并非所有数据源都支持设置查询超时值的功能。 如果将查询超时值设置为 0,则不会发生超时;与数据源的通信可能会停止响应。 此行为在开发过程中可能很有用。 如果数据源不支持超时,你会收到跟踪输出,但系统不会引发异常。

另请参阅

CObject
层次结构图
CRecordset