Bagikan melalui


TN053: Rutinitas DFX Kustom untuk Kelas Database DAO

Catatan

DAO digunakan dengan database Access dan didukung melalui Office 2013. DAO 3.6 adalah versi akhir, dan dianggap usang. Lingkungan dan wizard Visual C++ tidak mendukung DAO (meskipun kelas DAO disertakan dan Anda masih dapat menggunakannya). Microsoft menyarankan agar Anda menggunakan Templat OLE DB atau ODBC dan MFC untuk proyek baru. Anda hanya boleh menggunakan DAO dalam mempertahankan aplikasi yang ada.

Catatan teknis ini menjelaskan mekanisme pertukaran bidang rekaman DAO (DFX). Untuk membantu memahami apa yang terjadi dalam rutinitas DFX, DFX_Text fungsi akan dijelaskan secara rinci sebagai contoh. Sebagai sumber informasi tambahan untuk catatan teknis ini, Anda dapat memeriksa kode untuk fungsi DFX individual lainnya. Anda mungkin tidak akan membutuhkan rutinitas DFX kustom sesering mungkin Anda memerlukan rutinitas RFX kustom (digunakan dengan kelas database ODBC).

Catatan teknis ini berisi:

Gambaran Umum DFX

Mekanisme pertukaran bidang rekaman DAO (DFX) digunakan untuk menyederhanakan prosedur pengambilan dan pembaruan data saat menggunakan CDaoRecordset kelas . Proses ini disederhanakan menggunakan anggota CDaoRecordset data kelas. Dengan turunan dari CDaoRecordset, Anda dapat menambahkan anggota data ke kelas turunan yang mewakili setiap bidang dalam tabel atau kueri. Mekanisme "pengikatan statis" ini sederhana, tetapi mungkin bukan metode pengambilan/pembaruan data pilihan untuk semua aplikasi. DFX mengambil setiap bidang terikat setiap kali rekaman saat ini diubah. Jika Anda mengembangkan aplikasi sensitif performa yang tidak memerlukan pengambilan setiap bidang ketika mata uang diubah, "pengikatan dinamis" melalui CDaoRecordset::GetFieldValue dan CDaoRecordset::SetFieldValue mungkin merupakan metode akses data pilihan.

Catatan

DFX dan pengikatan dinamis tidak saling eksklusif, sehingga penggunaan hibrid pengikatan statis dan dinamis dapat digunakan.

Contoh 1 — Penggunaan Pertukaran Bidang Rekaman DAO saja

(asumsikan CDaoRecordset — kelas CMySet turunan sudah terbuka)

// Add a new record to the customers table
myset.AddNew();

myset.m_strCustID = _T("MSFT");

myset.m_strCustName = _T("Microsoft");

myset.Update();

Contoh 2 — Penggunaan pengikatan dinamis saja

(mengasumsikan menggunakan CDaoRecordset kelas, rs, dan sudah terbuka)

// Add a new record to the customers table
COleVariant  varFieldValue1 (_T("MSFT"),
    VT_BSTRT);

//Note: VT_BSTRT flags string type as ANSI,
    instead of UNICODE default
COleVariant  varFieldValue2  (_T("Microsoft"),
    VT_BSTRT);

rs.AddNew();

rs.SetFieldValue(_T("Customer_ID"),
    varFieldValue1);

rs.SetFieldValue(_T("Customer_Name"),
    varFieldValue2);

rs.Update();

Contoh 3 — Penggunaan Dao Record Field Exchange dan pengikatan dinamis

(mengasumsikan menjelajah data karyawan dengan CDaoRecordsetkelas emp-turunan )

// Get the employee's data so that it can be displayed
emp.MoveNext();

// If user wants to see employee's photograph,
// fetch it
COleVariant varPhoto;
if (bSeePicture)
    emp.GetFieldValue(_T("photo"),
    varPhoto);

// Display the data
PopUpEmployeeData(emp.m_strFirstName,
    emp.m_strLastName,
    varPhoto);

Cara Kerja DFX

Mekanisme DFX bekerja dengan cara yang sama dengan mekanisme pertukaran bidang rekaman (RFX) yang digunakan oleh kelas ODBC MFC. Prinsip DFX dan RFX sama tetapi ada banyak perbedaan internal. Desain fungsi DFX sedih sehingga hampir semua kode dibagikan oleh rutinitas DFX individu. Pada DFX tingkat tertinggi hanya melakukan beberapa hal.

  • DFX membuat klausa SQL SELECT dan klausul PARAMETER SQL jika perlu.

  • DFX membangun struktur pengikatan yang digunakan oleh fungsi DAO GetRows (selengkapnya tentang ini nanti).

  • DFX mengelola buffer data yang digunakan untuk mendeteksi bidang kotor (jika buffering ganda sedang digunakan)

  • DFX mengelola array status NULL dan DIRTY dan menetapkan nilai jika perlu pada pembaruan.

