Bagikan melalui


Recordset: Mengambil Rekaman secara Massal (ODBC)

Topik ini berlaku untuk kelas MFC ODBC.

Kelas CRecordset menyediakan dukungan untuk pengambilan baris massal, yang berarti bahwa beberapa rekaman dapat diambil sekaligus selama satu pengambilan, daripada mengambil satu rekaman sekaligus dari sumber data. Anda dapat menerapkan pengambilan baris massal hanya di kelas turunan CRecordset . Proses mentransfer data dari sumber data ke objek recordset disebut pertukaran bidang rekaman massal (RFX Massal). Perhatikan bahwa jika Anda tidak menggunakan pengambilan baris massal di CRecordsetkelas -turunan, data ditransfer melalui pertukaran bidang rekaman (RFX). Untuk informasi selengkapnya, lihat Record Field Exchange (RFX).

Topik ini menjelaskan:

Cara CRecordset Mendukung Pengambilan Baris Massal

Sebelum membuka objek recordset, Anda dapat menentukan ukuran set baris dengan SetRowsetSize fungsi anggota. Ukuran set baris menentukan berapa banyak rekaman yang harus diambil selama satu pengambilan. Saat pengambilan baris massal diimplementasikan, ukuran set baris default adalah 25. Jika pengambilan baris massal tidak diimplementasikan, ukuran set baris tetap pada 1.

Setelah Anda menginisialisasi ukuran set baris, panggil fungsi Buka anggota. Di sini Anda harus menentukan CRecordset::useMultiRowFetch opsi parameter dwOptions untuk menerapkan pengambilan baris massal. Anda juga dapat mengatur CRecordset::userAllocMultiRowBuffers opsi . Mekanisme pertukaran bidang rekaman massal menggunakan array untuk menyimpan beberapa baris data yang diambil selama pengambilan. Buffer penyimpanan ini dapat dialokasikan secara otomatis oleh kerangka kerja atau Anda dapat mengalokasikannya secara manual. Menentukan CRecordset::userAllocMultiRowBuffers opsi berarti Anda akan melakukan alokasi.

Tabel berikut mencantumkan fungsi anggota yang disediakan oleh CRecordset untuk mendukung pengambilan baris massal.

Fungsi anggota Deskripsi
CheckRowsetError Fungsi virtual yang menangani kesalahan apa pun yang terjadi selama pengambilan.
DoBulkFieldExchange Menerapkan pertukaran bidang rekaman massal. Dipanggil secara otomatis untuk mentransfer beberapa baris data dari sumber data ke objek kumpulan rekaman.
GetRowsetSize Mengambil pengaturan saat ini untuk ukuran set baris.
GetRowsFetched Memberi tahu berapa banyak baris yang benar-benar diambil setelah pengambilan tertentu. Dalam kebanyakan kasus, ini adalah ukuran set baris, kecuali kumpulan baris yang tidak lengkap diambil.
GetRowStatus Mengembalikan status pengambilan untuk baris tertentu dalam set baris.
RefreshRowset Merefresh data dan status baris tertentu dalam set baris.
SetRowsetCursorPosition Memindahkan kursor ke baris tertentu dalam set baris.
SetRowsetSize Fungsi virtual yang mengubah pengaturan untuk ukuran set baris ke nilai yang ditentukan.

Pertimbangan Khusus

Meskipun pengambilan baris massal adalah perolehan performa, fitur tertentu beroperasi secara berbeda. Sebelum Anda memutuskan untuk menerapkan pengambilan baris massal, pertimbangkan hal berikut:

  • Kerangka kerja secara otomatis memanggil DoBulkFieldExchange fungsi anggota untuk mentransfer data dari sumber data ke objek kumpulan rekaman. Namun, data tidak ditransfer dari kumpulan rekaman kembali ke sumber data. Memanggil AddNewfungsi anggota , , DeleteEdit, atau Update menghasilkan pernyataan yang gagal. Meskipun CRecordset saat ini tidak menyediakan mekanisme untuk memperbarui baris data massal, Anda dapat menulis fungsi Anda sendiri dengan menggunakan fungsi SQLSetPosODBC API . Untuk informasi selengkapnya tentang SQLSetPos, lihat Referensi Programmer ODBC.

  • Fungsi anggota IsDeleted, , IsFieldDirty, IsFieldNullIsFieldNullable, SetFieldDirty, dan SetFieldNull tidak dapat digunakan pada recordset yang mengimplementasikan pengambilan baris massal. Namun, Anda dapat memanggil GetRowStatus menggantikan IsDeleted, dan GetODBCFieldInfo menggantikan IsFieldNullable.

  • Operasi memposisikan Move ulang kumpulan rekaman Anda menurut set baris. Misalnya, Anda membuka kumpulan rekaman yang memiliki 100 rekaman dengan ukuran set baris awal 10. Open mengambil baris 1 hingga 10, dengan rekaman saat ini diposisikan pada baris 1. Panggilan untuk MoveNext mengambil set baris berikutnya, bukan baris berikutnya. Kumpulan baris ini terdiri dari baris 11 hingga 20, dengan rekaman saat ini diposisikan pada baris 11. Perhatikan bahwa MoveNext dan Move( 1 ) tidak setara ketika pengambilan baris massal diimplementasikan. Move( 1 ) mengambil set baris yang dimulai 1 baris dari rekaman saat ini. Dalam contoh ini, panggilan Move( 1 ) setelah panggilan Open mengambil set baris yang terdiri dari baris 2 hingga 11, dengan rekaman saat ini diposisikan pada baris 2. Untuk informasi selengkapnya, lihat fungsi Pindahkan anggota.

  • Tidak seperti pertukaran bidang rekaman, wizard tidak mendukung pertukaran bidang rekaman massal. Ini berarti Anda harus mendeklarasikan anggota data bidang Anda secara manual dan mengambil alih DoBulkFieldExchange secara manual dengan menulis panggilan ke fungsi RFX Massal. Untuk informasi selengkapnya, lihat Fungsi Pertukaran Bidang Rekaman di Referensi Pustaka Kelas.

