Aracılığıyla paylaş


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 DataAdapter olaylar gösterilmektedir.

Etkinlik 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 DataSet'den bir satıra yapılan herhangi bir güncelleme işlenmeden önce tetiklenir. 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. DataSet ekleyerek hata bilgileri, yeniden deneme mantığı vb. ekleyebilirsiniz.

RowUpdatingEventArgs ve RowUpdatedEventArgs bağımsız değişkenleri, RowUpdating ve RowUpdated olaylarına şu şekilde geçirilir: güncelleme işlemini gerçekleştirmek için kullanılan Command nesnesine referans veren bir Command özelliği; güncellenmiş bilgileri içeren Row nesnesine referans veren bir DataRow özelliği; gerçekleştirilen güncellemenin türüne yönelik bir StatementType özelliği; varsa TableMapping, ve işlemin Status ö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 Status özelliği ya Continue ya da ErrorsOccurred değerine eşit olur. Aşağıdaki tabloda, güncelleştirme sırasında sonraki eylemleri denetlemek için özelliğini ayarlayabileceğiniz Status değerler gösterilmektedir.

Statü Açıklama
Continue Güncelleştirme işlemine devam edin.
ErrorsOccurred Güncelleştirme işlemini durdurun ve bir istisna oluşturun.
SkipCurrentRow Şu anki satırı yoksayın ve güncelleme işlemine devam edin.
SkipAllRemainingRows Güncelleştirme işlemini durdurun, ancak özel durum oluşturmayın.

Status özelliğini ErrorsOccurred olarak ayarlamak bir istisna oluşturmasına neden olur. İstisna olarak oluşturmak istediğiniz özel durumu "Errors" özelliğini ayarlayarak denetleyebilirsiniz. Status için diğer değerlerden birinin kullanılması bir istisnanın oluşmasını önler.

Güncelleştirilmiş satırlara yönelik ContinueUpdateOnError hataları işlemek için özelliğini de kullanabilirsiniz. Eğer DataAdapter.ContinueUpdateOnErrortrue ise, bir satıra yapılan güncelleştirme bir özel durumun fırlatılmasına neden olduğunda, özel durumun metni belirli bir satırın RowError bilgilerine yerleştirilir ve işlem özel durum fırlatılmadan devam eder. Bu, hata ile karşılaşıldığında hatalara yanıt vermenizi sağlayan Update olayının aksine, RowUpdated tamamlandıktan 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 RowError özelliğine hata bilgileri ekler, istisnayı bastırır ve DataSetContinueUpdateOnError = davranışını yansıtma şeklinde işlemeye devam eder.

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

DoldurmaHatası

DataAdapter işlem sırasında bir hata oluştuğunda FillError olayını yayınlar. Bu tür bir hata genellikle, satıra eklenen verilerin kesinlik kaybı olmadan bir .NET Framework türüne dönüştürülemediğinde oluşur.

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

FillErrorEventArgs iletilen FillError olayına, hatalara yanıt vermenize ve çözmenize olanak tanıyan çeşitli özellikler dahil edilebilir. Aşağıdaki tabloda nesnenin özellikleri gösterilmektedir FillErrorEventArgs .

Mülkiyet Açıklama
Errors Meydana gelen Exception.
DataTable Hata meydana geldiğinde doldurulmakta olan DataTable nesne.
Values Hata oluştuğunda eklenen satırın değerlerini içeren bir nesne dizisi. Dizinin sıralı Values referansları, eklenen satırın sütunlarının sıralı referanslarına karşılık gelir. Örneğin, Values[0] satırın ilk sütunu olarak eklenen değerdir.
Continue İstisna fırlatıp fırlatmama seçeneğini size sunar. özelliğinin Continue olarak false ayarlanması geçerli Fill işlemi durdurur ve bir özel durum oluşturulur. Continuetrue olarak ayarlamak, hatalara rağmen Fill işlemini devam ettirir.

Aşağıdaki kod örneği, FillError etkinliği için DataAdapter bir olay işleyicisi ekler. 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 bakınız