Inti dari mekanisme DFX adalah CDaoRecordset fungsi kelas turunan DoFieldExchange . Fungsi ini mengirimkan panggilan ke fungsi DFX individual dari jenis operasi yang sesuai. Sebelum memanggil DoFieldExchange fungsi MFC internal, atur jenis operasi. Daftar berikut ini memperlihatkan berbagai jenis operasi dan deskripsi singkat.

Operasi Deskripsi
AddToParameterList Membangun klausul PARAMETERS
AddToSelectList Membangun klausa SELECT
BindField Menyiapkan struktur pengikatan
BindParam Mengatur nilai parameter
Fixup Menetapkan status NULL
AllocCache Mengalokasikan cache untuk pemeriksaan kotor
StoreField Menyimpan rekaman saat ini ke cache
LoadField Memulihkan cache ke nilai anggota
FreeCache Mengosongkan cache
SetFieldNull Mengatur status bidang & nilai ke NULL
MarkForAddNew Menandai bidang kotor jika bukan PSEUDO NULL
MarkForEdit Menandai bidang kotor jika tidak cocok dengan cache
SetDirtyField Mengatur nilai bidang yang ditandai sebagai kotor

Di bagian berikutnya, setiap operasi akan dijelaskan secara lebih rinci untuk DFX_Text.

Fitur terpenting untuk dipahami tentang proses pertukaran bidang rekaman DAO adalah menggunakan GetRows fungsi CDaoRecordset objek. Fungsi DAO GetRows dapat bekerja dalam beberapa cara. Catatan teknis ini hanya akan dijelaskan GetRows secara singkat karena berada di luar cakupan catatan teknis ini. DAO GetRows dapat bekerja dengan beberapa cara.

  • Ini dapat mengambil beberapa rekaman dan beberapa bidang data sekaligus. Ini memungkinkan akses data yang lebih cepat dengan komplikasi berurusan dengan struktur data besar dan offset yang sesuai ke setiap bidang dan untuk setiap rekaman data dalam struktur. MFC tidak memanfaatkan mekanisme pengambilan beberapa rekaman ini.

  • Cara GetRows lain dapat bekerja adalah dengan mengizinkan programmer menentukan alamat pengikatan untuk data yang diambil dari setiap bidang untuk satu rekaman data.

  • DAO juga akan "memanggil kembali" ke pemanggil untuk kolom panjang variabel untuk memungkinkan pemanggil mengalokasikan memori. Fitur kedua ini memiliki manfaat meminimalkan jumlah salinan data serta memungkinkan penyimpanan data langsung ke anggota kelas ( CDaoRecordset kelas turunan). Mekanisme kedua ini adalah metode yang digunakan MFC untuk mengikat anggota data di CDaoRecordset kelas turunan.

Apa yang Dilakukan Rutinitas DFX Kustom Anda

Terlihat dari diskusi ini bahwa operasi terpenting yang diterapkan dalam fungsi DFX apa pun harus kemampuan untuk menyiapkan struktur data yang diperlukan agar berhasil memanggil GetRows. Ada sejumlah operasi lain yang harus didukung oleh fungsi DFX juga, tetapi tidak ada yang penting atau kompleks seperti mempersiapkan GetRows panggilan dengan benar.

Penggunaan DFX dijelaskan dalam dokumentasi online. Pada dasarnya, ada dua persyaratan. Pertama, anggota harus ditambahkan ke CDaoRecordset kelas turunan untuk setiap bidang dan parameter terikat. Mengikuti ini CDaoRecordset::DoFieldExchange harus ditimpa. Perhatikan bahwa jenis data anggota penting. Ini harus cocok dengan data dari bidang dalam database atau setidaknya dapat dikonversi ke jenis tersebut. Misalnya bidang numerik dalam database, seperti bilangan bulat panjang, selalu dapat dikonversi ke teks dan terikat ke CString anggota, tetapi bidang teks dalam database mungkin belum tentu dikonversi ke representasi numerik, seperti bilangan bulat panjang dan terikat ke anggota bilangan bulat panjang. DAO dan mesin database Microsoft Jet bertanggung jawab atas konversi (bukan MFC).

