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 A 資料錄集。成員資格和排序資料錄所決定,當開啟資料錄集時,不過,其他使用者所做的變更至資料值可以看見下列擷取作業。也稱為動態集是索引鍵集驅動資料錄集。
使用雙向捲動的CRecordset::snapshot A 靜態資料錄集。在開啟時,成員資格和排序資料錄已決定的資料錄集;,當資料錄被擷取時,資料值決定。其他使用者所做的變更不可見,直到資料錄集關閉再重新開啟。
使用雙向捲動的CRecordset::dynamic A 資料錄集。其他使用者所做的變更會使用成員資格,順序和資料值可以看見下列擷取作業。請注意許多 ODBC 驅動程式不支援這種資料錄集。
只有向前捲動的CRecordset::forwardOnly 是唯讀的資料錄集。
如需 CRecordset,預設值為 CRecordset::snapshot。預設值機制可讓 Visual C++ 精靈與 CRecordset ODBC 和 DAO CDaoRecordset互動,有不同的預設值。
如需這些資料錄集類型的詳細資訊,請參閱本文 資料錄集 (ODBC)。如需相關資訊,請參閱 Microsoft 知識庫文件<使用區塊和可捲動游標 Windows SDK>。
警告 如果所要求的型別不支援,架構會擲回例外狀況。
lpszSQL
包含下列其中一個字串的指標:NULL 指標。
資料表的名稱。
SELECT SQL 陳述式 (選擇性地使用 SQL WHERE 或 ORDER BY 子句)。
指定預先定義查詢 (預存程序) 的名稱 呼叫 陳述式。請特別小心不要插入在大括號和 呼叫 關鍵字之間的空白字元。
如需這個字串的詳細資訊,請參閱表以及有關 ClassWizard 角色的討論在註解中。
注意事項 資料行的順序在結果集的必須符合 RFX 的命令或在您的 DoFieldExchange 或函式的 DoBulkFieldExchange Bulk RFX 函式的覆寫。
dwOptions
可以指定值的組合的位元遮罩如下所列。其中某些互斥 (Mutually Exclusive)。預設值是 none。CRecordset::none 未設定的選項。這個參數值是互斥 (Mutually Exclusive) 與其他值。根據預設,資料錄集的可更新 編輯 或 刪除 並允許附加 AddNew的新資料錄。Updatability 取決於資料來源中以及在 nOpenType 選取您指定。大量加入的無法進行最佳化。大量資料列擷取不會實作。刪除的資料錄將在資料錄巡覽時略過。書籤無法使用。自動變更欄位檢查中實作。
CRecordset::appendOnly 不允許 編輯 或 刪除 在資料錄集。只允許 AddNew 。這個選項與互斥 CRecordset::readOnly。
CRecordset::readOnly 開啟資料錄集為唯讀。這個選項與互斥 CRecordset::appendOnly。
使用CRecordset::optimizeBulkAdd 備製 SQL 陳述式的最佳化一次加入大量資料錄。只有在您不是使用 ODBC API 函式 SQLSetPos 更新資料錄集,會套用。第一次更新判斷哪些欄位標記為已變更。這個選項與互斥 CRecordset::useMultiRowFetch。
CRecordset::useMultiRowFetch 實作大量資料列擷取允許多行擷取單一擷取作業。這是一種進階功能來改善效能,不過,大量資料錄欄位交換 ClassWizard 不受支援。這個選項與互斥 CRecordset::optimizeBulkAdd。請注意,如果您指定 CRecordset::useMultiRowFetch,然後這個選項 CRecordset::noDirtyFieldCheck 會自動開啟 (雙重緩衝則不可用);在順向資料錄集,這個選項 CRecordset::useExtendedFetch 會自動開啟。如需大量資料列擷取的詳細資訊,請參閱本文 資料錄集:擷取大量資料錄 (ODBC)。
CRecordset::skipDeletedRecords 略過所有已刪除的資料錄,當巡覽資料錄集時。這會降低在某些相對擷取的效能。這個選項不適用於順向資料錄集。如果您只使用 nRows 參數的 移動 設為 0 和 CRecordset::skipDeletedRecords 選取集合, 移動 會判斷提示。請注意 CRecordset::skipDeletedRecords 類似 驅動程式包裝,也就是說,刪除的資料列從資料錄集移除。不過,因此,如果您的驅動程式包裝資料錄,則它會略過您只要刪除的記錄而言,,當開啟資料錄集時,不會略過其他使用者刪除資料錄。CRecordset::skipDeletedRecords 會略過其他使用者刪除資料列。
CRecordset::useBookmarks May "在資料錄集為書籤,則為,如果支援。書籤慢的資料,但是會改善資料巡覽的效能。在順向資料錄集的無效。如需詳細資訊,請參閱本文 資料錄集:書籤和絕對位置 (ODBC)。
CRecordset::noDirtyFieldCheck 關閉自動變更欄位檢查 (雙重緩衝)。這會改善效能,不過,您必須手動標示欄位標記為已變更呼叫 SetFieldDirty 和 SetFieldNull 成員函式。請注意在類別 CRecordset 的雙重緩衝類似於類別中 CDaoRecordset的雙重緩衝。不過,在 CRecordset,就無法啟用個別欄位的雙重緩衝,您可讓它所有欄位的或停用之所有欄位的。請注意,如果您指定選項 CRecordset::useMultiRowFetch,然後 CRecordset::noDirtyFieldCheck 會自動開啟,不過, SetFieldDirty 和 SetFieldNull 在實作大量資料列擷取的資料錄集不能使用。
CRecordset::executeDirect 未使用準備的 SQL 陳述式。為了提高效能,因此,如果 Requery 成員函式永遠不會呼叫,指定選項。
而不是 SQLFetch的CRecordset::useExtendedFetch 實作 SQLExtendedFetch 。這在實作擷取在順向資料錄集的大量資料而設計。如果您在順向資料錄集指定選項,則 CRecordset::useMultiRowFetchCRecordset::useExtendedFetch 會自動開啟。
CRecordset::userAllocMultiRowBuffers 使用者會配置資料的儲存緩衝區。如果您想要將儲存,請使用 CRecordset::useMultiRowFetch 一起使用這個選項;否則,架構會自動將必要的儲存體。如需詳細資訊,請參閱本文 資料錄集:擷取大量資料錄 (ODBC)。請注意, CRecordset::userAllocMultiRowBuffers 指定的,而不指定 CRecordset::useMultiRowFetch 造成失敗的判斷提示。
傳回值
如果不是零,則成功開啟 CRecordset 物件;則為 0,如果 CDatabase::Open (如果呼叫) 會傳回 0。
備註
您必須呼叫此成員函式來執行資料錄集定義的查詢。在呼叫 開啟之前,您必須在建構資料錄集物件。
資料來源的資料錄集的連接取決於您在呼叫之前 開啟建構資料錄集。如果您傳遞至未連接至資料來源的資料錄集建構函式的 CDatabase 物件,這個成員函式使用 GetDefaultConnect 嘗試開啟資料庫物件。如果您傳遞 NULL 至資料錄集建構函式,建構您的 CDatabase 物件和 開啟 嘗試連接的資料庫物件。如需在關閉資料錄集和連接的詳細資料。這些變更的情況下,請參閱 關閉。
注意事項 |
---|
至資料來源的存取是透過 CRecordset 物件一定會是共用的。不同於 CDaoRecordset 類別,您不能使用 CRecordset 物件開啟以獨佔存取的資料來源。 |
當您呼叫時, 開啟查詢,通常 SELECT SQL 陳述式,選項會根據標準的記錄顯示在下表中。
lpszSQL 參數的值 |
判斷選取的資料錄 |
範例 |
---|---|---|
NULL |
GetDefaultSQL傳回的字串。 |
|
SQL 資料表名稱 |
資料表清單中的所有資料行。 DoFieldExchange 或 DoBulkFieldExchange的。 |
"Customer" |
預先定義查詢 (預存程序名稱) |
資料行定義查詢時傳回。 |
"{call OverDueAccts}" |
SELECT 資料行清單 FROM 資料表清單。 |
從指定的資料表特定資料行。 |
"SELECT CustId, CustName FROM Customer" |
警告 |
---|
請特別小心在 SQL 字串不會插入額外的空白字元。例如,在中,如果您將在大括號和 呼叫 關鍵字之間的空白字元, MFC 會誤解的 SQL 字串,因為資料表名稱並將其加入 SELECT 陳述式內,會導致擲回例外狀況。同樣地,因此,如果您的預先定義查詢使用輸出參數,請不要插入在大括號之間的空白字元和「?」符號。最後,您無法插入空白字元在大括弧之前在 呼叫 陳述式或在 SELECT 關鍵字之前。 SELECT 陳述式。 |
通常是 NULL 程序傳遞至 開啟;在這種情況下, 開啟 呼叫 GetDefaultSQL。如果您正在使用衍生的 CRecordset 類別,讓您在 GetDefualtSQL ClassWizard 指定資料表名稱。您可以在 lpszSQL 參數中指定其他資訊。
您所傳遞, 開啟 建構查詢的最後的 SQL 字串 (可能是 SQL 字串 WHERE ,並 ORDER BY 子句附加至 lpszSQL 字串您傳遞) 來執行查詢。您可以藉由呼叫 GetSQL 檢查建構的字串在呼叫 開啟之後。如需資料錄集運作的其他詳細資料建構 SQL 陳述式並選取資料錄,請參閱本文 資料錄集:資料錄集選取資料錄的方式 (ODBC)。
您的資料錄集類別的欄位資料成員繫結至選取的資料行。如果有任何傳回的資料錄,第一筆資料錄會變成目前的資料錄。
如果您想要將資料錄集選項,例如篩選或排序,請指定這些,在建構資料錄集物件之後,但是,在您呼叫之前 開啟。如果您想要重新整理資料錄集的資料錄,資料錄集已經開啟後,請呼叫 重新查詢。
如需詳細資訊,包括其他範例,請參閱 Microsoft 知識庫文件 資料錄集 (ODBC)、 資料錄集:資料錄集選取資料錄的方式 (ODBC)和 資料錄集:建立和關閉資料錄集 (ODBC)。
例外狀況
這個方法會擲回型別 CDBException* 和 **CMemoryException***的例外狀況。
範例
開啟 呼叫的程式碼範例會示範不同的表單。
// 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