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