Detail DFX_Text

Seperti disebutkan sebelumnya, cara terbaik untuk menjelaskan cara kerja DFX adalah dengan bekerja melalui contoh. Untuk tujuan ini melalui internal DFX_Text harus bekerja dengan cukup baik untuk membantu memberikan setidaknya pemahaman dasar tentang DFX.

  • AddToParameterList

    Operasi ini membangun klausul PARAMETER SQL ("Parameters <param name>, <param type> ... ;") yang diperlukan oleh Jet. Setiap parameter diberi nama dan ditik (seperti yang ditentukan dalam panggilan RFX). Lihat fungsi fungsi CDaoFieldExchange::AppendParamType untuk melihat nama jenis individual. Dalam kasus DFX_Text, jenis yang digunakan adalah teks.

  • AddToSelectList

    Membangun klausa SQL SELECT . Ini cukup lurus ke depan karena nama kolom yang ditentukan oleh panggilan DFX hanya ditambahkan ("SELECT <column name>, ...").

  • BindField

    Operasi yang paling kompleks. Seperti disebutkan sebelumnya ini adalah tempat struktur pengikatan DAO yang digunakan oleh GetRows disiapkan. Seperti yang Anda lihat dari kode dalam DFX_Text jenis informasi dalam struktur termasuk jenis DAO yang digunakan (DAO_CHAR atau DAO_WCHAR dalam kasus DFX_Text). Selain itu, jenis pengikatan yang digunakan juga disiapkan. Di bagian GetRows sebelumnya hanya dijelaskan secara singkat, tetapi cukup untuk menjelaskan bahwa jenis pengikatan yang digunakan oleh MFC selalu pengikatan alamat langsung (DAOBINDING_DIRECT). Selain itu untuk pengikatan kolom panjang variabel (seperti DFX_Text) pengikatan panggilan balik digunakan sehingga MFC dapat mengontrol alokasi memori dan menentukan alamat dengan panjang yang benar. Apa artinya ini adalah bahwa MFC selalu dapat memberi tahu DAO "di mana" untuk menempatkan data, sehingga memungkinkan pengikatan langsung ke variabel anggota. Sisa struktur pengikatan diisi dengan hal-hal seperti alamat fungsi panggilan balik alokasi memori dan jenis pengikatan kolom (mengikat menurut nama kolom).

  • BindParam

    Ini adalah operasi sederhana yang memanggil SetParamValue dengan nilai parameter yang ditentukan dalam anggota parameter Anda.

  • Fixup

    Mengisi status NULL untuk setiap bidang.

  • SetFieldNull

    Operasi ini hanya menandai setiap status bidang sebagai NULL dan mengatur nilai variabel anggota ke PSEUDO_NULL.

  • SetDirtyField

    SetFieldValue Panggilan untuk setiap bidang ditandai kotor.

Semua operasi yang tersisa hanya berurusan dengan penggunaan cache data. Cache data adalah buffer tambahan data dalam rekaman saat ini yang digunakan untuk membuat hal-hal tertentu lebih sederhana. Misalnya, bidang "kotor" dapat terdeteksi secara otomatis. Seperti yang dijelaskan dalam dokumentasi online, dokumentasi tersebut dapat dinonaktifkan sepenuhnya atau di tingkat bidang. Implementasi buffer menggunakan peta. Peta ini digunakan untuk mencocokkan salinan data yang dialokasikan secara dinamis dengan alamat bidang "terikat" (atau CDaoRecordset anggota data turunan).

  • AllocCache

    Secara dinamis mengalokasikan nilai bidang yang di-cache dan menambahkannya ke peta.

  • FreeCache

    Menghapus nilai bidang yang di-cache dan menghapusnya dari peta.

  • StoreField

    Menyalin nilai bidang saat ini ke dalam cache data.

  • LoadField

    Menyalin nilai yang di-cache ke dalam anggota bidang.

  • MarkForAddNew

    Memeriksa apakah nilai bidang saat ini bukan NULL dan menandainya kotor jika perlu.

  • MarkForEdit

    Membandingkan nilai bidang saat ini dengan cache data dan menandai kotor jika perlu.

Tip

Buat model rutinitas DFX kustom Anda pada rutinitas DFX yang ada untuk jenis data standar.

Baca juga

Catatan Teknis menurut Angka
Catatan Teknis menurut Kategori