Megosztás a következőn keresztül:


DataAdapter-események kezelése

A ADO.NET DataAdapter három eseményt tesz elérhetővé, amelyekkel reagálhat az adatforrás adatainak változásaira. Az alábbi táblázat az eseményeket DataAdapter mutatja be.

Esemény Leírás
RowUpdating Egy sor frissítési, IN Standard kiadás RT- vagy DELETE-művelete (az Update egyik metódus hívásával) megkezdődik.
RowUpdated Egy sor FRISSÍTÉS, IN Standard kiadás RT vagy DELETE művelete (az Update egyik metódus hívásával) befejeződött.
FillError Hiba történt egy Fill művelet során.

RowUpdating és RowUpdated

RowUpdating a rendszer az adatforrásban végzett feldolgozás után egy sorra DataSet történő frissítés előtt aktiválódik. RowUpdated a rendszer az adatforrásban végzett feldolgozás során DataSet egy sorra történő frissítés után jön létre. Ennek eredményeképpen RowUpdating módosíthatja a frissítési viselkedést, hogy a frissítés bekövetkezésekor további kezelést biztosítson, hogy megőrizze a frissített sorra mutató hivatkozást, megszakítsa az aktuális frissítést, és ütemezze egy kötegelt folyamat későbbi feldolgozására, és így tovább. RowUpdated a frissítés során előforduló hibákra és kivételekre való válaszadáshoz hasznos. A hibainformációkat hozzáadhatja a DataSet, valamint újrapróbálkozás logikához stb.

RowUpdatedEventArgs Az RowUpdatingEventArgs és az RowUpdatingRowUpdated eseményeknek átadott argumentumok a következők: a Command frissítés végrehajtásához használt objektumra hivatkozó Command tulajdonság; a Row frissített információkat tartalmazó objektumra hivatkozó DataRow tulajdonság; StatementType a frissítés típusának tulajdonsága; a TableMappingművelet , ha van, és a Status művelet.

A tulajdonság segítségével Status megállapíthatja, hogy hiba történt-e a művelet során, és szükség esetén szabályozhatja a műveleteket az aktuális és az eredményként kapott sorokon. Az esemény bekövetkezésekor a Status tulajdonság értéke vagy ContinueErrorsOccurred. Az alábbi táblázat azokat az értékeket mutatja be, amelyekre beállíthatja a Status tulajdonságot a későbbi műveletek szabályozásához a frissítés során.

Állapot Leírás
Continue Folytassa a frissítési műveletet.
ErrorsOccurred Megszakítja a frissítési műveletet, és kivételt jelez.
SkipCurrentRow Hagyja figyelmen kívül az aktuális sort, és folytassa a frissítési műveletet.
SkipAllRemainingRows Megszakítja a frissítési műveletet, de ne adjon kivételt.

Ha a tulajdonságot úgy Status állítja be, hogy ErrorsOccurred kivételt okoz, akkor kivételt okoz. A tulajdonság kívánt kivételre állításával Errors szabályozhatja, hogy melyik kivételt okozza. Ha a többi érték egyikét használja a kivétel kiesésének megakadályozása érdekében Status .

A tulajdonságot a ContinueUpdateOnError frissített sorok hibáinak kezelésére is használhatja. Ha DataAdapter.ContinueUpdateOnError egy truesor frissítése kivételt eredményez, a rendszer a kivétel szövegét az adott sor információiba RowError helyezi, és a feldolgozás kivétel nélkül folytatódik. Ez lehetővé teszi a hibákra való válaszadást, ha a Update hiba befejeződött, ellentétben az RowUpdated eseménysel, amely lehetővé teszi a hibákra való válaszadást a hiba észlelésekor.

Az alábbi kódminta bemutatja, hogyan vehet fel és távolíthat el eseménykezelőket. Az RowUpdating eseménykezelő az összes törölt rekord naplóját időbélyeggel írja. Az RowUpdated eseménykezelő hibainformációkat ad hozzá a RowError sor tulajdonságához, DataSetletiltja a kivételt, és folytatja a feldolgozást (tükrözve a viselkedését 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

Az DataAdapter eseményt a FillError művelet során Fill fellépő hiba okozza. Ez a hibatípus általában akkor fordul elő, ha a hozzáadott sor adatai nem konvertálhatók .NET-keretrendszer típussá némi pontosságvesztés nélkül.

Ha egy művelet során Fill hiba történik, az aktuális sor nem lesz hozzáadva a DataTable. Az FillError esemény lehetővé teszi a hiba megoldását és a sor hozzáadását, vagy figyelmen kívül hagyhatja a kizárt sort, és folytathatja a Fill műveletet.

Az FillErrorEventArgs eseménynek FillError átadott tulajdonságok számos olyan tulajdonságot tartalmazhatnak, amelyek lehetővé teszik a hibák megválaszolásához és megoldásához. Az alábbi táblázat az objektum tulajdonságait FillErrorEventArgs mutatja be.

Tulajdonság Leírás
Errors Az Exception történt.
DataTable A DataTable hiba bekövetkezésekor kitöltődő objektum.
Values Objektumtömb, amely a hiba bekövetkezésekor hozzáadott sor értékeit tartalmazza. A tömb sorszámhivatkozásai a Values hozzáadandó sor oszlopainak sorszámhivatkozásainak felelnek meg. Például az az érték, Values[0] amely a sor első oszlopaként lett hozzáadva.
Continue Lehetővé teszi, hogy eldöntse, hogy kivételt szeretne-e tenni. Ha úgy állítja be a Continue tulajdonságot, hogy false leállítja az aktuális Fill műveletet, a rendszer kivételt küld. A hiba ellenére a true művelet folytatásának Fill beállításaContinue.

Az alábbi példakód egy eseménykezelőt ad hozzá az FillErrorDataAdaptereseményhez. Az eseménykódban a FillError példa meghatározza, hogy fennáll-e a pontossági veszteség lehetősége, és lehetővé teszi a kivételre való reagálást.

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

Lásd még