Bagikan melalui


Memperbarui Set Baris

Operasi database dasar adalah memperbarui, atau menulis data ke, penyimpanan data. Di OLE DB, mekanisme pembaruan sederhana: aplikasi konsumen Anda menetapkan nilai anggota data terikat dan kemudian menulis nilai tersebut ke set baris; konsumen kemudian meminta penyedia memperbarui penyimpanan data.

Konsumen dapat menyelesaikan jenis pembaruan berikut pada data himpunan baris: mengatur nilai kolom dalam baris, menyisipkan baris, dan menghapus baris. Untuk menyelesaikan operasi ini, CRowset kelas Templat OLE DB mengimplementasikan antarmuka IRowsetChange dan mengambil alih metode antarmuka berikut:

  • SetData mengubah nilai kolom dalam baris set baris; nilai tersebut sama dengan perintah SQL UPDATE.

  • Sisipkan menyisipkan baris ke dalam set baris; sama dengan perintah SQL INSERT.

  • Menghapus baris dari set baris; sama dengan perintah SQL DELETE.

Mendukung Operasi Pembaruan

Catatan

Wizard Konsumen ATL OLE DB tidak tersedia di Visual Studio 2019 dan yang lebih baru. Anda masih dapat menambahkan fungsionalitas secara manual. Untuk informasi selengkapnya, lihat Membuat Konsumen Tanpa Menggunakan Wizard.

Saat Anda membuat konsumen dengan Wizard Konsumen ATL OLE DB, Anda dapat mendukung operasi pembaruan dengan memilih satu atau beberapa dari tiga kotak centang Ubah, Sisipkan, dan Hapus. Jika Anda memilih opsi ini, wizard memodifikasi kode dengan tepat untuk mendukung jenis perubahan yang Anda pilih. Namun, jika Anda tidak menggunakan wizard, Anda perlu mengatur properti kumpulan baris berikut untuk VARIANT_TRUE mendukung pembaruan:

  • DBPROPVAL_UP_CHANGE memungkinkan Anda mengubah nilai data secara berturut-turut.

  • DBPROPVAL_UP_INSERT memungkinkan Anda menyisipkan baris.

  • DBPROPVAL_UP_DELETE memungkinkan Anda menghapus baris.

Anda mengatur properti sebagai berikut:

CDBPropSet ps(DBPROPSET_ROWSET);

ps.AddProperty(DBPROP_IRowsetChange, true);
ps.AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE);

Mengubah, menyisipkan, atau menghapus operasi mungkin gagal jika satu atau beberapa kolom tidak dapat ditulis. Ubah peta kursor Anda untuk memperbaiki masalah ini.

Mengatur Data dalam Baris

CRowset::SetData mengatur nilai data dalam satu atau beberapa kolom baris saat ini. Kode berikut mengatur nilai anggota data yang terikat ke kolom Name dan Units in Stock tabel Products lalu memanggil SetData untuk menulis nilai tersebut ke baris ke-100 dari set baris:

// Instantiate a rowset based on the user record class
CTable<CAccessor<CProductAccessor>> product;
CSession session;

// Open the rowset and move to the 100th row
product.Open(session, "Product", &ps, 1);  // ps is the property set
product.MoveToBookmark(&bookmark, 0);      // Assume that bookmark is set to 100th row

// Change the values of columns "Name" and "Units in Stock" in the current row of the Product table
_tcscpy_s(product.m_ProductName, product.m_sizeOfProductName, _T( "Candle" ) );

product.m_UnitsInStock = 10000;

// Set the data
HRESULT hr = product.SetData();

Menyisipkan Baris ke dalam Set Baris

CRowset::Insert membuat dan menginisialisasi baris baru menggunakan data dari aksesor. Insert membuat baris yang sama sekali baru setelah baris saat ini; Anda perlu menentukan apakah akan menaikkan baris saat ini ke baris berikutnya atau membiarkannya tidak berubah. Anda melakukan ini dengan mengatur parameter bGetRow :

