Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Aplica-se a: .NET Framework
.NET
.NET Standard
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;
}
}