Compartir a través de


Control de eventos de objetos DataAdapter

Se aplica a: .NET Framework .NET .NET Standard

Descargar ADO.NET

El proveedor de datos SqlClient de Microsoft para SQL Server SqlDataAdapter expone tres eventos que puede usar para responder a los cambios realizados en los datos en el origen de datos. En la siguiente tabla se muestran los eventos de DataAdapter.

Evento Descripción
RowUpdating Está a punto de comenzar una operación UPDATE, INSERT o DELETE en una fila (mediante una llamada a uno de los métodos Update).
RowUpdated Se ha completado una operación UPDATE, INSERT o DELETE en una fila (mediante una llamada a uno de los métodos Update).
FillError Se ha producido un error durante una operación Fill.

Eventos RowUpdating y RowUpdated

El evento RowUpdating se activa antes de que se produzca la actualización de una fila del DataSet en el origen de datos. El evento RowUpdated se activa después de que se produzca la actualización de una fila del DataSet en el origen de datos. Por lo tanto, puede utilizar RowUpdating para modificar el comportamiento de la actualización antes de que tenga lugar, proporcionar un control adicional del proceso durante la actualización, conservar una referencia a la fila actualizada, cancelar la actualización actual y programarla como parte de un proceso por lotes que se ejecutará después, entre otras acciones. RowUpdated es útil para reaccionar cuando se producen errores y excepciones durante la actualización. Puede agregar información de error a DataSet, así como lógica de reintento, etc.

Los argumentos RowUpdatingEventArgs y RowUpdatedEventArgs que se pasan a los eventos RowUpdating y RowUpdated incluyen lo siguiente: una propiedad Command que hace referencia al objeto Command que se está utilizando para realizar la actualización; una propiedad Row que hace referencia al objeto DataRow que contiene la información actualizada; una propiedad StatementType para el tipo de actualización que se está llevando a cabo; el valor de TableMapping, si es pertinente y el valor de Status de la operación.

Puede utilizar la propiedad Status para determinar si se ha producido o no un error durante la operación y, si lo desea, controlar las acciones que se emprenden en las filas actuales y las resultantes de la operación. Cuando se produce el evento, la propiedad Status toma el valor Continue o ErrorsOccurred. En la tabla siguiente se muestran los valores que se pueden asignar a la propiedad Status para controlar las acciones posteriores en el proceso de actualización.

Situación Descripción
Continue Continuar la operación de actualización.
ErrorsOccurred Anular la operación de actualización e iniciar una excepción.
SkipCurrentRow Omitir la fila actual y continuar la operación de actualización.
SkipAllRemainingRows Anular la operación de actualización sin iniciar una excepción.

Al establecer a la propiedad Status en el valor ErrorsOccurred se inicia una excepción. Puede controlar qué excepciones se inician si establece la propiedad Errors en la excepción que desee. El uso de un valor distinto para la propiedad Status evita que se inicie una excepción.

También puede utilizar la propiedad ContinueUpdateOnError para controlar los errores producidos en las filas actualizadas. Cuando DataAdapter.ContinueUpdateOnError tiene el valor true y la actualización de una fila inicia una excepción, el texto de la excepción se coloca en la información RowError de la fila en cuestión y el proceso continúa sin que se inicie una excepción. De esta forma, puede responder a los errores cuando se complete el proceso Update, a diferencia del evento RowUpdated, que permite responder a los errores cuando se detectan.

En el ejemplo de código siguiente se muestra cómo se pueden agregar y quitar controladores de eventos. El controlador de eventos RowUpdating mantiene un registro de todos los registros eliminados y una marca de tiempo asociada a cada uno de ellos. El controlador de eventos RowUpdated agrega información de error a la propiedad RowError de la fila en DataSet, suprime la excepción y deja continuar el procesamiento (similar al comportamiento de ContinueUpdateOnError = true).

static DataSet DataAdapterEventsDemo(SqlConnection connection, DataSet custDS)
{
    // Assumes that connection is a valid SqlConnection object 
    // and custDS includes the Customers table.
    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);

    return custDS;
}

protected static void OnRowUpdating(object sender, SqlRowUpdatingEventArgs args)
{
    if (args.StatementType == StatementType.Delete)
    {
        // Saves the removing rows with additional information in a file.
        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)
    {
        // Adds the error message to the row and skips from it.
        args.Row.RowError = args.Errors.Message;
        args.Status = UpdateStatus.SkipCurrentRow;
    }
}

FillError (evento)

Cuando se produce un error durante una operación DataAdapter, el objeto FillError provoca el evento Fill. Este tipo de error se suele producir cuando los datos de la fila que se agrega no se pueden convertir a un tipo de .NET sin cierta pérdida de precisión.

Si el error se produce durante una operación Fill, la fila actual no se agrega al objeto DataTable. El evento FillError permite resolver el error y agregar la fila o bien pasar por alto la fila excluida y continuar con la operación Fill.

El objeto FillErrorEventArgs que se pasa al evento FillError puede contener varias propiedades que permiten reaccionar en caso de errores y resolverlos. En la tabla siguiente se muestran las propiedades del objeto FillErrorEventArgs.

Propiedad Descripción
Errors Exception que se ha producido.
DataTable Objeto DataTable que se estaba llenando cuando ocurrió el error.
Values Matriz de objetos que contiene los valores de la fila que se está agregando cuando se produce el error. Las referencias de orden de la matriz Values coinciden con las de las columnas de la fila que se está agregando. Por ejemplo, Values[0] es el valor que se agrega en la primera columna de la fila.
Continue Permite elegir si desea iniciar una excepción o no. Si establece la propiedad Continue en false, la operación Fill en curso se detiene y se inicia una excepción. Si establece la propiedad Continue en true, la operación Fill continúa pese al error.

En el siguiente ejemplo de código se agrega un controlador para el evento FillError del objeto DataAdapter. En el código del evento FillError, el ejemplo determina si hay una posible pérdida de precisión y ofrece la posibilidad de reaccionar ante la excepción.

static DataSet DataAdapterFillAndError(SqlDataAdapter adapter)
{
    // Assuemes adapter is a valid SqlDataAdapter object.
    adapter.FillError += new FillErrorEventHandler(FillError);

    DataSet dataSet = new DataSet();
    adapter.Fill(dataSet);
    return dataSet;
}

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;
    }
}

Consulte también