Bagikan melalui


Pertukaran Bidang Rekaman: Bekerja dengan Kode Wizard

Catatan

Wizard MFC ODBC Consumer tidak tersedia di Visual Studio 2019 dan yang lebih baru. Anda masih dapat membuat konsumen secara manual.

Topik ini menjelaskan kode yang ditulis MFC Application Wizard dan Add Class (seperti yang dijelaskan dalam Menambahkan Konsumen MFC ODBC) untuk mendukung RFX dan bagaimana Anda mungkin ingin mengubah kode tersebut.

Catatan

Topik ini berlaku untuk kelas yang berasal dari CRecordset tempat pengambilan baris massal belum diimplementasikan. Jika Anda menggunakan pengambilan baris massal, pertukaran bidang rekaman massal (RFX Massal) diimplementasikan. RFX massal mirip dengan RFX. Untuk memahami perbedaannya, lihat Recordset: Mengambil Rekaman secara Massal (ODBC).

Saat Anda membuat kelas recordset dengan MFC Application Wizard atau Add Class, wizard menulis elemen terkait RFX berikut untuk Anda, berdasarkan sumber data, tabel, dan pilihan kolom yang Anda buat dalam wizard:

  • Deklarasi anggota data bidang recordset di kelas recordset

  • Penimpaan dari CRecordset::DoFieldExchange

  • Inisialisasi anggota data bidang recordset di konstruktor kelas recordset

Deklarasi Anggota Data Bidang

Wizard menulis deklarasi kelas recordset dalam file .h yang menyerupan berikut ini untuk kelas 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

};

Jika Anda menambahkan anggota data parameter atau anggota data bidang baru yang Anda ikat sendiri, tambahkan setelah yang dihasilkan wizard.

Selain itu, perhatikan bahwa wizard mengambil alih DoFieldExchange fungsi anggota kelas CRecordset.

Penimpaan DoFieldExchange

DoFieldExchange adalah jantung RFX. Kerangka kerja memanggil DoFieldExchange kapan saja perlu memindahkan data baik dari sumber data ke kumpulan rekaman atau dari kumpulan rekaman ke sumber data. DoFieldExchange juga mendukung mendapatkan informasi tentang anggota data lapangan melalui fungsi anggota IsFieldDirty dan IsFieldNull .

Penimpaan berikut DoFieldExchange adalah untuk CSections kelas . Wizard menulis fungsi dalam file .cpp untuk kelas recordset Anda.

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);
}

Perhatikan fitur utama fungsi berikut:

  • Bagian fungsi ini disebut peta bidang.

  • Panggilan ke CFieldExchange::SetFieldType, melalui pointer pFX . Panggilan ini menentukan bahwa semua fungsi RFX memanggil hingga akhir DoFieldExchange atau panggilan berikutnya adalah SetFieldType kolom output. Untuk informasi selengkapnya, lihat CFieldExchange::SetFieldType.

  • Beberapa panggilan ke RFX_Text fungsi global — satu per anggota data bidang (semuanya adalah CString variabel dalam contoh). Panggilan ini menentukan hubungan antara nama kolom pada sumber data dan anggota data bidang. Fungsi RFX melakukan transfer data aktual. Pustaka kelas menyediakan fungsi RFX untuk semua jenis data umum. Untuk informasi selengkapnya tentang fungsi RFX, lihat Pertukaran Bidang Rekaman: Menggunakan Fungsi RFX.

    Catatan

    Urutan kolom dalam tataan hasil Anda harus sesuai dengan urutan panggilan fungsi RFX di DoFieldExchange.

  • Penunjuk pFX ke objek CFieldExchange yang diteruskan kerangka kerja saat memanggil DoFieldExchange. Objek CFieldExchange menentukan operasi yang DoFieldExchange akan dilakukan, arah transfer, dan informasi konteks lainnya.

Konstruktor Recordset

Konstruktor recordset yang ditulis wizard berisi dua hal yang terkait dengan RFX:

  • Inisialisasi untuk setiap anggota data bidang

  • Inisialisasi untuk anggota data m_nFields , yang berisi jumlah anggota data bidang

Konstruktor untuk CSections contoh kumpulan rekaman terlihat seperti ini:

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

Catatan

Jika Anda menambahkan anggota data bidang secara manual, seperti yang Mungkin jika Anda mengikat kolom baru secara dinamis, Anda harus menambah m_nFields. Lakukan dengan menambahkan baris kode lain, seperti:

m_nFields += 3;

Ini adalah kode untuk menambahkan tiga bidang baru. Jika Anda menambahkan anggota data parameter, Anda harus menginisialisasi anggota data m_nParams , yang berisi jumlah anggota data parameter. Letakkan m_nParams inisialisasi di luar tanda kurung.

Baca juga

Pertukaran Bidang Rekaman (RFX)