HRESULT Insert(int nAccessor = 0, bool bGetRow = false)
  • false (nilai default) menentukan bahwa kenaikan baris saat ini ke baris berikutnya (dalam hal ini menunjuk ke baris yang disisipkan).

  • true menentukan bahwa baris saat ini tetap berada di tempatnya.

Kode berikut mengatur nilai anggota data yang terikat ke kolom tabel Products lalu memanggil Insert untuk menyisipkan baris baru dengan nilai tersebut setelah baris ke-100 dari set baris. Disarankan agar Anda mengatur semua nilai kolom untuk menghindari data yang tidak ditentukan di baris baru:

// Instantiate a rowset based on the user record class
CTable<CAccessor<CProductAccessor>> product;
CSession session;

// Open the rowset and move to the 100th row
product.Open(session, "Product", &ps, 1);  // ps is the property set
product.MoveToBookmark(&bookmark, 0);      // Assume that bookmark is set to 100th row

// Set the column values for a row of the Product table, then insert the row
product.m_ProductID = 101;
_tcscpy_s(product.m_ProductName, product.m_sizeOfProductName, _T( "Candle" ) );

product.m_SupplierID = 27857;
product.m_CategoryID = 372;
_tcscpy_s(product.m_QuantityPerUnit, product.m_sizeOfQuantityPerUnit, _T( "Pack of 10" ) );

product.m_UnitPrice = 20;
product.m_UnitsInStock = 10000;
product.m_UnitsOnOrder = 5201;
product.m_ReorderLevel = 5000;
product.m_Discontinued = false;

// You must also initialize the status and length fields before setting/inserting data
// Set the column status values
m_dwProductIDStatus = DBSTATUS_S_OK;
m_dwProductNameStatus = DBSTATUS_S_OK;
m_dwSupplierIDStatus = DBSTATUS_S_OK;
m_dwCategoryIDStatus = DBSTATUS_S_OK;
m_dwQuantityPerUnitStatus = DBSTATUS_S_OK;
m_dwUnitPriceStatus = DBSTATUS_S_OK;
m_dwUnitsInStockStatus = DBSTATUS_S_OK;
m_dwUnitsOnOrderStatus = DBSTATUS_S_OK;
m_dwReorderLevelStatus = DBSTATUS_S_OK;
m_dwDiscontinuedStatus = DBSTATUS_S_OK;

// Set the column length value for column data members that are not fixed-length types.
// The value should be the length of the string that you are setting.
m_dwProductNameLength = 6;             // "Candle" has 6 characters
m_dwQuantityPerUnitLength = 10;        // "Pack of 10" has 10 characters

// Insert the data
HRESULT hr = product.Insert();

Untuk contoh yang lebih rinci, lihat CRowset::Insert.

Untuk informasi selengkapnya tentang mengatur status dan panjang anggota data, lihat Anggota Data Status Bidang di Aksesor yang Dihasilkan Wizard.

Menghapus Baris dari Set Baris

CRowset::D elete menghapus baris saat ini dari set baris. Kode berikut memanggil Delete untuk menghapus baris ke-100 dari set baris:

// Instantiate a rowset based on the user record class
CTable<CAccessor<CProductAccessor>> product;
CSession session;

// Open the rowset and move to the 100th row
product.Open(session, "Product", &ps, 1);  // ps is the property set
product.MoveToBookmark(&bookmark, 0);      // Assume that bookmark is set to 100th row

// Delete the row
HRESULT hr = product.Delete();

Pembaruan Segera dan Ditangguhkan

Kecuali Anda menentukan sebaliknya, panggilan ke SetDatametode , Insert, dan Delete segera memperbarui penyimpanan data. Namun, Anda dapat menunda pembaruan sehingga konsumen menyimpan semua perubahan dalam cache lokal dan kemudian mentransfernya ke penyimpanan data saat Anda memanggil salah satu metode pembaruan berikut:

  • CRowset::Update mentransfer setiap perubahan tertunda yang dilakukan pada baris saat ini sejak pengambilan terakhir atau Update panggilan di atasnya.

  • CRowset::UpdateSemua mentransfer perubahan tertunda yang dilakukan pada semua baris sejak pengambilan terakhir atau Update panggilan di atasnya.

