CDatabase
類別
表示資料來源的連接,您可以透過這個連接來操作資料來源。
語法
class CDatabase : public CObject
成員
公用建構函式
名稱 | 描述 |
---|---|
CDatabase::CDatabase |
建構 CDatabase 物件。 您必須呼叫 OpenEx 或 Open 來初始化 物件。 |
公用方法
名稱 | 描述 |
---|---|
CDatabase::BeginTrans |
在連接的數據源上啟動「交易」,這是對 類別Edit 、AddNew 、 Delete 和 Update 成員函CRecordset 式的一系列可逆呼叫。 數據源必須支援 的交易 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) 類別,而不是 Open Database Connectivity (ODBC) 類別,請改用 類別 CDaoDatabase
。 如需詳細資訊,請參閱概觀:資料庫程序設計一文。
若要使用 CDatabase
,請建構 CDatabase
物件並呼叫其 OpenEx
成員函式。 這會開啟連線。 當您接著建構 CRecordset
物件以在連接的數據源上操作時,請將記錄集建構函式傳遞至物件的 CDatabase
指標。 當您完成連接時,請呼叫 Close
成員函式並終結 CDatabase
物件。 Close
關閉您先前尚未關閉的任何記錄集。
如需 的詳細資訊CDatabase
,請參閱數據源(ODBC)和概觀:資料庫程序設計文章。
繼承階層架構
CDatabase
需求
標頭: afxdb.h
CDatabase::BeginTrans
呼叫此成員函式,以開始與已連線數據源的交易。
BOOL BeginTrans();
傳回值
如果呼叫成功且只手動認可變更,則為非零;否則為 0。
備註
交易是由物件、、 和 Update
成員CRecordset
函式的AddNew
一或多個Delete
呼叫所組成。 Edit
開始交易之前, 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)一文。
範例
請參閱交易:在 Recordset 中執行交易一文 (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
物件時傳入TRUE
bReadOnly
,或數據源本身是唯讀的。 如果 對 ODBC API 函SQLGetInfo
SQL_DATASOURCE_READ_ONLY
式的呼叫傳回 ,則數據源是唯讀的y
。
備註
並非所有驅動程式都支援更新。
CDatabase::CDatabase
建構 CDatabase
物件。
CDatabase();
備註
建構 物件之後,您必須呼叫其 OpenEx
或 Open
成員函式,以建立與指定數據源的連線。
您可能會發現在檔案類別中內嵌 CDatabase
物件很方便。
範例
這個範例說明 CDatabase
在衍生類別中使用 CDocument
。
// 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
失敗,則數據源的狀態為未定義。 您必須檢查數據以判斷其狀態。
備註
交易是由一連串呼叫 AddNew
Edit
、、 Delete
和 Update
成員函CRecordset
式的物件函式所組成,該函式開頭為成員函式的呼叫BeginTrans
。 CommitTrans
認可交易。 根據預設,會立即認可更新;呼叫 BeginTrans
會導致更新的承諾延遲到呼叫為止 CommitTrans
。
在您呼叫 CommitTrans
結束交易之前,您可以呼叫 Rollback
成員函式來中止交易,並將數據源保留為其原始狀態。 若要開始新的交易,請再次呼叫 BeginTrans
。
如需交易的詳細資訊,請參閱交易(ODBC)一文。
範例
請參閱交易:在 Recordset 中執行交易一文 (ODBC)。
CDatabase::ExecuteSQL
當您需要直接執行 SQL 命令時,請呼叫此成員函式。
void ExecuteSQL(LPCTSTR lpszSQL);
參數
lpszSQL
包含要執行之有效 SQL 命令之 Null 終止字串的指標。 您可以傳遞 CString
。
備註
將命令建立為 Null 終止的字串。 ExecuteSQL
不會傳回數據記錄。 如果您想要在記錄上操作,請改用 recordset 物件。
數據源的大部分命令都是透過 recordset 對象發出,這些物件支援選取資料、插入新記錄、刪除記錄和編輯記錄的命令。 不過,資料庫類別並不直接支援所有 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
。 如需書籤的詳細資訊,請參閱 Recordset:Bookmarks 和 Absolute Positions (ODBC)一文。
CDatabase::GetConnect
呼叫這個成員函式,擷取呼叫OpenEx
期間所使用的 連接字串,或Open
將CDatabase
對象連接到數據源。
const CString GetConnect() const;
傳回值
const
CString
,如果 OpenEx
已呼叫 或 Open
,則包含 連接字串,否則為空字串。
備註
如需如何建立 連接字串 的說明,請參閱 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
的 。
備註
這與 或 Open
呼叫中指定的OpenEx
數據來源名稱 (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
也會將處理模式設定為 snychronous 或異步。 從 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
指定 連接字串。 連接字串 串連資訊,可能包括數據源名稱、數據源上有效的使用者標識碼、使用者驗證字串(密碼,如果數據源需要密碼),以及其他資訊。 整個 連接字串 前面必須加上字串"ODBC;"
(大寫或小寫)。 字串 "ODBC;"
用來指出連接是 ODBC 數據源;當未來版本的類別庫可能支援非 ODBC 數據源時,這是為了向上相容性。
bUseCursorLib
TRUE
如果您要載入 ODBC 資料指標連結庫 DLL。 數據指標連結庫會遮罩基礎 ODBC 驅動程式的某些功能,有效地防止使用動態集(如果驅動程式支援它們)。 載入數據指標連結庫時,唯一支持的數據指標是靜態快照集和向前數據指標。 預設值是 TRUE
。 如果您打算直接從 CRecordset
建立 recordset 物件,而不衍生自該物件,則不應該載入數據指標連結庫。
傳回值
如果成功建立連線,則為非零;否則,如果使用者在顯示對話框時選擇 [取消],要求取得更多連線資訊,則為 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 連接字串。 這包括數據來源名稱以及其他選擇性資訊,例如使用者標識碼和密碼。 例如,"DSN=SQLServer_Source;UID=SA;PWD=abc123"
是可能的 連接字串。 請注意,如果您針對 傳遞 NULL
lpszConnectString
,[數據源] 對話框將會提示用戶選取數據源。
dwOptions
位掩碼,指定下列值的組合。 默認值為 0,這表示資料庫會以寫入存取權共用方式開啟、不會載入 ODBC 數據指標連結庫 DLL,而且只有在沒有足夠的資訊可建立連接時,才會顯示 [ODBC 連接] 對話框。
CDatabase::openExclusive
此類別庫版本不支援。 數據源一律會以共用方式開啟(非獨佔)。 目前,如果您指定此選項,判斷提示就會失敗。CDatabase::openReadOnly
以唯讀模式開啟數據源。CDatabase::useCursorLib
載入 ODBC 資料指標連結庫 DLL。 數據指標連結庫會遮罩基礎 ODBC 驅動程式的某些功能,有效地防止使用動態集(如果驅動程式支援它們)。 載入數據指標連結庫時,唯一支持的數據指標是靜態快照集和向前數據指標。 如果您打算直接從CRecordset
建立 recordset 物件,而不衍生自該物件,則不應該載入數據指標連結庫。CDatabase::noOdbcDialog
不論是否提供足夠的連接資訊,都不要顯示 [ODBC 連接] 對話方塊。CDatabase::forceOdbcDialog
一律顯示 [ODBC 連接] 對話框。
傳回值
如果成功建立連線,則為非零;否則,如果使用者在顯示對話框時選擇 [取消],要求取得更多連線資訊,則為 0。 在其他所有情況下,架構都會擲回例外狀況。
備註
您的資料庫對象必須先初始化,才能使用它來建構記錄集物件。
lpszConnectString
如果呼叫中的 OpenEx
參數未包含足夠的資訊來建立連接,ODBC 驅動程式會開啟對話方塊,以從使用者取得必要的資訊,前提是您尚未設定 CDatabase::noOdbcDialog
或 CDatabase::forceOdbcDialog
參數。dwOptions
當您呼叫 OpenEx
時,您的 連接字串 會lpszConnectString
私下儲存在 物件中CDatabase
,而且可藉由呼叫GetConnect
成員函式來取得。
如果您想要的話,您可以先開啟自己的對話框,再呼叫 OpenEx
以取得用戶的資訊,例如密碼,然後將該資訊新增至您傳遞給 OpenEx
的 連接字串。 或者,您可能想要儲存您傳遞的 連接字串,以便在下次應用程式呼叫 OpenEx
CDatabase
物件時重複使用它。
您也可以將 連接字串 用於多個層級的登入授權(每個層級用於不同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)一文。
範例
請參閱交易:在 Recordset 中執行交易一文 (ODBC)。
CDatabase::SetLoginTimeout
呼叫這個成員函式之前,請先呼叫 OpenEx
或 Open
,以覆寫嘗試的數據源連接逾時之前所允許的預設秒數。
void SetLoginTimeout(DWORD dwSeconds);
參數
dwSeconds
在連線嘗試逾時之前所允許的秒數。
備註
例如,如果 DBMS 無法使用,連線嘗試可能會逾時。 SetLoginTimeout
在您建構未初始化CDatabase
的物件之後呼叫 ,但在呼叫 或 Open
之前呼叫 OpenEx
。
登入逾時的預設值為15秒。 並非所有數據源都支援指定登入逾時值的能力。 如果數據源不支援逾時,您會取得追蹤輸出,但不會發生例外狀況。 值為 0 表示「無限」。
CDatabase::SetQueryTimeout
呼叫此成員函式以覆寫預設的秒數,以在連線數據源上的後續作業逾時之前允許。
void SetQueryTimeout(DWORD dwSeconds);
參數
dwSeconds
查詢嘗試逾時前所允許的秒數。
備註
作業可能會因為網路存取問題、查詢處理時間過長等而逾時。 SetQueryTimeout
如果您要變更查詢逾時值,請在開啟記錄集之前或呼叫記錄集的AddNew
、 Update
或 Delete
成員函式之前呼叫 。 此設定會影響與這個CDatabase
物件相關聯之任何記錄集的所有後續Open
、 AddNew
Update
、 和 Delete
呼叫。 開啟之後變更記錄集的查詢逾時值並不會變更記錄集的值。 例如,後續 Move
作業不會使用新的值。
查詢逾時的預設值為15秒。 並非所有數據源都支援設定查詢逾時值的能力。 如果您設定查詢逾時值為 0,則不會發生逾時;與數據源的通訊可能會停止回應。 此行為在開發期間可能很有用。 如果數據源不支援逾時,您會取得追蹤輸出,但不會發生例外狀況。