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 RowUpdating
RowUpdated
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 TableMapping
mű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 Continue
ErrorsOccurred
. 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 true
sor 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, DataSet
letiltja 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 FillError
DataAdapter
esemé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;
}
}