共用方式為


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 WHEREORDER BY 子句的 SQL SELECT 陳述式

    • CALL 陳述式指定預先定義的查詢名稱 (預存程序) 。 請特別小心不要在大括號和 CALL 關鍵字之間插入空白字元。

    如需這個字串的詳細資訊,請參閱資料表以及在備註中有關 ClassWizard 作用的討論。

    注意事項注意事項

    在結果集的資料行的順序必須符合在 DoFieldExchangeDoBulkFieldExchange 函式覆寫中 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 關閉自動變更欄檢查 (雙重緩衝)。 這會改善效能;不過,您必須透過呼叫 SetFieldDirtySetFieldNull 成員函式手動標記欄位為變更。請注意在類別 CRecordset 的雙重緩衝類似於類別 CDaoRecordset的雙重緩衝。 不過,在 CRecordset,就不能在個別欄位啟用雙重緩衝;您不是於所有欄位啟用就是於所有欄位停用。 請注意,如果您指定 CRecordset::useMultiRowFetch選項,那 CRecordset::noDirtyFieldCheck 會自動開啟;不過, SetFieldDirtySetFieldNull 在實作大量資料列擷取的資料錄集無法使用。

    • 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 資料表名稱

DoFieldExchangeDoBulkFieldExchange 中的資料表清單的所有列。

"Customer"

預先定義的查詢 (預存程序) 名稱

查詢定義為傳回的列。

"{call OverDueAccts}"

SELECT 行清單 FROM 資料表清單

從指定的資料表的指定行。

"SELECT CustId, CustName FROM

Customer"

警告

請注意您在 SQL 字串不插入額外的空白字元。例如,如果您在大括號和 CALL 關鍵字之間插入空白字元, MFC 會誤解 SQL 字串為資料表名稱並將其加入至 SELECT 陳述式裡,會導致擲回例外狀況。同樣地,如果您的預先定義查詢使用輸出參數,不要於大括號和「?」符號之間插入空白字元。最後,您不能插入空白字元在 CALL 陳述式的大括號前面或在 SELECT 陳述式的 SELECT 關鍵字前面。

通常程序是傳遞 NULLOpen;在這種情況下, Open 呼叫 GetDefaultSQL。 如果您正在使用衍生的 CRecordset 類別,GetDefaultSQL 提供您在 ClassWizard 指定的資料表名稱。 您可以改而在 lpszSQL 參數中指定其他資訊。

不管您所傳遞的為何, Open 建構查詢的最終 SQL 字串 (字串可能有 SQL WHEREORDER 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

請參閱

參考

CRecordset 類別

階層架構圖表

CRecordset::CRecordset

CRecordset::Close

CRecordset::GetDefaultSQL

CRecordset::GetSQL

CRecordset::m_strFilter

CRecordset::m_strSort

CRecordset::Requery