共用方式為


資料錄集:擷取大量資料錄 (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 、、 IsFieldNullable IsFieldNullSetFieldDirtySetFieldNull 不能用於實作大量資料列擷取的記錄集。 不過,您可以呼叫 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::SetFieldType Recordset:參數化 Recordset (ODBC)

另請參閱

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