DataAdapter Olaylarını İşleme

ADO.NET DataAdapter , veri kaynağındaki verilerde yapılan değişikliklere yanıt vermek için kullanabileceğiniz üç olayı kullanıma sunar. Aşağıdaki tabloda olaylar gösterilmektedir DataAdapter .

Olay Açıklama
RowUpdating Bir satırdaki UPDATE, INSERT veya DELETE işlemi (yöntemlerden birine Update yapılan bir çağrıyla) başlamak üzeredir.
RowUpdated Bir satırdaki UPDATE, INSERT veya DELETE işlemi (yöntemlerden birine Update yapılan bir çağrıyla) tamamlanır.
FillError İşlem sırasında bir Fill hata oluştu.

RowUpdating ve RowUpdated

RowUpdating veri kaynağında bir satıra yapılan herhangi bir güncelleştirme işlenmeden DataSet önce oluşturulur. RowUpdated , veri kaynağında DataSet bir satıra yapılan herhangi bir güncelleştirme işlendikten sonra oluşturulur. Sonuç olarak, güncelleştirme davranışını gerçekleşmeden önce değiştirmek, güncelleştirme gerçekleştiğinde ek işleme sağlamak, güncelleştirilmiş bir satıra başvuruyu korumak, geçerli güncelleştirmeyi iptal etmek ve daha sonra işlenecek bir toplu işlem için zamanlamak vb. için kullanabilirsiniz RowUpdating . RowUpdated güncelleştirme sırasında oluşan hatalara ve özel durumlara yanıt vermek için kullanışlıdır. hata bilgilerini eklemenin DataSetyanı sıra yeniden deneme mantığı vb. ekleyebilirsiniz.

RowUpdatingEventArgs ve olaylarına RowUpdating geçirilen ve RowUpdatedRowUpdatedEventArgs bağımsız değişkenleri şunlardır: güncelleştirmeyi gerçekleştirmek için kullanılan nesneye başvuran Command bir Command özellik; güncelleştirilmiş bilgileri içeren nesneye başvuran DataRow bir Row özellik; gerçekleştirilmekte olan güncelleştirme türüne yönelik bir StatementType özellik; TableMappingvarsa, ve Status işleminin özelliği.

özelliğini kullanarak Status işlem sırasında bir hata oluşup oluşmadığını belirleyebilir ve isterseniz eylemleri geçerli ve sonuçta elde edilen satırlara karşı denetleyebilirsiniz. Olay gerçekleştiğinde özelliği Status veya ErrorsOccurreddeğerine eşit olurContinue. Aşağıdaki tabloda, güncelleştirme sırasında sonraki eylemleri denetlemek için özelliğini ayarlayabileceğiniz Status değerler gösterilmektedir.

Çalıştırma Durumu Açıklama
Continue Güncelleştirme işlemine devam edin.
ErrorsOccurred Güncelleştirme işlemini durdurun ve bir özel durum atın.
SkipCurrentRow Geçerli satırı yoksayın ve güncelleştirme işlemine devam edin.
SkipAllRemainingRows Güncelleştirme işlemini durdurun, ancak özel durum oluşturmayın.

özelliğinin Status olarak ErrorsOccurred ayarlanması bir özel durum oluşturmasına neden olur. Özelliği istenen özel duruma ayarlayarak hangi özel durumun oluşturulduğunı Errors denetleyebilirsiniz. için Status diğer değerlerden birinin kullanılması özel durumun oluşmasını önler.

Güncelleştirilmiş satırlara yönelik ContinueUpdateOnError hataları işlemek için özelliğini de kullanabilirsiniz. ise DataAdapter.ContinueUpdateOnErrortrue, bir satıra yapılan güncelleştirme özel durum oluştuğunda, özel durumun metni belirli bir satırın bilgilerine RowError yerleştirilir ve işleme özel durum oluşturmadan devam eder. Bu, hatayla karşılaşıldığında hatalara yanıt vermenizi sağlayan olayın aksineRowUpdated, tamamlandıktan Update sonra hatalara yanıt vermenizi sağlar.

Aşağıdaki kod örneği, olay işleyicilerinin nasıl ekleneceğini ve kaldırılacağını gösterir. Olay işleyicisi RowUpdating , silinen tüm kayıtların bir günlüğünü zaman damgasıyla yazar. Olay işleyicisi RowUpdated içindeki satırın RowErrorDataSetözelliğine hata bilgileri ekler, özel durumu gizler ve işlemeye devam eder (davranışını ContinueUpdateOnError = trueyansıtma).

' 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

İşlem DataAdapter sırasında Fill bir hata oluştuğunda olayı sorunlarFillError. Bu tür bir hata genellikle, eklenen satırdaki veriler duyarlık kaybı olmadan bir .NET Framework türüne dönüştürülemediğinde oluşur.

İşlem sırasında Fill bir hata oluşursa, geçerli satır öğesine DataTableeklenmez. Olay, FillError hatayı düzeltmenize ve satırı eklemenize veya dışlanan satırı yoksayıp işleme devam Fill etmenizi sağlar.

Olaya FillErrorEventArgs geçirilen FillError , hataları yanıtlamanıza ve çözmenize olanak tanıyan çeşitli özellikler içerebilir. Aşağıdaki tabloda nesnenin özellikleri gösterilmektedir FillErrorEventArgs .

Özellik Açıklama
Errors Oluşan Exception .
DataTable Hata DataTable oluştuğunda doldurulan nesne.
Values Hata oluştuğunda eklenen satırın değerlerini içeren bir nesne dizisi. Dizinin sıralı Values başvuruları, eklenen satırın sütunlarının sıralı başvurularına karşılık gelir. Örneğin, Values[0] satırın ilk sütunu olarak eklenen değerdir.
Continue Özel durum oluşturup oluşturmayabileceğinizi seçmenize olanak tanır. özelliğinin Continue olarak false ayarlanması geçerli Fill işlemi durdurur ve bir özel durum oluşturulur. ayarı Continue hataya true rağmen işleme devam eder Fill .

Aşağıdaki kod örneği, olayı için FillError bir olay işleyicisi DataAdapterekler. Olay kodunda FillError örnek, özel duruma yanıt verme fırsatı sağlayarak duyarlık kaybı olasılığı olup olmadığını belirler.

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;  
  }  
}  

Ayrıca bkz.