Peristiwa Handel DataAdapter
Berlaku untuk: .NET Framework .NET .NET Standard
Penyedia data Microsoft SqlClient untuk SQL Server SqlDataAdapter memaparkan tiga peristiwa yang dapat Anda gunakan untuk merespons perubahan yang dilakukan pada data di sumber data. Tabel berikut ini memperlihatkan peristiwa DataAdapter
.
Kejadian | Deskripsi |
---|---|
RowUpdating |
Operasi UPDATE, INSERT, atau DELETE pada satu baris (melalui panggilan ke salah satu metode Update ) akan segera dimulai. |
RowUpdated |
Operasi UPDATE, INSERT, atau DELETE pada baris (melalui panggilan ke salah satu metode Update ) selesai. |
FillError |
Terjadi kesalahan selama operasi Fill . |
Peristiwa RowUpdating dan RowUpdated
RowUpdating
dimunculkan sebelum pembaruan apa pun ke baris dari DataSet diproses di sumber data. RowUpdated
dimunculkan setelah pembaruan apa pun ke baris dari DataSet
telah diproses di sumber data. Akibatnya, Anda dapat menggunakan RowUpdating
untuk memodifikasi perilaku pembaruan sebelum terjadi, untuk memberikan penanganan tambahan ketika pembaruan akan terjadi, untuk mempertahankan referensi ke baris yang diperbarui, untuk membatalkan pembaruan saat ini dan menjadwalkannya untuk proses batch yang akan diproses nanti, dan sebagainya. RowUpdated
berguna untuk menanggapi kesalahan dan pengecualian yang terjadi selama pembaruan. Anda dapat menambahkan informasi kesalahan ke DataSet
, serta logika coba lagi, dan sebagainya.
Argumen RowUpdatingEventArgs dan RowUpdatedEventArgs yang diteruskan ke peristiwa RowUpdating
dan RowUpdated
mencakup berikut ini: properti Command
yang mereferensikan objek Command
yang digunakan untuk melakukan pembaruan; properti Row
yang mereferensikan objek DataRow
yang berisi informasi yang diperbarui; properti StatementType
untuk jenis pembaruan apa yang sedang dilakukan; TableMapping
, jika berlaku; dan Status
operasi.
Anda dapat menggunakan properti Status
untuk menentukan apakah kesalahan telah terjadi selama operasi dan, jika diinginkan, untuk mengontrol tindakan terhadap baris saat ini dan yang dihasilkan. Saat peristiwa terjadi, properti Status
sama dengan Continue
atau ErrorsOccurred
. Tabel berikut menunjukkan nilai yang dapat Anda atur properti Status
untuk mengontrol tindakan selanjutnya selama pembaruan.
Keadaan | Deskripsi |
---|---|
Continue |
Lanjutkan operasi pembaruan. |
ErrorsOccurred |
Batalkan operasi pembaruan dan berikan pengecualian. |
SkipCurrentRow |
Abaikan baris saat ini dan lanjutkan operasi pembaruan. |
SkipAllRemainingRows |
Batalkan operasi pembaruan tetapi jangan berikan pengecualian. |
Menyetel properti Status
ke ErrorsOccurred
menyebabkan pengecualian dilempar. Anda dapat mengontrol pengecualian mana yang dilemparkan dengan menyetel properti Errors
ke pengecualian yang diinginkan. Menggunakan salah satu nilai lain untuk Status
mencegah pengecualian dilemparkan.
Anda juga dapat menggunakan properti ContinueUpdateOnError
untuk menangani kesalahan untuk baris yang diperbarui. Jika DataAdapter.ContinueUpdateOnError
adalah true
, saat pembaruan ke baris menghasilkan pengecualian yang dilemparkan, teks pengecualian ditempatkan ke dalam informasi RowError
dari baris tertentu, dan pemrosesan berlanjut tanpa membuang pengecualian. Ini memungkinkan Anda untuk merespons kesalahan saat Update
selesai, berbeda dengan peristiwa RowUpdated
, yang memungkinkan Anda untuk merespons kesalahan saat menemukan kesalahan.
Contoh kode berikut menunjukkan cara menambah dan menghapus penanganan aktivitas. Penanganan aktivitas RowUpdating
menulis log semua rekaman yang dihapus dengan stempel waktu. Penanganan aktivitas RowUpdated
menambahkan informasi kesalahan ke properti RowError
dari baris di DataSet
, menekan pengecualian, dan melanjutkan pemrosesan (mencerminkan perilaku ContinueUpdateOnError
= true
).
static DataSet DataAdapterEventsDemo(SqlConnection connection, DataSet custDS)
{
// Assumes that connection is a valid SqlConnection object
// and custDS includes the Customers table.
SqlDataAdapter custAdapter = new SqlDataAdapter(
"SELECT CustomerID, CompanyName FROM Customers", connection);
// Add handlers.
custAdapter.RowUpdating += new SqlRowUpdatingEventHandler(OnRowUpdating);
custAdapter.RowUpdated += new SqlRowUpdatedEventHandler(OnRowUpdated);
// Set DataAdapter command properties, fill DataSet, modify DataSet.
custAdapter.Update(custDS, "Customers");
// Remove handlers.
custAdapter.RowUpdating -= new SqlRowUpdatingEventHandler(OnRowUpdating);
custAdapter.RowUpdated -= new SqlRowUpdatedEventHandler(OnRowUpdated);
return custDS;
}
protected static void OnRowUpdating(object sender, SqlRowUpdatingEventArgs args)
{
if (args.StatementType == StatementType.Delete)
{
// Saves the removing rows with additional information in a file.
System.IO.TextWriter tw = System.IO.File.AppendText("Deletes.log");
tw.WriteLine(
"{0}: Customer {1} Deleted.", DateTime.Now,
args.Row["CustomerID", DataRowVersion.Original]);
tw.Close();
}
}
protected static void OnRowUpdated(object sender, SqlRowUpdatedEventArgs args)
{
if (args.Status == UpdateStatus.ErrorsOccurred)
{
// Adds the error message to the row and skips from it.
args.Row.RowError = args.Errors.Message;
args.Status = UpdateStatus.SkipCurrentRow;
}
}
Peristiwa FillError
Masalah DataAdapter
dari peristiwa FillError
ketika kesalahan terjadi selama operasi Fill
. Jenis kesalahan ini biasanya terjadi ketika data dalam baris yang ditambahkan tidak dapat dikonversi ke jenis .NET tanpa kehilangan presisi.
Jika terjadi kesalahan selama Fill
operasi, baris saat ini tidak ditambahkan ke DataTable
. Kejadian ini FillError
memungkinkan Anda mengatasi kesalahan dan menambahkan baris, atau mengabaikan baris yang dikecualikan dan melanjutkan operasi Fill
.
FillErrorEventArgs yang diteruskan ke peristiwa FillError
dapat berisi beberapa properti yang memungkinkan Anda merespons dan mengatasi kesalahan. Tabel berikut ini memperlihatkan properti objek FillErrorEventArgs
.
Properti | Deskripsi |
---|---|
Errors |
Exception yang terjadi. |
DataTable |
Objek DataTable sedang diisi saat kesalahan terjadi. |
Values |
Larik objek yang berisi nilai baris yang ditambahkan saat kesalahan terjadi. Referensi ordinal dari larik Values sesuai dengan referensi ordinal dari kolom dari baris yang ditambahkan. Misalnya, Values[0] adalah nilai yang ditambahkan sebagai kolom pertama dari baris. |
Continue |
Memungkinkan Anda memilih apakah akan melempar pengecualian atau tidak. Menyetel properti Continue ke false akan menghentikan operasi Fill saat ini, dan pengecualian akan ditampilkan. Menyetel Continue ke true melanjutkan operasi Fill meskipun ada kesalahan. |
Contoh kode berikut menambahkan penanganan aktivitas untuk peristiwa FillError
dari DataAdapter
. Dalam kode peristiwa FillError
, contoh menentukan apakah ada potensi kehilangan presisi, memberikan kesempatan untuk menanggapi pengecualian.
static DataSet DataAdapterFillAndError(SqlDataAdapter adapter)
{
// Assuemes adapter is a valid SqlDataAdapter object.
adapter.FillError += new FillErrorEventHandler(FillError);
DataSet dataSet = new DataSet();
adapter.Fill(dataSet);
return dataSet;
}
protected static void FillError(object sender, FillErrorEventArgs args)
{
if (args.Errors.GetType() == typeof(System.OverflowException))
{
// Code to handle precision loss.
// Add a row to table using the values from the first two columns.
DataRow myRow = args.DataTable.Rows.Add(new object[]
{args.Values[0], args.Values[1], DBNull.Value});
//Set the RowError containing the value for the third column.
myRow.RowError =
"OverflowException Encountered. Value from data source: " +
args.Values[2];
args.Continue = true;
}
}