Pembaruan, seperti yang digunakan oleh metode pembaruan, memiliki arti khusus untuk membuat perubahan pada perintah dan tidak bingung dengan perintah PEMBARUAN SQL (SetData setara dengan perintah PEMBARUAN SQL).

Pembaruan yang ditangguhkan berguna, misalnya, dalam situasi seperti serangkaian transaksi perbankan; jika satu transaksi dibatalkan, Anda dapat membatalkan perubahan, karena Anda tidak mengirim rangkaian perubahan hingga setelah yang terakhir diterapkan. Selain itu, penyedia dapat menggabungkan perubahan ke dalam satu panggilan jaringan, yang lebih efisien.

Untuk mendukung pembaruan yang ditangguhkan, Anda harus mengatur DBPROP_IRowsetChange properti bersama dengan properti yang dijelaskan dalam Operasi Pembaruan Pendukung:

pPropSet->AddProperty(DBPROP_IRowsetUpdate, true);

Saat Anda memanggil Update atau UpdateAll, metode mentransfer perubahan dari cache lokal ke penyimpanan data lalu menghapus cache lokal. Karena pembaruan mentransfer perubahan hanya untuk baris saat ini, penting bagi aplikasi Anda untuk melacak baris mana yang akan diperbarui dan kapan harus memperbaruinya. Contoh berikut menunjukkan cara memperbarui dua baris berturut-turut:

// Instantiate a rowset based on the user record class
CTable<CAccessor<CProductAccessor>> product;
CSession session;

// Open the rowset and move to the 100th row
product.Open(session, "Product", &ps, 1);  // ps is the property set
product.MoveToBookmark(&bookmark, 0);      // Assume that bookmark is set to 100th row

// Change the values of columns "Name" and "Units in Stock" in the 100th row of the Product table
_tcscpy_s(product.m_ProductName, product.m_sizeOfProductName, _T( "Wick" ) );

product.m_UnitsInStock = 10000;

HRESULT hr = product.SetData();  // No changes made to row 100 yet
product.Update();                 // Update row 100 now

// Change the values of columns "Name" and "Units in Stock" in the 101st row of the Product table
product.MoveNext();

_tcscpy_s(product.m_ProductName, product.m_sizeOfProductName _T( "Wax" ) );

product.m_UnitsInStock = 500;

HRESULT hr = product.SetData();  // No changes made to row 101 yet
product.Update();                 // Update row 101 now

Untuk memastikan bahwa perubahan yang tertunda ditransfer, Anda harus memanggil Update sebelum pindah ke baris lain. Namun, ketika ini melelahkan atau tidak efisien, misalnya, ketika aplikasi Anda perlu memperbarui ratusan baris, Anda dapat menggunakan UpdateAll untuk memperbarui semua baris sekaligus.

Misalnya, jika panggilan pertama Update hilang dari kode di atas, baris 100 akan tetap tidak berubah, sementara baris 101 akan diubah. Setelah itu, aplikasi Anda harus memanggil UpdateAll atau pindah kembali ke baris 100 dan memanggil Update baris tersebut untuk diperbarui.

Akhirnya, salah satu alasan utama untuk menungguhkan perubahan adalah untuk dapat membatalkannya. Memanggil CRowset::Batalkan mengembalikan status cache perubahan lokal ke status penyimpanan data sebelum perubahan yang tertunda dilakukan. Penting untuk dicatat bahwa Undo tidak mengembalikan status cache lokal satu langkah (status hanya sebelum perubahan terbaru); sebaliknya, cache lokal dihapus untuk baris tersebut. Selain itu, Undo hanya memengaruhi baris saat ini.

Lihat juga

Bekerja dengan Templat Konsumen OLE DB
Kelas CRowset
IRowsetChange