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 CRecordset
kelas -turunan, data ditransfer melalui pertukaran bidang rekaman (RFX). Untuk informasi selengkapnya, lihat Record Field Exchange (RFX).
Topik ini menjelaskan:
Beberapa pertimbangan khusus saat menggunakan pengambilan baris massal.
Cara menerapkan pertukaran bidang rekaman massal.
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. MemanggilAddNew
fungsi anggota , ,Delete
Edit
, atauUpdate
menghasilkan pernyataan yang gagal. MeskipunCRecordset
saat ini tidak menyediakan mekanisme untuk memperbarui baris data massal, Anda dapat menulis fungsi Anda sendiri dengan menggunakan fungsiSQLSetPos
ODBC API . Untuk informasi selengkapnya tentangSQLSetPos
, lihat Referensi Programmer ODBC.Fungsi anggota
IsDeleted
, ,IsFieldDirty
,IsFieldNull
IsFieldNullable
,SetFieldDirty
, danSetFieldNull
tidak dapat digunakan pada recordset yang mengimplementasikan pengambilan baris massal. Namun, Anda dapat memanggilGetRowStatus
menggantikanIsDeleted
, danGetODBCFieldInfo
menggantikanIsFieldNullable
.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 untukMoveNext
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 bahwaMoveNext
danMove( 1 )
tidak setara ketika pengambilan baris massal diimplementasikan.Move( 1 )
mengambil set baris yang dimulai 1 baris dari rekaman saat ini. Dalam contoh ini, panggilanMove( 1 )
setelah panggilanOpen
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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk