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 DataSet
yanı sıra yeniden deneme mantığı vb. ekleyebilirsiniz.
RowUpdatingEventArgs ve olaylarına RowUpdating
geçirilen ve RowUpdated
RowUpdatedEventArgs 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; TableMapping
varsa, 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 ErrorsOccurred
değ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.ContinueUpdateOnError
true
, 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 RowError
DataSet
özelliğine hata bilgileri ekler, özel durumu gizler ve işlemeye devam eder (davranışını ContinueUpdateOnError
= true
yansı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 DataTable
eklenmez. 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 DataAdapter
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;
}
}