CDatabase
类
表示与数据源的连接,通过此连接可操作数据源。
语法
class CDatabase : public CObject
成员
公共构造函数
名称 | 描述 |
---|---|
CDatabase::CDatabase |
构造 CDatabase 对象。 必须通过调用 OpenEx 或 Open 来初始化对象。 |
公共方法
名称 | 描述 |
---|---|
CDatabase::BeginTrans |
在连接的数据源上启动一个“事务”,即一系列对 CRecordset 类的 AddNew 、Edit 、Delete 和 Update 成员函数的可逆调用。 数据源必须支持事务才能使 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 |
设置数据库查询操作超时后的秒数。影响所有后续记录集 Open 、AddNew 、Edit 和 Delete 调用。 |
公共数据成员
“属性” | 描述 |
---|---|
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) 和概述:数据库编程。
继承层次结构
CDatabase
要求
标头:afxdb.h
CDatabase::BeginTrans
调用此成员函数以使用连接的数据源开始事务。
BOOL BeginTrans();
返回值
如果调用成功并且仅手动提交更改,则为非零值;否则为 0。
备注
事务由对 CRecordset
对象的 AddNew
、Edit
、Delete
和 Update
成员函数的一个或多个调用组成。 在开始事务之前,CDatabase
对象必须已通过调用其 OpenEx
或 Open
成员函数连接到数据源。 若要结束事务,请调用 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
而不调用 CommitTrans
或 Rollback
会出错。
调用 CanTransact
成员函数来确定驱动程序是否支持给定数据库的事务。 还应调用 GetCursorCommitBehavior
和 GetCursorRollbackBehavior
来确定对游标保留的支持。
有关事务的详细信息,请参阅事务 (ODBC) 一文。
示例
请参阅事务:在记录集中执行事务 (ODBC) 一文。
CDatabase::BindParameters
如果需要在调用 CDatabase::ExecuteSQL
之前绑定参数,请替代 BindParameters
。
virtual void BindParameters(HSTMT hstmt);
参数
hstmt
要为其绑定参数的 ODBC 语句句柄。
注解
当不需要存储过程的结果集时,此方法非常有用。
在替代的内容中,调用 SQLBindParameters
和相关的 ODBC 函数以绑定参数。 MFC 在你调用 ExecuteSQL
之前先调用你替代的内容。 不需要调用 SQLPrepare
;ExecuteSQL
调用 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();
备注
构造对象后,必须调用其 OpenEx
或 Open
成员函数来建立与指定数据源的连接。
你可能会发现,将 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
对象,因此可通过打开与同一数据源或其他数据源的新连接来重用该对象。
使用数据库的记录集的所有挂起的 AddNew
或 Edit
语句都将取消,而所有挂起的事务都将回退。 依赖于 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
对象的 AddNew
、Edit
、Delete
和 Update
成员函数的一系列调用组成,这些调用以对 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
调用此成员函数以检索在调用 OpenEx
或 Open
期间使用的连接字符串,该连接字符串将 CDatabase
对象连接到数据源。
const CString GetConnect() const;
返回值
如果调用了 OpenEx
或 Open
,则为包含连接字符串的 const
CString
;否则为空字符串。
备注
有关如何创建连接字符串的说明,请参阅 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
。
备注
这与 OpenEx
或 Open
调用中指定的数据源名称 (DSN) 不同。 GetDatabaseName
返回的内容取决于 ODBC。 通常,数据库是表的集合。 如果此实体具有名称,GetDatabaseName
会返回它的名称。
例如,你可能想要在标题中显示此名称。 如果从 ODBC 检索名称时发生错误,GetDatabaseName
将返回空的 CString
。
CDatabase::IsOpen
调用此成员函数以确定 CDatabase
对象当前是否连接到数据源。
BOOL IsOpen() const;
返回值
如果 CDatabase
对象当前已连接,则为非零值;否则为 0。
CDatabase::m_hdbc
包含 ODBC 数据源连接的公共句柄 -“连接句柄”。
备注
通常,无需直接访问此成员变量。 相反,框架会在你调用 OpenEx
或 Open
时分配句柄。 在 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
即可更改超时值。 相反,若要自定义查询超时值,请在创建记录集之前调用 SetQueryTimeout
;OnSetOptions
将使用新值。 设置的值适用于所有记录集或直接 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::noOdbcDialog
或 CDatabase::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
调用以来执行的所有CRecordset
AddNew
、Edit
、Delete
和Update
调用都会回滚到该调用时存在的状态。
调用 Rollback
后,事务结束,必须再次调用 BeginTrans
进行另一个事务。 调用 BeginTrans
之前的当前记录在 Rollback
之后再次成为当前记录。
回退后,回退之前的当前记录保持当前状态。 若要详细了解回退后记录集和数据源的状态,请参阅事务 (ODBC) 一文。
示例
请参阅事务:在记录集中执行事务 (ODBC) 一文。
CDatabase::SetLoginTimeout
在调用 OpenEx
或 Open
之前调用此成员函数,以替代在数据源连接尝试超时之前允许的默认秒数。
void SetLoginTimeout(DWORD dwSeconds);
参数
dwSeconds
在连接尝试超时之前允许的秒数。
备注
例如,如果 DBMS 不可用,则连接尝试可能会超时。 在构造未初始化的 CDatabase
对象之后且调用 OpenEx
或 Open
之前调用 SetLoginTimeout
。
登录超时的默认值是 15 秒。 并非所有数据源都支持指定登录超时值的功能。 如果数据源不支持超时,你会收到跟踪输出,但系统不会引发异常。 值为 0 表示“无限”。
CDatabase::SetQueryTimeout
调用此成员函数以重写在连接的数据源上的后续操作超时之前允许的默认秒数。
void SetQueryTimeout(DWORD dwSeconds);
参数
dwSeconds
在查询尝试超时之前允许的秒数。
备注
由于网络访问问题、查询处理时间过长等原因,操作可能会超时。 如果要更改查询超时值,请在打开记录集之前或在调用记录集的 AddNew
、Update
或 Delete
成员函数之前调用 SetQueryTimeout
。 此设置会影响对与此 CDatabase
对象关联的任何记录集的所有后续 Open
、AddNew
、Update
和 Delete
调用。 打开后更改记录集的查询超时值不会更改记录集的值。 例如,后续的 Move
操作不使用新值。
查询超时的默认值是 15 秒。 并非所有数据源都支持设置查询超时值的功能。 如果将查询超时值设置为 0,则不会发生超时;与数据源的通信可能会停止响应。 此行为在开发过程中可能很有用。 如果数据源不支持超时,你会收到跟踪输出,但系统不会引发异常。