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