共用方式為


資料錄集:擷取大量資料錄 (ODBC)

本主題適用於 MFC ODBC 類別。

類別 CRecordset 支援大量數據列擷取,這表示單一擷取期間可以一次擷取多個記錄,而不是一次從數據源擷取一筆記錄。 您只能在衍生 CRecordset 類別中實作大量數據列擷取。 將數據從數據源傳輸到記錄集物件的程式稱為大量記錄字段交換(大量 RFX)。 請注意,如果您未在衍生類別中使用 CRecordset大量數據列擷取,則會透過記錄字段交換 (RFX) 傳輸數據。 如需詳細資訊,請參閱記錄字段交換(RFX)。

本主題將說明:

CRecordset 如何支援大量數據列擷取

開啟記錄集物件之前,您可以使用成員函式定義數據列集大小 SetRowsetSize 。 數據列集大小會指定在單一擷取期間應該擷取多少筆記錄。 實作大量數據列擷取時,預設數據列集大小為 25。 如果未實作大量數據列擷取,數據列集大小會維持固定在1。

初始化數據列集大小之後,請呼叫 Open 成員函式。 您必須在這裡指定 CRecordset::useMultiRowFetch dwOptions 參數的選項,以實作大量數據列擷取。 您也可以另外設定 CRecordset::userAllocMultiRowBuffers 選項。 大量記錄欄位交換機制會使用數位來儲存擷取期間擷取的多個數據列。 這些記憶體緩衝區可由架構自動配置,或者您可以手動配置它們。 CRecordset::userAllocMultiRowBuffers指定 選項表示您將執行設定。

下表列出 所提供的 CRecordset 成員函式,以支援大量數據列擷取。

成員函數 描述
CheckRowsetError 處理擷取期間發生之任何錯誤的虛擬函式。
DoBulkFieldExchange 實作大量記錄欄位交換。 自動呼叫 ,以將多個數據列從數據源傳輸到 recordset 物件。
GetRowsetSize 擷取數據列集大小的目前設定。
GetRowsFetched 指出指定擷取之後實際擷取的數據列數目。 在大部分情況下,除非擷取不完整的數據列集,否則這是數據列集大小。
GetRowStatus 傳回數據列集內特定數據列的擷取狀態。
RefreshRowset 重新整理數據列集內特定數據列的數據和狀態。
SetRowsetCursorPosition 將游標移至數據列集中的特定數據列。
SetRowsetSize 虛擬函式,會將數據列集大小的設定變更為指定的值。

特殊考量

雖然大量數據列擷取是效能提升,但某些功能的運作方式不同。 在您決定實作大量數據列擷取之前,請考慮下列事項:

  • 架構會自動呼叫 DoBulkFieldExchange 成員函式,以將數據從數據源傳輸到 recordset 物件。 不過,數據不會從記錄集傳輸回數據源。 AddNew呼叫、 EditDeleteUpdate 成員函式會導致判斷提示失敗。 雖然 CRecordset 目前不提供更新大量數據列的機制,但您可以使用 ODBC API 函 SQLSetPos式來撰寫自己的函式。 如需 的詳細資訊 SQLSetPos,請參閱 ODBC 程式設計人員參考

  • 成員函式IsDeletedIsFieldDirty、、IsFieldNullableIsFieldNullSetFieldDirtySetFieldNull 不能用於實作大量數據列擷取的記錄集。 不過,您可以呼叫 GetRowStatus 來取代 IsDeleted,並 GetODBCFieldInfo 取代 IsFieldNullable

  • 作業會 Move 依數據列集重新定位您的記錄集。 例如,假設您開啟具有 100 筆記錄且初始數據列集大小為 10 的記錄集。 Open 擷取數據列 1 到 10,目前記錄位於第 1 列。 呼叫 以 MoveNext 擷取下一個數據列集,而不是下一個數據列。 此數據列集包含數據列 11 到 20,目前記錄位於第 11 列。 請注意,實 MoveNext 作大量數據列擷取時,和 Move( 1 ) 不相等。 Move( 1 ) 從當前記錄擷取從 1 個數據列開始的數據列集。 在此範例中,呼叫 之後呼叫 Move( 1 ) Open 會擷取包含數據列 2 到 11 的數據列集,且目前記錄位於數據列 2 上。 如需詳細資訊,請參閱 Move 成員函式。

  • 與記錄欄位交換不同,精靈不支援大量記錄欄位交換。 這表示您必須手動宣告字段數據成員,並藉由寫入大量 RFX 函式的呼叫來手動覆寫 DoBulkFieldExchange 。 如需詳細資訊,請參閱類別庫中的記錄欄位 Exchange 函式參考

