共用方式為


資料錄欄位交換:精靈程式碼的使用

注意

Visual Studio 2019 和更新版本中未提供 MFC ODBC 消費者精靈。 您仍然可以手動建立消費者。

本主題說明「MFC 應用程式精靈」和 [新增類別] (如新增 MFC ODBC 消費者中所述) 所撰寫來支援 RFX 的程式碼,以及如何更改該程式碼。

注意

本主題適用於衍生自尚未實作大量資料列擷取之 CRecordset 的類別。 如果您使用大量資料列擷取,就會實作大量記錄欄位交換 (大量 RFX)。 大量 RFX 與 RFX 類似。 若要瞭解差異,請參閱 記錄集:大量擷取記錄 (ODBC)

當您使用「MFC 應用程式精靈」或 [新增類別] 來建立資料錄集類別時,精靈會根據您在精靈中選擇的資料來源、資料表及資料行,為您撰寫下列 RFX 相關元素:

  • 資料錄集類別中資料錄集欄位資料成員的宣告

  • CRecordset::DoFieldExchange 的覆寫

  • 資料錄集類別建構函式中資料錄集欄位資料成員的初始化

欄位資料成員宣告

精靈會在 .h 檔案中撰寫資料錄集類別宣告,類似以下 CSections類別的宣告:

class CSections : public CRecordset
{
public:
   CSections(CDatabase* pDatabase = NULL);
   DECLARE_DYNAMIC(CSections)

// Field/Param Data
   CString   m_strCourseID;
   CString   m_strInstructorID;
   CString   m_strRoomNo;
   CString   m_strSchedule;
   CString   m_strSectionNo;

// Overrides
   // Wizard generated virtual function overrides
   protected:
   virtual CString GetDefaultConnect();  // Default connection string
   virtual CString GetDefaultSQL();      // Default SQL for Recordset
   virtual void DoFieldExchange(CFieldExchange* pFX);  // RFX support

// Implementation
#ifdef _DEBUG
   virtual void AssertValid() const;
   virtual void Dump(CDumpContext& dc) const;
#endif

};

如果您要新增自行繫結的參數資料成員或新欄位資料成員,請在精靈產生的資料成員後面新增它們。

此外,請注意精靈會覆寫 CRecordset 類別的 DoFieldExchange 成員函式。

DoFieldExchange 覆寫

DoFieldExchange 是 RFX 的核心。 架構在每當需要將資料從資料來源移至資料錄集,或從資料錄集移至資料來源時,都會呼叫 DoFieldExchangeDoFieldExchange 也支援透過 IsFieldDirtyIsFieldNull 成員函式取得欄位資料成員的相關資訊。

下列 DoFieldExchange 覆寫適用於 CSections 類別。 精靈會在 .cpp 檔案中撰寫您資料錄集類別的函式。

void CSections::DoFieldExchange(CFieldExchange* pFX)
{
   pFX->SetFieldType(CFieldExchange::outputColumn);
   RFX_Text(pFX, "CourseID", m_strCourseID);
   RFX_Text(pFX, "InstructorID", m_strInstructorID);
   RFX_Text(pFX, "RoomNo", m_strRoomNo);
   RFX_Text(pFX, "Schedule", m_strSchedule);
   RFX_Text(pFX, "SectionNo", m_strSectionNo);
}

請注意函式的下列重要功能:

  • 函式的這個區段稱為欄位對應。

  • 透過 pFX 指標對 CFieldExchange::SetFieldType 的呼叫。 這個呼叫會指定到 DoFieldExchange 結尾為止的所有 RFX 函式呼叫或下一個 SetFieldType 呼叫為輸出資料行。 如需詳細資訊,請參閱 CFieldExchange::SetFieldType

  • 數個 RFX_Text 全域函式呼叫 — 每一欄位資料成員一個呼叫 (在範例中全都是 CString 變數)。 這些呼叫會指定資料來源上的資料行名稱與欄位資料成員之間個關聯性。 RFX 函式會執行實際的資料傳輸。 類別程式庫支援所有常見資料類型的 RFX 函式。 如需 RFX 函式的詳細資訊,請參閱 記錄欄位交換:使用 RFX 函式

    注意

    資料集內資料行的順序必須符合 DoFieldExchange 中 RFS 函式呼叫的順序。

  • 架構在呼叫 DoFieldExchange 時所傳遞之 CFieldExchange 物件的 pFX 指標。 CFieldExchange 物件會指定設定 DoFieldExchange 來執行的作業、傳輸方向,以及其他內容資訊。

Recordset 建構函式

精靈所撰寫的資料錄集建構函式包含兩個與 RFX 相關的項目:

  • 每個欄位資料成員的初始化

  • 包含欄位資料成員數目之 m_nFields 資料成員的初始化

CSections 資料錄集範例的建構函式看起來像這樣:

CSections::CSections(CDatabase* pdb)
   : CRecordset(pdb)
{
   m_strCourseID = "";
   m_strInstructorID = "";
   m_strRoomNo = "";
   m_strSchedule = "";
   m_strSectionNo = "";
   m_nFields = 5;
}

注意

如果您手動新增任何欄位資料成員 (如果您以動態方式繫結新資料行,就可能這麼做),就必須讓 m_nFields 遞增。 若要這麼做,請附加另一行程式碼,例如:

m_nFields += 3;

這是可新增三個新欄位的程式碼。 如果您新增任何參數資料成員,就必須將 m_nParams 資料成員初始化,此資料成員包含參數資料成員的數目。 請將 m_nParams 初始化放在括弧外。

另請參閱

資料錄欄位交換 (RFX)