Zpracování událostí adaptéru dat
ADO.NET DataAdapter zveřejňuje tři události, které můžete použít k reagování na změny dat provedených ve zdroji dat. V následující tabulce jsou uvedeny DataAdapter
události.
Událost | Popis |
---|---|
RowUpdating |
Chystá se začít operace UPDATE, INSERT nebo DELETE na řádku (voláním jedné z Update metod). |
RowUpdated |
Je dokončena operace UPDATE, INSERT nebo DELETE na řádku (voláním jedné z Update metod). |
FillError |
Během operace došlo k Fill chybě. |
RowUpdating and RowUpdated
RowUpdating
je vyvolána před jakoukoli aktualizací na řádek ze DataSet zdroje dat. RowUpdated
je vyvolána po každé aktualizaci řádku ze DataSet
zdroje dat. V důsledku toho můžete použít RowUpdating
ke změně chování aktualizace dříve, než k ní dojde, k zajištění dalšího zpracování při aktualizaci, k zachování odkazu na aktualizovaný řádek, zrušení aktuální aktualizace a naplánování zpracování dávkového procesu později atd. RowUpdated
je užitečné pro reagování na chyby a výjimky, ke kterým dochází během aktualizace. Do logiky DataSet
opakování můžete přidat informace o chybách a tak dále.
Argumenty RowUpdatingEventArgs předané RowUpdating
a RowUpdated
události zahrnují následující: Command
vlastnost, která odkazuje na Command
objekt použitý k provedení aktualizace; Row
vlastnost, která odkazuje na DataRow
objekt obsahující aktualizované informace; StatementType
vlastnost pro jaký typ aktualizace se provádí; , TableMapping
pokud je to možné; a Status
RowUpdatedEventArgs operace.
Pomocí vlastnosti můžete Status
určit, jestli během operace došlo k chybě, a v případě potřeby můžete řídit akce proti aktuálním a výsledným řádkům. Když dojde k události, Status
vlastnost se rovná buď Continue
nebo ErrorsOccurred
. Následující tabulka ukazuje hodnoty, na které můžete vlastnost nastavit Status
, aby bylo možné řídit pozdější akce během aktualizace.
Status | Popis |
---|---|
Continue |
Pokračujte v operaci aktualizace. |
ErrorsOccurred |
Přerušte operaci aktualizace a vyvoláte výjimku. |
SkipCurrentRow |
Ignorujte aktuální řádek a pokračujte v operaci aktualizace. |
SkipAllRemainingRows |
Přerušte operaci aktualizace, ale nevyvolejte výjimku. |
Status
Nastavení vlastnosti tak, aby ErrorsOccurred
byla vyvolán výjimka. Můžete určit, která výjimka je vyvolán nastavením Errors
vlastnosti na požadovanou výjimku. Použití jedné z ostatních hodnot pro Status
prevenci vyvolání výjimky.
Vlastnost můžete také použít ContinueUpdateOnError
ke zpracování chyb pro aktualizované řádky. Pokud DataAdapter.ContinueUpdateOnError
ano true
, při aktualizaci na řádek dojde k vyvolání výjimky, text výjimky se umístí do RowError
informací konkrétního řádku a zpracování pokračuje bez vyvolání výjimky. To vám umožní reagovat na chyby po Update
dokončení, na rozdíl od RowUpdated
události, která umožňuje reagovat na chyby, když dojde k chybě.
Následující ukázka kódu ukazuje, jak přidat a odebrat obslužné rutiny událostí. Obslužná rutina RowUpdating
události zapíše protokol všech odstraněných záznamů s časovým razítkem. Obslužná rutina RowUpdated
události přidá do RowError
vlastnosti řádku v DataSet
řádku potlačuje výjimku a pokračuje ve zpracování (zrcadlení chování = 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
Problémy DataAdapter
s událostí FillError
, když dojde k chybě během Fill
operace. K tomuto typu chyby obvykle dochází, když data v řádku, který se přidává, nelze převést na typ rozhraní .NET Framework bez ztráty přesnosti.
Pokud během operace dojde k Fill
chybě, aktuální řádek není přidán do objektu DataTable
. Tato FillError
událost umožňuje vyřešit chybu a přidat řádek nebo ignorovat vyloučený řádek a pokračovat v Fill
operaci.
Předání FillErrorEventArgs
události FillError
může obsahovat několik vlastností, které umožňují reagovat na chyby a vyřešit je. Následující tabulka ukazuje vlastnosti objektu FillErrorEventArgs
.
Vlastnost | Popis |
---|---|
Errors |
Došlo Exception k tomu. |
DataTable |
Objekt DataTable , který se vyplní, když došlo k chybě. |
Values |
Pole objektů, které obsahuje hodnoty řádku, které se přidají při výskytu chyby. Pořadové odkazy pole Values odpovídají pořadovým odkazům sloupců přidaných řádků. Jedná se například Values[0] o hodnotu, která se přidala jako první sloupec řádku. |
Continue |
Umožňuje zvolit, jestli chcete vyvolat výjimku nebo ne. Continue Nastavení vlastnosti na false zastavení aktuální Fill operace a vyvolá se výjimka. Nastavení Continue pro true pokračování Fill operace bez ohledu na chybu. |
Následující příklad kódu přidá obslužnou rutinu události pro FillError
událost události DataAdapter
. FillError
V kódu události příklad určuje, zda existuje potenciál pro ztrátu přesnosti, a poskytuje příležitost reagovat na výjimku.
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;
}
}