如何實作大量記錄欄位交換

大量記錄欄位交換會將數據列集從數據源傳送至 recordset 物件。 大量 RFX 函式會使用數位來儲存此資料,以及用來儲存資料列集中每個數據項長度的數位。 在類別定義中,您必須將欄位資料成員定義為存取資料陣列的指標。 此外,您必須定義一組指標來存取長度陣列。 任何參數數據成員都不應宣告為指標;使用大量記錄欄位交換時宣告參數數據成員,與使用記錄欄位交換時宣告參數數據成員相同。 下列程式代碼顯示簡單的範例:

class MultiRowSet : public CRecordset
{
public:
   // Field/Param Data
      // field data members
      long* m_rgID;
      LPSTR m_rgName;

      // pointers for the lengths
      // of the field data
      long* m_rgIDLengths;
      long* m_rgNameLengths;

      // input parameter data member
      CString m_strNameParam;

   .
   .
   .
}

您可以手動配置這些記憶體緩衝區,或讓架構執行配置。 若要自行配置緩衝區,您必須在成員函式中指定 CRecordset::userAllocMultiRowBuffers dwOptions 參數的選項Open 請務必設定陣列的大小,至少等於數據列集大小。 如果您想要讓架構執行配置,您應該將指標初始化為 NULL。 這通常是在 recordset 物件的建構函式中完成:

MultiRowSet::MultiRowSet( CDatabase* pDB )
   : CRecordset( pDB )
{
   m_rgID = NULL;
   m_rgName = NULL;
   m_rgIDLengths = NULL;
   m_rgNameLengths = NULL;
   m_strNameParam = "";

   m_nFields = 2;
   m_nParams = 1;

   .
   .
   .
}

最後,您必須覆寫 DoBulkFieldExchange 成員函式。 針對欄位數據成員,呼叫大量 RFX 函式;針對任何參數數據成員,呼叫 RFX 函式。 如果您藉由將 SQL 語句或預存程式傳遞至 Open來開啟記錄集,您進行大量 RFX 呼叫的順序必須對應至記錄集中數據行的順序;同樣地,參數的 RFX 呼叫順序必須對應至 SQL 語句或預存程式中的參數順序。

void MultiRowSet::DoBulkFieldExchange( CFieldExchange* pFX )
{
   // call the Bulk RFX functions
   // for field data members
   pFX->SetFieldType( CFieldExchange::outputColumn );
   RFX_Long_Bulk( pFX, _T( "[colRecID]" ),
                  &m_rgID, &m_rgIDLengths );
   RFX_Text_Bulk( pFX, _T( "[colName]" ),
                  &m_rgName, &m_rgNameLengths, 30 );

   // call the RFX functions for
   // for parameter data members
   pFX->SetFieldType( CFieldExchange::inputParam );
   RFX_Text( pFX, "NameParam", m_strNameParam );
}

注意

您必須在衍生CRecordset類別超出範圍之前呼叫Close成員函式。 這可確保架構配置的任何記憶體都已釋出。 不論您是否已實作大量數據列擷取,一律明確呼叫 Close是很好的程序設計做法。

如需記錄欄位交換的詳細資訊(RFX),請參閱 記錄欄位交換:RFX 的運作方式。 如需使用參數的詳細資訊,請參閱 CFieldExchange::SetFieldTypeRecordset:參數化 Recordset (ODBC)

另請參閱

資料錄集 (ODBC)
CRecordset::m_nFields
CRecordset::m_nParams