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.
Rekaman data mengelola kolom tabel yang terikat yang Anda tentukan pada waktu desain, tetapi ada kasus ketika Anda mungkin ingin mengikat kolom yang tidak Anda ketahui saat itu. Topik ini menjelaskan:
Saat Anda mungkin ingin mengikat kolom secara dinamis ke kumpulan rekaman.
Cara menghubungkan kolom secara dinamis pada waktu eksekusi.
Catatan
Topik ini berlaku untuk objek yang berasal dari CRecordset di mana pengambilan baris massal belum diimplementasikan. Teknik yang dijelaskan umumnya tidak direkomendasikan jika Anda menggunakan pengambilan data baris dalam jumlah besar. Untuk informasi selengkapnya tentang pengambilan baris secara massal, lihat Recordset: Pengambilan Rekaman 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 mungkin menambahkan atau menghapus tabel atau menambahkan atau menghapus kolom dari tabel yang diandalkan oleh recordset 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:
Tentukan kolom apa yang tersedia saat waktu proses berlangsung.
Ikat kolom tambahan ke kumpulan data Anda secara dinamis, pada saat runtime.
Kumpulan rekaman Anda masih berisi elemen data untuk kolom yang Anda ketahui saat perancangan. 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 ke anggota data set rekaman).
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 Programmer's Reference 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 data 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
CDatabaseatau 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.
Recordset memilih rekaman dan menggunakan pertukaran bidang rekaman (RFX) untuk menghubungkan kolom statis (yang dipetakan ke anggota data bidang dari recordset) dan kolom dinamis (yang 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 lapangan 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.
Membangun Daftar Kolom untuk Pengikatan secara DinamisTambahkan panggilan fungsi RFX di fungsi kumpulan rekaman
DoFieldExchangeutama Anda untuk setiap kolom yang ditambahkan. Panggilan RFX ini melakukan pekerjaan mengambil catatan, termasuk kolom tambahan, dan mengaitkan kolom pada anggota data dari recordset atau pada penyimpanan yang disediakan secara dinamis untuk mereka.Salah satu pendekatan adalah dengan menambahkan loop pada fungsi kumpulan catatan utama Anda
DoFieldExchangeyang mengiterasi daftar kolom baru Anda, dan memanggil fungsi RFX yang sesuai untuk setiap kolom dalam daftar tersebut. 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 recordset Anda. |
| Kolom Set Rekaman Terkait | (Daftar 2 dalam ilustrasi) Daftar kolom yang terkait di kumpulan rekaman Anda. Kolom ini sudah memiliki pernyataan RFX dalam fungsi Anda DoFieldExchange . |
| Kolom-Untuk-Ditablekan-Secara-Dinamis | (Daftar 3 dalam gambar) Daftar kolom dalam tabel tetapi tidak di dalam kumpulan data 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-elemen dari daftar ini bersesuaian satu per satu dengan yang ada di Columns-to-Bind-Dynamically. |
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 kolom-kolom yang sudah terikat di kumpulan data 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 rekordset (Kolom-untuk-Diikat-Dinamis)
Buat daftar (Bound-Recordset-Columns) yang terdiri dari kolom-kolom yang telah terikat dalam recordset utama Anda.
Salah satu pendekatannya adalah membuat Bound-Recordset-Columns pada saat waktu desain. Anda dapat memeriksa panggilan fungsi RFX secara visual dalam fungsi recordset
DoFieldExchangeuntuk 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 mengiterasi daftar kolom dalam tabel pada waktu eksekusi (Current-Table-Columns) dan daftar kolom yang sudah terikat di dalam recordset (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 terdapat 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 nama setiap kolom yang disimpan dalam daftar kolom untuk dikaitkan secara dinamis (Kolom-untuk-Dikaitkan-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 berkorespondensi dengan variabel anggota recordset, yang menyimpan kolom yang umumnya terikat.
Untuk menyediakan penyimpanan dinamis untuk kolom baru (Dynamic-Column-Values)
Buat Dynamic-Column-Values, paralel dengan Columns-to-Bind-Dynamically, untuk menampung nilai data di setiap kolom.
Misalnya, ilustrasi menunjukkan Dynamic-Column-Values (Daftar 4) dengan satu elemen: objek
CStringyang 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 Menghubungkan 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
DoFieldExchangerecordset utama Anda, tambahkan kode yang melakukan iterasi pada daftar kolom baru Anda (Columns-to-Bind-Dynamically). Dalam setiap perulangan, ekstrak nama kolom dari Columns-to-Bind-Dynamically dan nilai hasil untuk kolom tersebut 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 loop Anda berulang kali memanggil fungsi RFX untuk kolom dinamis.
Lihat juga
Recordset (ODBC)
Recordset: Bekerja dengan Item Data Besar (ODBC)