CRecordset::Open

virtual BOOL Open( UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE,
                   LPCTSTR lpszSQL = NULL,
                   DWORD dwOptions = none
                 );
  throw( CDBException, CMemoryException );
返回值:
如果CRecordset對象被成功打開,則返回非零值;否則,如果CDatabase::Open(如果被調用了)返回0,則返回0。
參數:
nOpenType 接收缺省值AFX_DB_USE_DEFAULT_TYPE,或使用下列enumOpenType枚舉值之一:
· CRecordset::dynaset 可以雙向滾動的記錄集。當記錄集被打開時,記錄集的全體成員和記錄的順序都被確定,但是伴隨一次獲取操作,其它用戶對數據值所做的改變是可見的。
· CRecordset::snapshot 可以雙向滾動的靜態記錄集。當記錄集被打開時,記錄集的全體成員和記錄的順序都被確定了;當記錄被獲取時,其數據值是確定的。其它用戶在記錄集被關閉,然後在打開之前是不可見的。
· CRecordset::dynamic 可以雙向滾動的記錄集。伴隨一次獲取操作,其它用戶對成員,順序和數據值所做的改變是可見的。注意,許多ODBC驅動器是不支持這種類型的記錄集的。
· CRecordset::forwardOnly 只能向前滾動的只讀的記錄集。
對於CRecordset來說,缺省的值是CRecordset::snapshot。這種缺省值機制,允許Visual C++嚮導與具有不同缺省值的ODBC CRecordset和DAO CDaoRecordset進行交互。
與此有關的信息,參見“ODBC SDK程序員參考”中文章的“使用塊和可滾動遊標”。
警告:如果不支持要求的類型,框架將拋出一個異常。
lpszSQL 一個包含下列值之一的字符串指針:
· 一個NULL指針。
· 一個表名。
· 一條SQL SELECT語句(可選擇帶一條SQL WHERE 或ORDER BY子句)。
· 一條CALL語句,指定一個預定義查詢(存儲過程)名。注意,你不能在卷括號和CALL關鍵字之間插入空格。
有關這個字符串的更多信息,請參見說明下的表,以及對ClassWizard的作用的討論。
注意:
在你的結果集中,列的順序必須與在你的重載的DoFieldExchange或DoBulkFieldExchange函數中的RFX和Bulk RFX函數調用的順序相匹配。
dwOptions 一個bitmask,它可以指定下列值的組合。這些值中的某些是相互獨立的。缺省的值是none。
· CRecordset::none 未設置選項。此參數值與所有其它的值是相互獨立的。缺省的,記錄集可以用Edit或Delete來更新,並允許用AddNew來添加新記錄。這種可更新性依賴於數據源,就像你所指定的nOpenType選項。成組添加的優化是沒有用的。成組行檢取不會被實現。在記錄集中導航時,不能略過被刪除的記錄。書籤是沒有用的。實現了自動髒字段檢查。
· CRecordset::appendOnly 不允許在記錄集中進行Edit或Delete。值允許AddNew。此選項與CRecordset::readOnly相互獨立。
· CRecordset::readOnly 用只讀方式打開記錄集。此選項與CRecordset::appendOnly相互獨立。
· CRecordset::optimizeBulkAdd 使用預備的SQL語句來優化一次添加多個記錄。只有在你不使用ODBC API函數SQLSetPos來更新記錄集時才使用。第一次更新確定將哪一個字段標記爲髒的。此選項與CRecordset::useMultiRowFetch相互獨立。
· CRecordset::useMultiRowFetch 實現成組行檢取,允許在一次檢取操作中獲取多行。這是一個高級特徵,是設計來提高性能的;但是,ClassWizard不支持成組記錄字段交互。此選項與CRecordset::optimiazBulkAdd相互獨立。注意,如果你指定了CRecordset::useMultiRowFetch,則選項CRecordset::noDirtyFieldCheck將自動被返回(雙緩衝將無效);對於只向前記錄集,選項CRecordset::useExtendedFetch將被自動返回。
· CRecordset::skipDeletedRecords 當在記錄集中導航時,略過所有已被刪除的記錄。這將使某個相關獲取的性能下降。在一個只向前的記錄集中,此選項是無效的。注意,CRecordset::skipDeletedRecords與“驅動器包裝”相似,驅動器包裝意味着被刪除的行被從記錄集中移走。但是,如果你的驅動器包裝記錄,則它將只略過那些被你刪除的記錄;而不會略過在記錄集打開時被其它用戶刪除的記錄。CRecordset::skipDeletedRecords將會略過被其它用戶刪除的記錄。
· CRecordset::useBookarks 允許在記錄集中使用書籤,如果支持書籤的話。書籤會使數據檢取變慢,但是會提高數據導航的性能。在只向前的記錄集中此選項是無效的。
· CRecordset::noDirtyFieldCheck 關閉自動髒數據檢查(雙緩衝)。這將提高性能;但是,你必須通過調用SetFieldDirty和SetFieldNull成員函數來手動標記變髒的字段。注意,CRecordset類中的雙緩衝類似於CDaoRecordset中的雙緩衝。但是,在CRecordset中,你不能在獨立字段中使雙緩衝有效;你只能對所有字段使它有效或無效。注意,如果你指定了選項CRecordset::useMultiRowFetch,則CRecordset::noDirtyFieldCheck將被自動返回;但是,SetFieldDirty和SetFieldNull不能在實現成組行檢取的記錄集中使用。
· CRecordset::executeDirect 不要使用預備的SQL語句。如果永遠不會調用Requery成員函數,則指定此選項來提高性能。
· CRecordset::useExtendedFetch 實現SQLException來代替SQLFetch。這是設計來在只向前的記錄集中實現成組行檢取的。如果你在一個只向前的記錄集中指定了選項CRecordset::userMultiRowFetch,則CRecordset::useExtendedFetch將被自動返回。
· CRecordset::userAllocMultiRowBuffers 用戶將爲數據分配存儲緩存。如果你想分配自己的存儲區,將此選項用與CRecordset::useMultiRowFetch連接;否則,框架將自動分配必要的存儲區。注意,指定了CRecordset::userAllocMutiRowBuffers,而沒有指定CRecordset::useMultiRowFetch,將導致一個失敗斷言。