Cara Menerapkan Pertukaran Bidang Rekaman Massal

Pertukaran bidang rekaman massal mentransfer kumpulan baris data dari sumber data ke objek kumpulan rekaman. Fungsi RFX Massal menggunakan array untuk menyimpan data ini, serta array untuk menyimpan panjang setiap item data dalam set baris. Dalam definisi kelas, Anda harus menentukan anggota data bidang sebagai penunjuk untuk mengakses array data. Selain itu, Anda harus menentukan sekumpulan penunjuk untuk mengakses array panjang. Setiap anggota data parameter tidak boleh dideklarasikan sebagai penunjuk; mendeklarasikan anggota data parameter saat menggunakan pertukaran bidang rekaman massal sama dengan mendeklarasikannya saat menggunakan pertukaran bidang rekaman. Kode berikut menunjukkan contoh sederhana:

class MultiRowSet : public CRecordset
{
public:
   // Field/Param Data
      // field data members
      long* m_rgID;
      LPSTR m_rgName;

      // pointers for the lengths
      // of the field data
      long* m_rgIDLengths;
      long* m_rgNameLengths;

      // input parameter data member
      CString m_strNameParam;

   .
   .
   .
}

Anda dapat mengalokasikan buffer penyimpanan ini secara manual atau meminta kerangka kerja melakukan alokasi. Untuk mengalokasikan buffer sendiri, Anda harus menentukan CRecordset::userAllocMultiRowBuffers opsi parameter dwOptions dalam Open fungsi anggota. Pastikan untuk mengatur ukuran array setidaknya sama dengan ukuran set baris. Jika Anda ingin kerangka kerja melakukan alokasi, Anda harus menginisialisasi pointer Anda ke NULL. Ini biasanya dilakukan di konstruktor objek recordset:

MultiRowSet::MultiRowSet( CDatabase* pDB )
   : CRecordset( pDB )
{
   m_rgID = NULL;
   m_rgName = NULL;
   m_rgIDLengths = NULL;
   m_rgNameLengths = NULL;
   m_strNameParam = "";

   m_nFields = 2;
   m_nParams = 1;

   .
   .
   .
}

Terakhir, Anda harus mengambil alih DoBulkFieldExchange fungsi anggota. Untuk anggota data bidang, panggil fungsi RFX Massal; untuk setiap anggota data parameter, panggil fungsi RFX. Jika Anda membuka kumpulan rekaman dengan meneruskan pernyataan SQL atau prosedur tersimpan ke Open, urutan anda melakukan panggilan RFX massal harus sesuai dengan urutan kolom dalam recordset; demikian pula, urutan panggilan RFX untuk parameter harus sesuai dengan urutan parameter dalam pernyataan SQL atau prosedur tersimpan.

void MultiRowSet::DoBulkFieldExchange( CFieldExchange* pFX )
{
   // call the Bulk RFX functions
   // for field data members
   pFX->SetFieldType( CFieldExchange::outputColumn );
   RFX_Long_Bulk( pFX, _T( "[colRecID]" ),
                  &m_rgID, &m_rgIDLengths );
   RFX_Text_Bulk( pFX, _T( "[colName]" ),
                  &m_rgName, &m_rgNameLengths, 30 );

   // call the RFX functions for
   // for parameter data members
   pFX->SetFieldType( CFieldExchange::inputParam );
   RFX_Text( pFX, "NameParam", m_strNameParam );
}

Catatan

Anda harus memanggil Close fungsi anggota sebelum kelas turunan CRecordset Anda keluar dari cakupan. Ini memastikan bahwa memori apa pun yang dialokasikan oleh kerangka kerja dibeberkan. Adalah praktik pemrograman yang baik untuk selalu secara eksplisit memanggil Close, terlepas dari apakah Anda telah menerapkan pengambilan baris massal.

Untuk informasi selengkapnya tentang pertukaran bidang rekaman (RFX), lihat Pertukaran Bidang Rekaman: Cara Kerja RFX. Untuk informasi selengkapnya tentang menggunakan parameter, lihat CFieldExchange::SetFieldType dan Recordset: Parameterizing a Recordset (ODBC).

Baca juga

Recordset (ODBC)
CRecordset::m_nFields
CRecordset::m_nParams