Partilhar via


Manipular eventos do DataAdapter

Aplica-se a: .NET Framework .NET .NET Standard

Baixar ADO.NET

O fornecedor de dados Microsoft SqlClient para SQL Server SqlDataAdapter expõe três eventos que pode usar para responder a alterações feitas aos dados na fonte de dados. A tabela seguinte mostra os DataAdapter eventos.

Event Description
RowUpdating Está prestes a começar uma operação de ATUALIZAÇÃO, INSERÇÃO ou ELIMINAÇÃO numa linha (através de uma chamada a um dos Update métodos).
RowUpdated Uma operação UPDATE, INSERT ou DELETE numa linha (através de uma chamada a um dos métodos Update) está concluída.
FillError Ocorreu um erro durante uma Fill operação.

Eventos RowUpdating e RowUpdated

RowUpdating é acionado antes de qualquer atualização de uma linha de DataSet ser processada na fonte de dados. RowUpdated é acionado após qualquer atualização de uma linha da DataSet ter sido processada na fonte de dados. Como resultado, pode usar RowUpdating para modificar o comportamento das atualizações antes que aconteça, fornecer tratamento adicional quando uma atualização vai ocorrer, manter uma referência a uma linha atualizada, cancelar a atualização atual e agenda-la para um processamento em lote mais tarde, e assim sucessivamente. RowUpdated é útil para responder a erros e exceções que ocorram durante a atualização. Podes adicionar informação de erro ao DataSet, assim como lógica de nova tentativa, entre outros.

Os argumentos RowUpdatingEventArgs e RowUpdatedEventArgs passados aos eventos RowUpdating e RowUpdated incluem o seguinte: uma propriedade Command que faz referência ao objeto Command utilizado para realizar a atualização; uma propriedade Row que faz referência ao objeto DataRow que contém a informação atualizada; uma propriedade StatementType para o tipo de atualização que está a ser realizada; o TableMapping, se aplicável; e o Status da operação.

Pode usar esta Status propriedade para determinar se ocorreu um erro durante a operação e, se desejar, para controlar as ações contra as linhas atuais e resultantes. Quando o evento ocorre, a Status propriedade é igual a Continue ou ErrorsOccurred. A tabela seguinte mostra os valores para os quais pode definir a Status propriedade para controlar ações posteriores durante a atualização.

Situação Description
Continue Continuar a operação de atualização.
ErrorsOccurred Abortar a operação de atualização e lançar uma exceção.
SkipCurrentRow Ignora a linha atual e continua a operação de atualização.
SkipAllRemainingRows Abortar a operação de atualização, sem lançar nenhuma exceção.

Definir a Status propriedade para ErrorsOccurred faz com que seja lançada uma exceção. Pode controlar qual exceção é lançada definindo a Errors propriedade para a exceção desejada. Usar um dos outros valores para Status evita que uma exceção seja lançada.

Também pode usar a propriedade ContinueUpdateOnError para tratar erros de linhas atualizadas. Se DataAdapter.ContinueUpdateOnError for true, quando uma atualização de uma linha resulta no lançamento de uma exceção, o texto da exceção é colocado na RowError informação da linha em questão, e o processamento continua sem lançar nenhuma exceção. Isto permite-lhe responder a erros quando o Update está concluído, em contraste com o evento RowUpdated, que lhe permite agir em relação aos erros quando o erro é detetado.

O exemplo de código seguinte mostra como adicionar e remover gestores de eventos. O RowUpdating gestor de eventos escreve um registo de todos os registos eliminados com um carimbo temporal. O RowUpdated manipulador de eventos adiciona a informação de erro à propriedade RowError da linha do DataSet, suprime a exceção e continua o processamento (espelhando o comportamento 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;
    }
}

Evento FillError

DataAdapter emite o evento FillError quando ocorre um erro durante a operação Fill. Este tipo de erro ocorre frequentemente quando os dados na linha a ser adicionada não podem ser convertidos para um tipo .NET sem alguma perda de precisão.

Se ocorrer um erro durante uma Fill operação, a linha atual não é adicionada ao DataTable. O FillError evento permite-lhe resolver o erro e adicionar a linha, ou ignorar a linha excluída e continuar a Fill operação.

O FillErrorEventArgs passado para o evento FillError pode conter várias propriedades que permitem responder e resolver erros. A tabela seguinte mostra as propriedades do FillErrorEventArgs objeto.

Propriedade Description
Errors O Exception que ocorreu.
DataTable O objeto DataTable estava preenchido quando o erro ocorreu.
Values Um array de objetos que contém os valores da linha adicionada quando o erro ocorreu. As referências ordinais do Values array correspondem às referências ordinais das colunas da linha que está a ser adicionada. Por exemplo, Values[0] é o valor que estava a ser adicionado como a primeira coluna da linha.
Continue Permite-te escolher se queres ou não lançar uma exceção. Definir a propriedade Continue como false interromperá a operação atual Fill e uma exceção será lançada. Definir Continue para true continua a operação Fill após o erro.

O seguinte exemplo de código adiciona um handler de eventos para o FillError evento do DataAdapter. No FillError código do evento, o exemplo determina se existe potencial para perda de precisão, proporcionando a oportunidade de responder à exceção.

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 também