FillError
Событие генерируется при возникновении ошибки в методе Fill
.
Событие FillError позволяет пользователю указать клиентскому приложению, должна ли операция заполнения объекта данными продолжаться после возникновения ошибки. Событие FillError может произойти, например, в следующих случаях:
-
данные, добавляемые в DataSet, не могут быть преобразованы в тип данных среды CLR без потери точности;
-
добавляемая строка содержит данные, нарушающие ограничение целостности, которое должно быть применено к DataColumn в DataSet.
Наиболее часто событие FillError генерируется в процессе добавления данных в объект DataSet
с нарушением целостности, например, когда добавляемые данные не могут быть приведены к типу данных ADO.NET-провайдера без потери точности.
При возникновении FillError-события текущая строка не добавляется в объект DataTable
. Обработчик события FillError позволяет обработать эту ситуацию, и строка будет либо добавлена в DataTable
, либо проигнорирована методом Fill
() перед выполнением операции со следующей строкой.
Обработчик FillError-события получает аргумент FillErrorEventArgs, который содержит специальные данные о событии, и которые позволяют эффективно обработать это событие. Свойство Continue аргумента FillErrorEventArgs определяет, должно ли исключение игнорироваться или должно быть обработано как ошибка.
Синтаксис
public class FillErrorEventArgs : EventArgs;
Свойства аргумента FillErrorEventArgs (значения EventArgs):
-
Errors – тип события (исключение Exception);
-
DataTable – имя объекта DataTable, в котором возникла ошибка;
-
Values – массив объектов со значениями строки, при добавлении которой возникла ошибка. Нумерация элементов массива Values соответствует нумерации столбцов добавляемой строки. Например, Values[0] – значение, добавляемое как первый столбец строки;
-
Continue – реакция на событие. Если свойство Continue имеет значение false, текущая операция
Fill
будет остановлена с вызовом исключения. Если свойство Continue имеет значение true, то исключение (ошибка) будет проигнорировано и операцияFill
будет продолжена.
Примеры
1) Пример обработчика событий для загружаемой таблицы из трех столбцов.
SqlDataAdapter da; // ... code to set up the data adapter da.FillError += new FillErrorEventHandler(da_FillError); DataSet ds = new DataSet(); da.Fill(ds, "MyTable"); private void da_FillError(object sender, FillErrorEventArgs e) { // ... code to identify and correct the error // add the fixed row to the table DataRow dr = e.DataTable.Rows.Add(new object[] {e.Values[0], e.Values[1], e.Values[2]}); // continue the Fill with the rows remaining in the data source e.Continue = true; }
2) В примере добавляется обработчик события для события FillError класса DataAdapter
, выявляется потенциальная потеря точности и предоставляется возможность выполнить определенные действия в ответ на исключение.
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. args.RowError = "OverflowException Encountered. Value from data source: " + args.Values[2]; args.Continue = true; } }
3)
… Friend Function Load(ByVal strSQL As String, ByRef DataSet As System.Data.DataSet, Optional ByVal strTableName As String = "") As Boolean Implements IBackendDataProvider.Load DbCommand =System.Data.SqlClient.DbCommand Adapter = New System.Data.SqlClient.DbDataAdapter DoWeClose Boolean If Parent.ConnectionString.Length < > 0 Then DoWeClose = Parent.OpenConditional() If (DataSet Is Nothing) Then DataSet = New System.Data.DataSet End If DbCommand = GetSQLCommandObject(strSQL) DbCommand.CommandTimeout = Parent.CommandTimeout Adapter = New System.Data.SqlClient.DbDaAdapter(DbCommand) AddHandler Adapter.FillError, AddressOf FillError Try If strTableName.Length < > 0 Then Adapter.Fill(DataSet, strTableName) Else Adapter.Fill(DataSet) ' FAILS HERE - HIGHLIGHTED GREEN WITH ERROR ABOVE End If Catch Throw End Try RemoveHandler Adapter.FillError, AddressOf FillError Adapter = Nothing DbCommand.Dispose() DbCommand = Nothing Parent.CloseConditional(DoWeClose) End If End Function