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 pointerpFX
. Panggilan ini menentukan bahwa semua fungsi RFX memanggil hingga akhirDoFieldExchange
atau panggilan berikutnya adalahSetFieldType
kolom output. Untuk informasi selengkapnya, lihat CFieldExchange::SetFieldType.Beberapa panggilan ke
RFX_Text
fungsi global — satu per anggota data bidang (semuanya adalahCString
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 memanggilDoFieldExchange
. ObjekCFieldExchange
menentukan operasi yangDoFieldExchange
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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk