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
Contoh menggunakan Pertukaran Bidang Rekaman DAO dan Pengikatan Dinamis
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 CDaoRecordset
kelas 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 diCDaoRecordset
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 fungsiCDaoFieldExchange::AppendParamType
untuk melihat nama jenis individual. Dalam kasusDFX_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 dalamDFX_Text
jenis informasi dalam struktur termasuk jenis DAO yang digunakan (DAO_CHAR atau DAO_WCHAR dalam kasusDFX_Text
). Selain itu, jenis pengikatan yang digunakan juga disiapkan. Di bagianGetRows
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 (sepertiDFX_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