VB.NET - Tratando eventos DataAdapter


O objeto DataAdapter da ADO.NET expõe três eventos que podemos usar para responder a alterações feitas nos dados de uma fonte de dados. São eles :

Evento Descrição
RowUpdating Uma operação de UPDATE, DELETE ou INSERT em uma linha esta prestes a ser inicada
RowUpdated Uma operação de UPDATE, DELETE ou INSERT em uma linha foi completada
FillError Ocorreu um erro durante a operação de Preenchimento (Fill).

RoWUpdating e RowUpdated

RowUpdating é disparado antes que qualquer atualização de uma linha de um DataSet seja processada na fonte de dados.

RowUpdated é disparado depois que qualquer atualização de uma linha de um DataSet seja processado.

Você pode usar RowUpdating para modificar o comportamento da atualização antes que ela aconteça , fornecendo um tratamento adicional quando  a atualização for ocorrer, retendo a referência para uma linha atualizada, cancelando a atualização atual e agendando-a para um processo em lote posterior.

RowUpdated é útil para responder a erros e exceções que ocorrem durante a atualização . Você pode incluir uma informação de erro para o  DataSet.

Os argumentos RowUpdatingEventArgs e RowUpdatedEventArgs passados para os eventos RowUpdating e RowUpdated incluem :

A propriedade Status pode ser usada para determinar se um erro ocorreu durante a operação e , se você quiser, controlar as ações sobre o as linhas atuais. Quando o evento ocorre, a propriedade Status poderá ter um dos seguintes valores:

Além disto você pode usar a propriedade ContinueUpdateError para manipular erros para linhas atualizadas. Se DataAdapter.ContinueUpdateOnError for igual a True  quando uma atualização em uma linha resultar em um exceção sendo lançada o texto da exceção é colocado na informação RowError para uma linha particular e o processamento continuar sem lançar a exceção.

Abaixo temos um código de exemplo que mostra como usar os eventos. O evento RowUpdating escreve um logo de todos os registros excluídos com o timestamp. A RowUpdated inclui informação de erro para a propriedade RowError da linha no DataSet,  suprime a exceção e continua o processamento.(Usamos DataAdapter.ContinueUpdateOnError

Dim custDA As SqlDataAdapter = New SqlDataAdapter("SELECT CustomerID, CompanyName FROM Customers", nwindConn)

' inclui manipuladors.
AddHandler custDA.RowUpdating, New SqlRowUpdatingEventHandler(AddressOf OnRowUpdating)
AddHandler custDA.RowUpdated, New SqlRowUpdatedEventHandler(AddressOf OnRowUpdated)

' Define as propriedades do comando para o DataAdapter, preenche e modifica o DataSet
custDA.Update(custDS, "Customers")

' Remove os manipuladores.
RemoveHandler custDA.RowUpdating, New SqlRowUpdatingEventHandler(AddressOf OnRowUpdating)
RemoveHandler custDA.RowUpdated, New SqlRowUpdatedEventHandler(AddressOf OnRowUpdated)

Private Shared Sub OnRowUpdating(sender As Object, args As SqlRowUpdatingEventArgs)

  If args.StatementType = StatementType.Delete Then

      Dim tw As System.IO.TextWriter = System.IO.File.AppendText("Deletes.log")

      tw.WriteLine("{0}: Customer {1} Deleted.", DateTime.Now, args.Row("CustomerID", DataRowVersion.Original))
      tw.Close()

  End If

End Sub

Private Shared Sub OnRowUpdated(sender As Object, args As SqlRowUpdatedEventArgs)
 
  If args.Status = UpdateStatus.ErrorsOccurred
       args.Status = UpdateStatus.SkipCurrentRow
       args.Row.RowError = args.Errors.Message
  End If

End Sub
 

FillError

O evento FillError é disparado quando um erro ocorre durante a operação de preenchimento do DataSet. Este tipo de erro geralmente ocorre quando os dados na linha que esta sendo incluída não pode ser convertida para um tipo do Framework sem perda de precisão.

Se um erro ocorre durante a operação de preenchimento do DataSet (Fill) ,a  linha atual não será incluída no DataTable. Este evento permite a você resolver o erro e incluir a linha ou ignorar a linha excluída e continuar com a operação de preenchimento.

Os argumentos FillErrorEventArgs passados para o evento FillError podem conter diversas propriedades que permite a você responder e tratar os erros. As propriedades do objeto FillErrorEventArgs são :

Propriedade Descrição
Errors Indica a Exception que ocorreu.
DataTable Indica o objeto DataTable que esta sendo preenchido quando o erro ocorreu.
Values Representa um array de objetos que contém os valores da linha que esta sendo incluída quando o erro ocorreu.Values[0] seria o valor que estava sendo incluído na primeira coluna da linha.
Continue Permite que você escolha se quer ou não lançar uma  Exception. Se Continue for definido como false a operação de preenchimento será encerrada e uma exceção será lançada. Caso contrário a operação irá continuar apesar do erro.

O código de exemplo abaixo inclui um evento manipulador para o evento FillError do objeto DataAdapter. No código do evento o exemplo determina se ocorre uma perda de precisão fornecendo a oportunidade de responder a exceção.

AddHandler myDA.FillError, New FillErrorEventHandler(AddressOf FillError)

Dim myDS As DataSet = New DataSet
myDA.Fill(myDS, "MyTable")

Private Shared Sub FillError(sender As Object, args As FillErrorEventArgs)
  If args.Errors.GetType() Is Type.GetType("System.OverflowException") Then
    ' Codigo que manipula a perda de precisao
    ' Inclua uma linha na tabela usando os valores da duas primeiras colunas.
    DataRow myRow = args.DataTable.Rows.Add(New Object() {args.Values(0), args.Values(1), DBNull.Value})
    ' Define RowError contendo o valor da terceira coluna.
    args.RowError = "Ocorreum uma OverflowException.  Valores da fonte de dados : " & args.Values(2)
    args.Continue = True
  End If
End Sub
 

Referências : MSDN - Working with DataAdpater Events

Até a próxima...


José Carlos Macoratti