說明:
你必須調用此成員函數來運行記錄集定義的查詢。在調用Open之前,你必須構造記錄集對象。
此記錄集與數據源的連接依賴於在調用Open之前你是如何構造這個記錄集的。如果你將一個沒有連接到一個數據源的CDatabase對象傳遞給記錄集構造函數,此成員函數使用GetDefaultConnect來嘗試打開該數據庫對象。如果你將NULL傳遞給記錄集構造函數,則此成員函數爲你構造一個CDatabase對象,並且Open試圖連接給數據庫對象。有關關閉記錄集和在這些不同的環境下的連接的細節,請參見Close。
注意:
通過一個CRecordset對象對數據源的訪問總是被共享的。不像CDaoRecordset類,不能使用一個CRecordset對象來打開一個具有獨佔訪問的數據源。
當你調用Open時,一條查詢語句,通常是一條SQL SELECT語句,基於下表給出的標準來選擇記錄:
lpszSQL參數的值 選擇的記錄所決定於 示例
NULL 由GetDefaultSQL返回的字符串  
SQL表名 在DoFieldExchange或DoBulkFieldExchange中的列表的所有列 "Customer"
預定義的查詢(存儲過程)名稱 該查詢被定義的要返回的列 "{callOverDueAccts}"
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串中),然後執行這個查詢。你可以在調用Open之後通過調用GetSQL來檢查這個構造出來的字符串。
記錄集類的字段數據成員與所選擇數據的列相關聯。如果有記錄被返回,則第一個記錄成爲當前記錄。
如果你想爲記錄集設置選項,比如一個過濾器或排序,則應在構造了此記錄集對象之後,但在調用Open之前指定這些選項。如果你要在記錄集被打開之後刷新記錄集中的記錄,可以調用Requery。
示例:
下面的代碼例子說明了Open調用的不同形式。
// rs 是一個CRecordset或CRecordset派生對象
// 用缺省的SQL語句打開rs
// 實現書籤,並關閉自動髒數據檢查
rs.Open( CRecordset::snapshot, NULL, CRecordset::useBookmarks | CRecordset::noDirtyFieldCheck );
// 傳遞一個完整的SELECT語句並打開作爲一個動態集
rs.Open( CRecordset::dynaset, _T( "Select L_Name from Customer" ) );
// 接收所有的缺省值
rs.Open( );

請參閱

轉自:http://wangsf150.blog.163.com/blog/static/50149575201236104410890/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章