Bagikan melalui


Kumpulan Catatan: Kolom Data Pengikatan Dinamis (ODBC)

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:

  1. 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.

  2. Ambil langkah-langkah untuk menambahkan kolom secara dinamis.

    Lihat proses yang dijelaskan dalam Menambahkan Kolom di bawah ini.

  3. 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:

  1. 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).

  2. 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.

    Membangun daftar kolom untuk mengikat secara dinamis.
    Daftar Bangunan Kolom ke Ikatan Secara Dinamis

  3. Tambahkan 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)
  1. 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).

  2. 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).

  3. 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)

  1. 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
  1. 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)