Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Topik ini berlaku untuk kelas MFC ODBC.
Kumpulan rekaman mengelola kolom tabel pengikatan yang Anda tentukan pada waktu desain, tetapi ada kasus ketika Anda mungkin ingin mengikat kolom yang tidak diketahui oleh Anda pada waktu desain. Topik ini menjelaskan:
Catatan
Topik ini berlaku untuk objek yang berasal dari CRecordset
tempat pengambilan baris massal belum diimplementasikan. Teknik yang dijelaskan umumnya tidak disarankan jika Anda menggunakan pengambilan baris massal. Untuk informasi selengkapnya tentang pengambilan baris massal, lihat Recordset: Mengambil Rekaman secara Massal (ODBC).
Ketika Anda Mungkin Mengikat Kolom Secara Dinamis
Catatan
Wizard MFC ODBC Consumer tidak tersedia di Visual Studio 2019 dan yang lebih baru. Anda masih dapat membuat konsumen secara manual.
Pada waktu desain, MFC Application Wizard atau MFC ODBC Consumer Wizard (dari Tambahkan Kelas) membuat kelas recordset berdasarkan tabel dan kolom yang diketahui pada sumber data Anda. Database dapat berubah antara saat Anda mendesainnya dan nanti saat aplikasi Anda menggunakan tabel dan kolom tersebut pada waktu proses. Anda atau pengguna lain dapat menambahkan atau menghilangkan tabel atau menambahkan atau meletakkan kolom dari tabel yang diandalkan oleh kumpulan rekaman aplikasi Anda. Ini mungkin bukan masalah untuk semua aplikasi akses data, tetapi jika itu untuk Anda, bagaimana Anda dapat mengatasi perubahan dalam skema database, selain dengan mendesain ulang dan mengkompilasi ulang? Tujuan dari topik ini adalah untuk menjawab pertanyaan itu.
Topik ini menjelaskan kasus paling umum di mana Anda mungkin mengikat kolom secara dinamis — setelah dimulai dengan kumpulan rekaman berdasarkan skema database yang diketahui, Anda ingin menangani kolom tambahan pada waktu proses. Topik ini selanjutnya mengasumsikan bahwa kolom tambahan dipetakan ke CString
anggota data bidang, kasus yang paling umum, meskipun saran diberikan untuk membantu Anda mengelola jenis data lainnya.
Dengan sejumlah kecil kode tambahan, Anda dapat:
Kumpulan rekaman Anda masih berisi anggota data untuk kolom yang Anda ketahui pada waktu desain. Ini juga berisi sejumlah kecil kode tambahan yang secara dinamis menentukan apakah ada kolom baru yang telah ditambahkan ke tabel target Anda dan, jika demikian, mengikat kolom baru ini ke penyimpanan yang dialokasikan secara dinamis (daripada merekam anggota data).
Topik ini tidak mencakup kasus pengikatan dinamis lainnya, seperti tabel atau kolom yang dihilangkan. Untuk kasus tersebut, Anda perlu menggunakan panggilan ODBC API secara lebih langsung. Untuk informasi, lihat Referensi Programmer ODBC.
Cara Mengikat Kolom Secara Dinamis
Untuk mengikat kolom secara dinamis, Anda harus mengetahui (atau dapat menentukan) nama kolom tambahan. Anda juga harus mengalokasikan penyimpanan untuk anggota data bidang tambahan, menentukan nama dan jenisnya, dan menentukan jumlah kolom yang Anda tambahkan.
Diskusi berikut menyebutkan dua kumpulan rekaman yang berbeda. Yang pertama adalah kumpulan rekaman utama yang memilih rekaman dari tabel target. Yang kedua adalah kumpulan rekaman kolom khusus yang digunakan untuk mendapatkan informasi tentang kolom dalam tabel target Anda.
Proses Umum
Pada tingkat yang paling umum, Anda mengikuti langkah-langkah berikut:
Buat objek recordset utama Anda.
Secara opsional, teruskan penunjuk ke objek terbuka
CDatabase
atau dapat menyediakan informasi koneksi ke kumpulan rekaman kolom dengan cara lain.Ambil langkah-langkah untuk menambahkan kolom secara dinamis.
Lihat proses yang dijelaskan dalam Menambahkan Kolom di bawah ini.
Buka kumpulan catatan utama Anda.
Kumpulan rekaman memilih rekaman dan menggunakan pertukaran bidang rekaman (RFX) untuk mengikat kolom statis (yang dipetakan ke anggota data bidang kumpulan rekaman) dan kolom dinamis (dipetakan ke penyimpanan tambahan yang Anda alokasikan).
Menambahkan Kolom
Mengikat kolom yang ditambahkan secara dinamis pada waktu proses memerlukan langkah-langkah berikut:
Tentukan pada waktu proses kolom apa yang ada dalam tabel target. Ekstrak dari informasi tersebut daftar kolom yang telah ditambahkan ke tabel sejak kelas recordset Anda dirancang.
Pendekatan yang baik adalah menggunakan kelas kumpulan rekaman kolom yang dirancang untuk mengkueri sumber data untuk informasi kolom untuk tabel target (seperti nama kolom dan jenis data).
Menyediakan penyimpanan untuk anggota data bidang baru. Karena kelas himpunan catatan utama Anda tidak memiliki anggota data bidang untuk kolom yang tidak diketahui, Anda harus menyediakan tempat untuk menyimpan nama, nilai hasil, dan mungkin informasi jenis data (jika kolom adalah jenis data yang berbeda).
Salah satu pendekatannya adalah membuat satu atau beberapa daftar dinamis, satu untuk nama kolom baru, yang lain untuk nilai hasilnya, dan yang ketiga untuk jenis data mereka (jika perlu). Daftar ini, terutama daftar nilai, memberikan informasi dan penyimpanan yang diperlukan untuk pengikatan. Gambar berikut mengilustrasikan pembuatan daftar.
Daftar Bangunan Kolom ke Ikatan Secara DinamisTambahkan panggilan fungsi RFX di fungsi kumpulan rekaman
DoFieldExchange
utama Anda untuk setiap kolom yang ditambahkan. Panggilan RFX ini melakukan pekerjaan mengambil rekaman, termasuk kolom tambahan, dan mengikat kolom untuk merekam anggota data atau ke penyimpanan yang disediakan secara dinamis untuk mereka.Salah satu pendekatannya adalah menambahkan perulangan ke fungsi kumpulan catatan
DoFieldExchange
utama Anda yang mengulangi daftar kolom baru Anda, memanggil fungsi RFX yang sesuai untuk setiap kolom dalam daftar. Pada setiap panggilan RFX, berikan nama kolom dari daftar nama kolom dan lokasi penyimpanan di anggota yang sesuai dari daftar nilai hasil.
Daftar Kolom
Empat daftar yang perlu Anda kerjakan diperlihatkan dalam tabel berikut.
Daftar | Deskripsi |
---|---|
Kolom-Tabel Saat Ini | (Daftar 1 dalam ilustrasi) Daftar kolom yang saat ini ada dalam tabel pada sumber data. Daftar ini mungkin cocok dengan daftar kolom yang saat ini terikat di kumpulan catatan Anda. |
Kolom-Kumpulan Rekaman Terikat | (Daftar 2 dalam ilustrasi) Daftar kolom yang terikat di kumpulan rekaman Anda. Kolom ini sudah memiliki pernyataan RFX dalam fungsi Anda DoFieldExchange . |
Kolom-Ke-Ikatan-Dinamis | (Daftar 3 dalam ilustrasi) Daftar kolom dalam tabel tetapi tidak di kumpulan catatan Anda. Ini adalah kolom yang ingin Anda ikat secara dinamis. |
Nilai Kolom Dinamis | (Daftar 4 dalam ilustrasi) Daftar yang berisi penyimpanan untuk nilai yang diambil dari kolom yang Anda ikat secara dinamis. Elemen daftar ini sesuai dengan yang ada di Columns-to-Bind-Dynamically, satu ke satu. |
Membangun Daftar Anda
Dengan mengingat strategi umum, Anda dapat beralih ke detailnya. Prosedur di sisa topik ini menunjukkan kepada Anda cara membuat daftar yang diperlihatkan dalam Daftar Kolom. Prosedur memandu Anda melalui:
Menentukan Kolom Tabel Mana yang Tidak Ada di Kumpulan Rekaman Anda
Buat daftar (Bound-Recordset-Columns, seperti dalam Daftar 2 dalam ilustrasi) yang berisi daftar kolom yang sudah terikat di kumpulan rekaman utama Anda. Kemudian buat daftar (Columns-to-Bind-Dynamically, berasal dari Current-Table-Columns dan Bound-Recordset-Columns) yang berisi nama kolom yang ada dalam tabel pada sumber data tetapi tidak di kumpulan rekaman utama Anda.
Untuk menentukan nama kolom yang tidak ada di kumpulan rekaman (Kolom-ke-Ikatan-Dinamis)
Buat daftar (Bound-Recordset-Columns) kolom yang sudah terikat di recordset utama Anda.
Salah satu pendekatannya adalah membuat Bound-Recordset-Columns pada waktu desain. Anda dapat memeriksa panggilan fungsi RFX secara visual dalam fungsi recordset
DoFieldExchange
untuk mendapatkan nama-nama ini. Kemudian, siapkan daftar Anda sebagai array yang diinisialisasi dengan nama.Misalnya, ilustrasi menunjukkan Bound-Recordset-Columns (Daftar 2) dengan tiga elemen. Kolom-Kumpulan Rekaman Terikat tidak memiliki kolom Telepon yang diperlihatkan di Kolom-Tabel Saat Ini (Daftar 1).
Bandingkan Current-Table-Columns dan Bound-Recordset-Columns untuk membuat daftar (Columns-to-Bind-Dynamically) dari kolom yang belum terikat di kumpulan catatan utama Anda.
Salah satu pendekatannya adalah mengulangi daftar kolom Anda dalam tabel pada run time (Current-Table-Columns) dan daftar kolom Anda yang sudah terikat di recordset Anda (Bound-Recordset-Columns) secara paralel. Ke dalam Columns-to-Bind-Dynamically letakkan nama apa pun di Current-Table-Columns yang tidak muncul di Bound-Recordset-Columns.
Misalnya, ilustrasi menunjukkan Columns-to-Bind-Dynamically (Daftar 3) dengan satu elemen: kolom Telepon yang ditemukan di Current-Table-Columns (Daftar 1) tetapi tidak di Bound-Recordset-Columns (Daftar 2).
Buat daftar Dynamic-Column-Values (seperti dalam Daftar 4 dalam ilustrasi) untuk menyimpan nilai data yang sesuai dengan setiap nama kolom yang disimpan dalam daftar kolom Anda untuk diikat secara dinamis (Kolom-ke-Ikatan-Dinamis).
Elemen daftar ini memainkan peran anggota data bidang himpunan rekaman baru. Mereka adalah lokasi penyimpanan tempat kolom dinamis terikat. Untuk deskripsi daftar, lihat Daftar Kolom.
Menyediakan Penyimpanan untuk Kolom Baru
Selanjutnya, siapkan lokasi penyimpanan agar kolom terikat secara dinamis. Idenya adalah menyediakan elemen daftar untuk menyimpan nilai setiap kolom. Lokasi penyimpanan ini paralel dengan variabel anggota kumpulan rekaman, yang menyimpan kolom yang biasanya terikat.
Untuk menyediakan penyimpanan dinamis untuk kolom baru (Dynamic-Column-Values)
Bangun Dynamic-Column-Values, paralel dengan Columns-to-Bind-Dynamically, untuk berisi nilai data di setiap kolom.
Misalnya, ilustrasi menunjukkan Dynamic-Column-Values (Daftar 4) dengan satu elemen: objek yang
CString
berisi nomor telepon aktual untuk rekaman saat ini: "555-1212".Dalam kasus yang paling umum, Dynamic-Column-Values memiliki elemen jenis
CString
. Jika Anda berurusan dengan kolom dengan berbagai jenis data, Anda memerlukan daftar yang bisa berisi elemen berbagai jenis.
Hasil prosedur sebelumnya adalah dua daftar utama: Columns-to-Bind-Dynamically yang berisi nama kolom dan Dynamic-Column-Values yang berisi nilai dalam kolom untuk rekaman saat ini.
Petunjuk / Saran
Jika kolom baru bukan semua tipe data yang sama, Anda mungkin menginginkan daftar paralel tambahan yang berisi item yang entah bagaimana menentukan jenis setiap elemen terkait dalam daftar kolom. (Anda dapat menggunakan nilai AFX_RFX_BOOL, AFX_RFX_BYTE, dan sebagainya, untuk ini jika Anda mau. Konstanta ini didefinisikan dalam AFXDB.H.) Pilih tipe daftar berdasarkan cara Anda mewakili jenis data kolom.
Menambahkan Panggilan RFX untuk Mengikat Kolom
Terakhir, atur agar pengikatan dinamis terjadi dengan menempatkan panggilan RFX untuk kolom baru dalam fungsi Anda DoFieldExchange
.
Untuk menambahkan panggilan RFX secara dinamis untuk kolom baru
- Dalam fungsi anggota kumpulan rekaman
DoFieldExchange
utama Anda, tambahkan kode yang mengulangi daftar kolom baru Anda (Kolom-ke-Ikatan-Dinamis). Di setiap perulangan, ekstrak nama kolom dari Columns-to-Bind-Dynamically dan nilai hasil untuk kolom dari Dynamic-Column-Values. Teruskan item ini ke panggilan fungsi RFX yang sesuai dengan jenis data kolom. Untuk deskripsi daftar, lihat Daftar Kolom.
Dalam kasus umum, dalam fungsi Anda RFX_Text
memanggil Anda mengekstrak CString
objek dari daftar, seperti dalam baris kode berikut, di mana Columns-to-Bind-Dynamically adalah yang CStringList
disebut m_listName
dan Dynamic-Column-Values adalah yang CStringList
disebut m_listValue
:
RFX_Text( pFX,
m_listName.GetNext( posName ),
m_listValue.GetNext( posValue ));
Untuk informasi selengkapnya tentang fungsi RFX, lihat Makro dan Global di Referensi Pustaka Kelas.
Petunjuk / Saran
Jika kolom baru adalah jenis data yang berbeda, gunakan pernyataan pengalihan dalam perulangan Anda untuk memanggil fungsi RFX yang sesuai untuk setiap jenis.
Saat kerangka kerja memanggil DoFieldExchange
selama Open
proses untuk mengikat kolom ke kumpulan rekaman, RFX memanggil kolom statis yang mengikat kolom tersebut. Kemudian perulangan Anda berulang kali memanggil fungsi RFX untuk kolom dinamis.
Lihat juga
Recordset (ODBC)
Recordset: Bekerja dengan Item Data Besar (ODBC)