Bagikan melalui


Menangani Peristiwa DataAdapter

ADO.NET DataAdapter mengekspos 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.

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).

' 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

Masalah DataAdapterdari 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 beberapa 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.

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