Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
ADO.NET DataAdapter mengekspos tiga peristiwa yang dapat Anda gunakan untuk merespons perubahan yang dilakukan pada data di sumber data. Tabel berikut ini memperlihatkan DataAdapter peristiwa.
| Peristiwa | Deskripsi |
|---|---|
RowUpdating |
Operasi UPDATE, INSERT, atau DELETE pada suatu baris (melalui salah satu metode Update) akan segera dimulai. |
RowUpdated |
Operasi PERBARUI, SISIPKAN, atau HAPUS pada baris (dengan panggilan ke salah Update satu metode) selesai. |
FillError |
Kesalahan telah terjadi selama operasi Fill. |
RowUpdating dan RowUpdated
RowUpdating dinaikkan sebelum pembaruan apa pun ke baris dari DataSet telah 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: Command properti yang mereferensikan Command objek yang digunakan untuk melakukan pembaruan; Row properti yang mereferensikan DataRow objek yang berisi informasi yang diperbarui; StatementType properti untuk jenis pembaruan yang sedang dilakukan; TableMapping, jika berlaku; dan Status operasi.
Anda dapat menggunakan Status properti untuk menentukan apakah kesalahan telah terjadi selama operasi dan, jika diinginkan, untuk mengontrol tindakan terhadap baris saat ini dan yang dihasilkan. Ketika peristiwa terjadi, Status properti sama dengan Continue atau ErrorsOccurred. Tabel berikut ini memperlihatkan nilai yang bisa Anda atur Status properti untuk mengontrol tindakan selanjutnya selama pembaruan.
| Kedudukan | 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 melemparkan pengecualian. |
Mengatur properti Status ke ErrorsOccurred menyebabkan pengecualian terjadi. Anda dapat mengontrol pengecualian mana yang dilemparkan dengan mengatur Errors properti ke pengecualian yang diinginkan. Menggunakan salah satu nilai lain untuk Status mencegah pengecualian dilemparkan.
Anda juga dapat menggunakan ContinueUpdateOnError properti untuk menangani kesalahan untuk baris yang diperbarui. Jika DataAdapter.ContinueUpdateOnError adalah true, ketika pembaruan ke baris menghasilkan pengecualian yang dilemparkan, teks pengecualian ditempatkan ke dalam RowError informasi baris tertentu, dan pemrosesan berlanjut tanpa melemparkan pengecualian. Ini memungkinkan Anda merespons kesalahan ketika Update selesai, berbeda dengan kejadian RowUpdated, yang mengizinkan Anda merespons kesalahan ketika kesalahan ditemukan.
Sampel kode berikut menunjukkan cara menambahkan dan menghapus penanganan aktivitas. Penangan kejadian RowUpdating menulis log semua catatan yang dihapus beserta stempel waktu. Penanganan kejadian RowUpdated menambahkan informasi kesalahan ke properti RowError dari baris di DataSet, menekan pengecualian, dan terus memproses (mencerminkan perilaku ContinueUpdateOnError = true).
' Assumes that connection is a valid SqlConnection object.
Dim custAdapter As SqlDataAdapter = New SqlDataAdapter( _
"SELECT CustomerID, CompanyName FROM Customers", connection)
' Add handlers.
AddHandler custAdapter.RowUpdating, New SqlRowUpdatingEventHandler( _
AddressOf OnRowUpdating)
AddHandler custAdapter.RowUpdated, New SqlRowUpdatedEventHandler(
AddressOf OnRowUpdated)
' Set DataAdapter command properties, fill DataSet, and modify DataSet.
custAdapter.Update(custDS, "Customers")
' Remove handlers.
RemoveHandler custAdapter.RowUpdating, _
New SqlRowUpdatingEventHandler(AddressOf OnRowUpdating)
RemoveHandler custAdapter.RowUpdated, _
New SqlRowUpdatedEventHandler(AddressOf OnRowUpdated)
Private Shared Sub OnRowUpdating(sender As Object, _
args As SqlRowUpdatingEventArgs)
If args.StatementType = StatementType.Delete Then
Dim tw As System.IO.TextWriter = _
System.IO.File.AppendText("Deletes.log")
tw.WriteLine( _
"{0}: Customer {1} Deleted.", DateTime.Now, args.Row(_
"CustomerID", DataRowVersion.Original))
tw.Close()
End If
End Sub
Private Shared Sub OnRowUpdated( _
sender As Object, args As SqlRowUpdatedEventArgs)
If args.Status = UpdateStatus.ErrorsOccurred
args.Status = UpdateStatus.SkipCurrentRow
args.Row.RowError = args.Errors.Message
End If
End Sub
// Assumes that connection is a valid SqlConnection object.
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);
protected static void OnRowUpdating(
object sender, SqlRowUpdatingEventArgs args)
{
if (args.StatementType == StatementType.Delete)
{
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)
{
args.Row.RowError = args.Errors.Message;
args.Status = UpdateStatus.SkipCurrentRow;
}
}
FillError
DataAdapter mengeluarkan 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 Framework tanpa kehilangan presisi.
Jika terjadi kesalahan selama Fill operasi, baris saat ini tidak ditambahkan ke DataTable. Peristiwa FillError memungkinkan Anda mengatasi kesalahan dan menambahkan baris, atau mengabaikan baris yang dikecualikan dan melanjutkan operasi Fill.
Acara FillErrorEventArgs yang FillError diteruskan dapat berisi beberapa properti yang memungkinkan Anda merespons dan mengatasi kesalahan. Tabel berikut ini memperlihatkan properti FillErrorEventArgs objek.
| Harta benda | Deskripsi |
|---|---|
Errors |
Yang Exception terjadi. |
DataTable |
Objek DataTable sedang diisi ketika kesalahan terjadi. |
Values |
Array objek yang berisi nilai baris yang ditambahkan saat kesalahan terjadi. Referensi penanda urutan dari array Values sesuai dengan penanda urutan dari kolom-kolom baris yang sedang ditambahkan. Misalnya, Values[0] adalah nilai yang ditambahkan sebagai kolom pertama baris. |
Continue |
Memungkinkan Anda memilih apakah akan memberikan pengecualian atau tidak. Mengatur properti Continue ke false akan menghentikan operasi saat ini Fill, dan pengecualian akan dikeluarkan. Pengaturan Continue untuk true melanjutkan Fill operasi meskipun terjadi kesalahan. |
Contoh kode berikut menambahkan penanganan aktivitas untuk FillError peristiwa DataAdapter.
FillError Dalam kode peristiwa, contoh menentukan apakah ada potensi kehilangan presisi, memberikan kesempatan untuk menanggapi pengecualian.
AddHandler adapter.FillError, New FillErrorEventHandler( _
AddressOf FillError)
Dim dataSet As DataSet = New DataSet
adapter.Fill(dataSet, "ThisTable")
Private Shared Sub FillError(sender As Object, _
args As FillErrorEventArgs)
If args.Errors.GetType() Is Type.GetType("System.OverflowException") Then
' 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
End If
End Sub
adapter.FillError += new FillErrorEventHandler(FillError);
DataSet dataSet = new DataSet();
adapter.Fill(dataSet, "ThisTable");
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;
}
}
Lihat juga
- DataAdapters dan DataReaders
- Menangani Peristiwa Himpunan Data
- Menangani Peristiwa DataTable
- Peristiwa
- Gambaran Umum ADO.NET