CRecordset::Open
藉由擷取資料表或於資料錄集執行查詢來開啟資料錄集。
virtual BOOL Open(
UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE,
LPCTSTR lpszSQL = NULL,
DWORD dwOptions = none
);
參數
nOpenType
接受預設值 AFX_DB_USE_DEFAULT_TYPE,或使用下列自 enum OpenType 的其中一個值:CRecordset::dynaset 使用雙向捲動的資料錄集。 資料錄的成員資格和順序由開啟資料錄集的先後決定,不過,其他使用者所做的資料值變更可以由擷取作業看見。 動態集也稱為是索引鍵集驅動資料錄集。
CRecordset::snapshot 使用雙向捲動的靜態資料錄集。 資料錄的成員資格和順序由開啟資料錄集的先後決定; 資料值由資料錄擷取的時機決定。 其他使用者所做的變更,直到資料錄集關閉再重新開啟為止不可見。
CRecordset::dynamic 使用雙向捲動的資料錄集。 其他使用者所做的變更成員資格、排序和資料值可以由擷取作業看見。 請注意許多 ODBC 驅動程式不支援這種格式的資料錄集。
CRecordset::forwardOnly 只能向前捲動的唯讀資料錄集。
對於 CRecordset,預設值為 CRecordset::snapshot。 預設值機制可讓 Visual C++ 精靈與有不同的預設值的 ODBC CRecordset 和 DAO CDaoRecordset互動。
如需這些資料錄集類型的詳細資訊,請參閱本文件的 資料錄集 (ODBC)。 如需相關資訊,請至 Windows SDK 參閱文件「使用區塊和可捲動的資料指標」。
警告
如果要求的型別不支援,架構會擲回例外狀況。
lpszSQL
字串指標包括下列之一:NULL 指標。
資料表的名稱。
選擇性包含 SQL WHERE 或 ORDER BY 子句的 SQL SELECT 陳述式
CALL 陳述式指定預先定義的查詢名稱 (預存程序) 。 請特別小心不要在大括號和 CALL 關鍵字之間插入空白字元。
如需這個字串的詳細資訊,請參閱資料表以及在備註中有關 ClassWizard 作用的討論。
注意事項 在結果集的資料行的順序必須符合在 DoFieldExchange 或 DoBulkFieldExchange 函式覆寫中 RFX 或 Bulk RFX 函式呼叫的順序。
dwOptions
可以指定數值組成的位元遮罩列示如下。 其中一些互斥 (Mutually Exclusive)。 預設值是 none。CRecordset::none 未設定選項。 這個參數值與所有其他值互斥 (Mutually Exclusive)。 根據預設,資料錄集可以與 編輯 或 刪除 一同更新並允許由 AddNew 附加新資料錄。 可更新性取決於資料來源以及指定 nOpenType 選項。 區塊加入的最佳化無法使用。 大量資料列擷取不會實作。 刪除的資料錄不會在資料錄集巡覽時略過。 書籤是無效的。 自動變更欄檢查已生效。
CRecordset::appendOnly 不允許在資料錄集 編輯 或 刪除。 只允許 AddNew 。 這個選項與 CRecordset::readOnly 互斥 (Mutually Exclusive)。
CRecordset::readOnly 開啟資料錄集為唯讀。 這個選項與 CRecordset::appendOnly 互斥 (Mutually Exclusive)。
CRecordset::optimizeBulkAdd 用預備的 SQL 陳述式對一次加入大量資料錄做最佳化。 只應用於不使用 ODBC API 函式 SQLSetPos 更新資料錄集。 第一次更新判斷哪些欄位標記為已變更。 此選項與 CRecordset::useMultiRowFetch 屬性互斥。
CRecordset::useMultiRowFetch 實作大量資料列擷取以用單一擷取操作擷取多行。 這是一個增強效能的進階功能;不過,大量資料錄欄位交換未由 ClassWizard 支援。 這個選項與 CRecordset::optimizeBulkAdd 互斥 (Mutually Exclusive)。 請注意,如果您指定 CRecordset::useMultiRowFetch,則選項 CRecordset::noDirtyFieldCheck 會自動開啟 (雙重緩衝無法使用);在順向資料錄集,選項 CRecordset::useExtendedFetch 會自動開啟。 如需關於大量資料列擷取的詳細資訊,請參閱文件資料錄集:擷取大量資料錄 (ODBC)。
CRecordset::skipDeletedRecords 當巡覽資料錄集時,略過所有已刪除的資料錄。 這會讓某些相對擷取的效能變慢。 這個選項不適用於順向資料錄集。 如果您呼叫 Move 且將 nRows 參數設為,以及設定 CRecordset::skipDeletedRecords 選項, Move 將斷言。 請注意 CRecordset::skipDeletedRecords 類似 驅動程式包裝,也就是說,刪除的資料列從資料錄集移除。 不過,如果您的驅動程式包裝資料錄,則它僅會略過您刪除的記錄;,當資料錄集開啟時,它不會略過其他使用者刪除的資料錄。 CRecordset::skipDeletedRecords 會略過其他使用者刪除的資料列。
CRecordset::useBookmarks 如果支援,則可於資料錄集使用書籤。 書籤減慢資料擷取,但是會改善資料巡覽的效能。 在順向資料錄集無效。 如需詳細資訊,請參閱文件 資料錄集:書籤和絕對位置 (ODBC)。
CRecordset::noDirtyFieldCheck 關閉自動變更欄檢查 (雙重緩衝)。 這會改善效能;不過,您必須透過呼叫 SetFieldDirty 和 SetFieldNull 成員函式手動標記欄位為變更。請注意在類別 CRecordset 的雙重緩衝類似於類別 CDaoRecordset的雙重緩衝。 不過,在 CRecordset,就不能在個別欄位啟用雙重緩衝;您不是於所有欄位啟用就是於所有欄位停用。 請注意,如果您指定 CRecordset::useMultiRowFetch選項,那 CRecordset::noDirtyFieldCheck 會自動開啟;不過, SetFieldDirty 和 SetFieldNull 在實作大量資料列擷取的資料錄集無法使用。
CRecordset::executeDirect 不使用預備的 SQL 陳述式。 如需改進效能,如果 Requery 成員函式永遠不會被呼叫,請指定這個選項。
CRecordset::useExtendedFetch 實作 SQLExtendedFetch 而非 SQLFetch。 這是為了實作在順向資料錄集的大量資料列擷取而設計。 如果您在順向資料錄集指定選項 CRecordset::useMultiRowFetch,則CRecordset::useExtendedFetch 會自動開啟。
CRecordset::userAllocMultiRowBuffers 使用者將配置資料儲存緩衝區。 如果您想要配置自己的儲存區,請搭配 CRecordset::useMultiRowFetch 使用這個選項;否則, framework 會自動配置必要的儲存區。 如需詳細資訊,請參閱文件資料錄集:擷取大量資料錄 (ODBC)。 請注意,指定 CRecordset::userAllocMultiRowBuffers 而沒有一起指定 CRecordset::useMultiRowFetch 將造成失敗的判斷提示。
傳回值
如果已成功開啟 CRecordset 物件,回傳非零;否則如果 CDatabase::Open (如果呼叫) 傳回 0,回傳零。
備註
您必須呼叫此成員函式來執行資料錄集定義的查詢。 在呼叫 Open之前,您必須建構資料錄集物件。
資料來源與資料錄集的連接取決於您在呼叫 Open前建構資料錄集。 如果您傳遞 CDatabase 物件至未連接至資料來源的資料錄集建構函式,這個成員函式使用 GetDefaultConnect 嘗試開啟資料庫物件。 如果您傳遞 NULL 至資料錄集建構函式,建構函式建構 CDatabase 物件給您, Open 則嘗試連接資料庫物件。 如需在這些變動的情況下關閉資料錄集和連接的詳細資料,請參閱 Close。
注意事項 |
---|
透過 CRecordset 物件對資料來源的存取永遠都是共用模式。不同於 CDaoRecordset 類別,您不能使用 CRecordset 物件開啟具有獨佔存取的資料來源。 |
當您呼叫 Open時,查詢,通常是 SELECT SQL 陳述式,以下表為標準為基準選取資料錄。
lpszSQL 參數的值 |
資料錄的選取判斷由 |
範例 |
---|---|---|
NULL |
GetDefaultSQL 傳回的字串。 |
|
SQL 資料表名稱 |
於 DoFieldExchange 或 DoBulkFieldExchange 中的資料表清單的所有列。 |
"Customer" |
預先定義的查詢 (預存程序) 名稱 |
查詢定義為傳回的列。 |
"{call OverDueAccts}" |
SELECT 行清單 FROM 資料表清單 |
從指定的資料表的指定行。 |
"SELECT CustId, CustName FROM Customer" |
警告
請注意您在 SQL 字串不插入額外的空白字元。例如,如果您在大括號和 CALL 關鍵字之間插入空白字元, MFC 會誤解 SQL 字串為資料表名稱並將其加入至 SELECT 陳述式裡,會導致擲回例外狀況。同樣地,如果您的預先定義查詢使用輸出參數,不要於大括號和「?」符號之間插入空白字元。最後,您不能插入空白字元在 CALL 陳述式的大括號前面或在 SELECT 陳述式的 SELECT 關鍵字前面。
通常程序是傳遞 NULL 給 Open;在這種情況下, Open 呼叫 GetDefaultSQL。 如果您正在使用衍生的 CRecordset 類別,GetDefaultSQL 提供您在 ClassWizard 指定的資料表名稱。 您可以改而在 lpszSQL 參數中指定其他資訊。
不管您所傳遞的為何, Open 建構查詢的最終 SQL 字串 (字串可能有 SQL WHERE 和 ORDER BY 子句附加至您傳遞的 lpszSQL 字串) 來執行查詢。 您可以藉由呼叫 GetSQL 來檢查建構的字串於呼叫 Open之後。 如需資料錄集如何建構 SQL 陳述式並選取資料錄的詳細資料,請參閱本文件的 資料錄集:資料錄集如何選取資料錄 (ODBC)。
您的資料錄集的欄位資料成員繫結至選取的資料行。 如果任何資料錄傳回時,第一個資料錄就會成為目前資料錄。
如果您要設定資料錄集的選項,例如篩選或排序,請在建構資料錄集物件之後指定,但是,在您呼叫 Open之前。 如果您要在資料錄集已經開啟後重新整理資料錄集的資料錄,請呼叫 Requery。
如需詳細資訊,包括其他範例,請參閱文件 資料錄集 (ODBC)、 資料錄集:資料錄集如何選取資料錄 (ODBC)和 資料錄集:建立和關閉資料錄集 (ODBC)。
例外狀況
這個方法可能會擲回型別 CDBException* 和 **CMemoryException***的例外狀況。
範例
下列程式碼範例會示範不同型式的 Open 呼叫。
// rsSnap, rsLName, and rsDefault are CRecordset or CRecordset-derived
// objects
// Open rs using the default SQL statement, implement bookmarks, and turn
// off automatic dirty field checking
rsSnap.Open(CRecordset::snapshot, NULL, CRecordset::useBookmarks |
CRecordset::noDirtyFieldCheck);
// Pass a complete SELECT statement and open as a dynaset
rsLName.Open(CRecordset::dynaset, _T("Select L_Name from Customer"));
// Accept all defaults
rsDefault.Open();
需求
Header: afxdb.h