Validar dados em conjuntos de dados
Publicado: agosto de 2016
Validação de dados é o processo que confirma que os valores sendo inseridos em objetos de dados de acordo com as restrições no esquema do dataset, bem como as regras estabelecidas para seu aplicativo. Validar dados antes de enviar atualizações para o banco de dados subjacente é uma boa prática que reduz erros bem como o número potencial de processamentos entre um aplicativo e o banco de dados. Você pode confirmar que os dados estão sendo gravados para um conjunto de dados são válidos criando verificações de validação para o próprio dataset. O conjunto de dados pode verificar os dados, independentemente de como a atualização está sendo executada — se diretamente pelos controles em um formulário, de um componente, ou de alguma outra maneira. Como o conjunto de dados é parte do seu aplicativo, é um local lógico para criar validação específica do aplicativo (diferente de criar as mesmas verificações no back-end do banco de dados).
O local sugerido para adicionar validação para o aplicativo é um arquivo de classe parcial do dataset. Em Visual Basic ou Visual C#, abra o DataSet Designer e clique duas vezes na coluna ou tabela que você deseja criar a validação. Esta ação cria automaticamente um ColumnChanging ou RowChanging manipulador de eventos. Para obter mais informações, consulte Como validar dados durante alterações em coluna, ou Como validar dados durante alterações de linha. Para obter um exemplo completo, consulte Instruções passo a passo: adicionando validação a um conjunto de dados.
Validando dados
Validação em um conjunto de dados pode ser realizada:
Criando sua própria validação específica do aplicativo que pode verificar dados durante alterações em valores em uma coluna de dados individuais. Para obter mais informações, consulte Como validar dados durante alterações em coluna.
Criando sua própria validação específica do aplicativo que pode verificar dados durante alterações em valores enquanto um inteiro de dados está mudando a linha. Para obter mais informações, consulte Como validar dados durante alterações de linha.
Ao criar chaves, restrições exclusivas, e assim por diante como parte da definição do esquema real do conjunto de dados. Para obter mais informações sobre incorporar validação na definição de esquema, consulte Restringir uma Coluna para conter valores exclusivos.
Definindo o DataColumn Propriedades do objeto, como MaxLength, AllowDBNull, e Unique.
Há vários eventos que são gerados pelo DataTable quando uma alteração está ocorrendo em um registro de objeto:
O ColumnChanging e ColumnChanged eventos são gerados durante e após cada alteração em uma coluna individual. O ColumnChanging evento é útil quando você deseja validar alterações em colunas específicas. Informações sobre a alteração proposta são passadas como um argumento com o evento. Para obter mais informações, consulte Como validar dados durante alterações em coluna.
O RowChanging e RowChanged eventos são gerados durante e após qualquer alteração em uma linha. O RowChanging evento é mais geral, porque ele simplesmente indica que uma alteração está ocorrendo em algum lugar na linha; você não souber qual coluna foi alterada. Para obter mais informações, consulte Como validar dados durante alterações de linha.
Por padrão, cada alteração em uma coluna, portanto, gera quatro eventos: primeiro o ColumnChanging e ColumnChanged eventos para a coluna específica que está sendo alterada e, em seguida, o RowChanging e RowChanged eventos. Se várias alterações estão sendo feitas para a linha, os eventos serão gerados para cada alteração.
Dica
A linha de dados BeginEdit método desativa o RowChanging e RowChanged eventos após cada alteração de coluna individual. Nesse caso, o evento não é gerado até que o EndEdit método foi chamado, quando a RowChanging e RowChanged eventos são gerados apenas uma vez. Para obter mais informações, consulte Desativar restrições ao preencher um conjunto de dados.
O evento que você escolhe depende de como granular você deseja que seja a validação. Se for importante que você capture um erro imediatamente quando uma coluna é alterada, crie validação usando o ColumnChanging evento. Caso contrário, use o RowChanging evento, que pode resultar em captura de vários erros ao mesmo tempo. Além disso, se seus dados são estruturados de forma que o valor de uma coluna é validado com base no conteúdo de outra coluna, você deve executar a validação durante o RowChanging evento.
Quando registros são atualizados, o DataTable objeto gera eventos que você pode responder enquanto alterações estão ocorrendo e depois que forem feitas alterações.
Se seu aplicativo estiver usando um dataset tipado, você pode criar manipuladores de eventos com rigidez de tipos. Isso adicionará quatro eventos tipados que você pode criar manipuladores; dataTableNameRowChanging
, dataTableNameRowChanged
, dataTableNameRowDeleting
, and dataTableNameRowDeleted
. Esses manipuladores de eventos tipados passam um argumento que inclui os nomes de coluna da tabela que tornam o código que mais fácil de escrever e ler.
Eventos de atualização de dados
Evento | Descrição |
---|---|
ColumnChanging | O valor em uma coluna está sendo alterado. O evento passa a linha e coluna para você, juntamente com o novo valor proposto. |
ColumnChanged | O valor em uma coluna foi alterado. O evento passa a linha e coluna para você, juntamente com o valor proposto. |
RowChanging | As alterações feitas em uma DataRow objeto estão prestes a serem confirmadas de volta para o conjunto de dados. Se você não tiver chamado o BeginEdit método, o RowChanging é gerado para cada alteração em uma coluna, imediatamente após o ColumnChanging evento foi gerado. Se você chamou BeginEdit antes de fazer alterações, o RowChanging é gerado somente quando você chamar o EndEdit método. O evento passa a linha para você e um valor que indica o tipo de ação (alterar, inserir e assim por diante) está sendo executado. |
RowChanged | Uma linha foi alterada. O evento passa a linha para você e um valor que indica o tipo de ação (alterar, inserir e assim por diante) está sendo executado. |
RowDeleting | Uma linha está sendo excluída. O evento passa a linha para você e um valor que indica o tipo de ação (excluir) está sendo executado. |
RowDeleted | Uma linha foi excluída. O evento passa a linha para você e um valor que indica o tipo de ação (excluir) está sendo executado. |
O ColumnChanging, RowChanging, e RowDeleting são gerados durante o processo de atualização. Você pode usar esses eventos para validar dados ou executar outros tipos de processamento. Como as atualizações estão em processo durante esses eventos, você pode cancelar a atualização lançando uma exceção, que impede que a alteração seja concluída.
O ColumnChanged, RowChanged, e RowDeleted eventos são eventos de notificação que são gerados quando a atualização foi concluída com êxito. Esses eventos são úteis quando você deseja fazer outra ação com base em uma atualização bem-sucedida.
Validar dados durante alterações de coluna
Dica
O Dataset Designer cria uma classe parcial onde lógica de validação pode ser adicionada a um conjunto de dados. O dataset gerado pelo designer não excluirá ou alterar qualquer código na classe parcial.
Você pode validar dados quando o valor em uma coluna de dados é alterado respondendo ao ColumnChanging evento. Quando gerado, esse evento passa um argumento do evento (ProposedValue) que contém o valor sendo proposto para a coluna atual. Com base no conteúdo de e.ProposedValue
, você pode:
Aceite o valor proposto, sem fazer nada.
Rejeitar o valor proposto, definindo o erro da coluna (SetColumnError) de dentro do manipulador de eventos de alteração de coluna.
Se desejar usar um ErrorProvider controle para exibir uma mensagem de erro para o usuário. Para obter mais informações, consulte Componente ErrorProvider.
A validação também pode ser executada durante o RowChanging evento. Para obter mais informações, consulte Como validar dados durante alterações de linha.
Validar dados durante alterações de linha
Você pode escrever código para verificar se cada coluna que você deseja validar contém dados que atenda aos requisitos do seu aplicativo. Se o valor proposto é inaceitável, defina a coluna para indicar que ele contém um erro. Os exemplos a seguir definem um erro de coluna quando a Quantity
coluna é 0 ou menos. Os manipuladores de eventos de alteração de linha devem se parecer com os exemplos a seguir.
Para validar dados quando uma linha altera (Visual Basic)
Abra o dataset no Dataset Designer. Para obter mais informações, consulte Como abrir um conjunto de dados no Designer de Conjunto de Dados.
Clique duas vezes a barra de título da tabela que você deseja validar. Esta ação cria automaticamente o RowChanging manipulador de eventos do DataTable no arquivo de classe parcial do dataset.
Dica
Clique duas vezes à esquerda do nome da tabela para criar o manipulador de eventos de alteração de linha. Se você clicar duas vezes no nome da tabela, você pode editar o nome da tabela.
Private Sub Order_DetailsDataTable_Order_DetailsRowChanging( ByVal sender As System.Object, ByVal e As Order_DetailsRowChangeEvent ) Handles Me.Order_DetailsRowChanging If CType(e.Row.Quantity, Short) <= 0 Then e.Row.SetColumnError("Quantity", "Quantity must be greater than 0") Else e.Row.SetColumnError("Quantity", "") End If End Sub
Para validar dados quando uma linha altera (c#)
Abra o dataset no Dataset Designer. Para obter mais informações, consulte Como abrir um conjunto de dados no Designer de Conjunto de Dados.
Clique duas vezes a barra de título da tabela que você deseja validar. Essa ação cria um arquivo de classe parcial para o DataTable.
Dica
O Dataset Designer não cria automaticamente um manipulador de eventos para o RowChanging evento. Você precisa criar um método para manipular o RowChanging eventos e executar o código para ligar o evento no método de inicialização da tabela.
Copie o código a seguir na classe parcial:
public override void EndInit() { base.EndInit(); Order_DetailsRowChanging += TestRowChangeEvent; } public void TestRowChangeEvent(object sender, Order_DetailsRowChangeEvent e) { if ((short)e.Row.Quantity <= 0) { e.Row.SetColumnError("Quantity", "Quantity must be greater than 0"); } else { e.Row.SetColumnError("Quantity", ""); } }
Para recuperar linhas alteradas
Cada linha em uma tabela de dados tem uma RowState que controla o estado atual da linha, usando os valores na propriedade de DataRowState enumeração. Você pode retornar linhas alteradas de uma dataset ou tabela de dados chamando o GetChanges
método de um DataSet ou DataTable. Você pode verificar se existem alterações antes de chamar GetChanges
chamando o HasChanges método de um conjunto de dados. Para obter mais informações sobre HasChanges, consulte Como verificar linhas alteradas.
Dica
Após confirmar alterações em uma dataset ou tabela de dados (chamando o AcceptChanges método), o GetChanges
método não retornará dados. Se seu aplicativo precisar processar linhas alteradas, você deve fazer isso antes de chamar o AcceptChanges
método.
Chamar o GetChanges método de um conjunto de dados ou tabela de dados retorna uma novo dataset ou uma tabela que contém somente os registros que foram alterados. Se você quiser obter somente registros específicos — por exemplo, somente registros novos ou somente registros modificados — você pode passar um valor da DataRowState enumeração como um parâmetro para o GetChanges
método.
Use o DataRowVersion enumeração para acessar as versões diferentes de uma linha (por exemplo, convém examinar os valores originais em uma linha antes de processá-la.
Para obter todos os registros alterados de um conjunto de dados
Chamar o GetChanges método de um conjunto de dados.
O exemplo a seguir cria um novo dataset chamado
changedRecords
e a preenche com todos os registros alterados do outro dataset chamadodataSet1
.DataSet changedRecords = dataSet1.GetChanges();
Dim changedRecords As DataSet = DataSet1.GetChanges()
Para obter todos os registros alterados de uma tabela de dados
Chamar o GetChanges método de um DataTable.
O exemplo a seguir cria uma nova tabela de dados chamada
changedRecordsTable
e a preenche com todos os registros alterados de outra tabela de dados chamadadataTable1
.DataTable changedRecordsTable = dataTable1.GetChanges();
Dim changedRecordsTable As DataTable = dataTable1.GetChanges()
Para obter todos os registros que têm um estado de linha específico
Chamar o
GetChanges
método de um conjunto de dados ou tabela de dados e passe um DataRowState valor de enumeração como um argumento.O exemplo a seguir mostra como criar um novo dataset chamado
addedRecords
e preenchê-lo somente com registros que foram adicionados para odataSet1
conjunto de dados.DataSet addedRecords = dataSet1.GetChanges(DataRowState.Added);
Dim addedRecords As DataSet = DataSet1.GetChanges(DataRowState.Added)
O exemplo a seguir mostra como retornar todos os registros adicionados recentemente para o
Customers
tabela:private NorthwindDataSet.CustomersDataTable GetNewRecords() { return (NorthwindDataSet.CustomersDataTable) northwindDataSet1.Customers.GetChanges(DataRowState.Added); }
Private Function GetNewRecords() As NorthwindDataSet.CustomersDataTable Return CType(NorthwindDataSet1.Customers.GetChanges(Data.DataRowState.Added), NorthwindDataSet.CustomersDataTable) End Function
Acessar a versão Original de um DataRow
Quando forem feitas alterações em linhas de dados, o conjunto de dados manterá tanto o original (Original) e novos (Current) versões da linha. Por exemplo, antes de chamar o AcceptChanges
método, seu aplicativo pode acessar as versões diferentes de um registro (conforme definido no DataRowVersion enumeração) e processar as alterações de acordo.
Dica
Versões diferentes de uma linha existem somente após ela ter sido editada e antes que tenha tido a AcceptChanges
método chamado. Após o AcceptChanges
método foi chamado, as versões atuais e originais são as mesmas.
Passando o DataRowVersion valor junto com o índice da coluna (ou nome da coluna como uma cadeia de caracteres) retorna o valor da versão de linha específica da coluna. A coluna alterada é identificada durante a ColumnChanging e ColumnChanged eventos, portanto, que é um bom momento para inspecionar a diferença linha versões para fins de validação. No entanto, se você temporariamente suspenso restrições, esses eventos não serão gerados e você precisará programaticamente identificar quais colunas foram alteradas. Você pode fazer isso, iterando através de Columns coleta e comparando os diferentes DataRowVersion valores.
Para obter a versão original de um registro
Acessar o valor de uma coluna passando o DataRowVersion da linha que você deseja retornar.
O exemplo a seguir mostra como você pode usar um DataRowVersion valor para obter o valor original de um
CompanyName
campo um DataRow:string originalCompanyName; originalCompanyName = northwindDataSet1.Customers[0] ["CompanyName", DataRowVersion.Original].ToString();
Dim originalCompanyName = NorthwindDataSet1.Customers(0)( "CompanyName", DataRowVersion.Original).ToString()
Acessar a versão atual de um DataRow
Para obter a versão atual de um registro
Acessar o valor de uma coluna e adicione um parâmetro ao índice que indica qual versão de uma linha que você deseja retornar.
O exemplo a seguir mostra como você pode usar um DataRowVersion valor para obter o valor atual de um
CompanyName
campo um DataRow:string currentCompanyName; currentCompanyName = northwindDataSet1.Customers[0] ["CompanyName", DataRowVersion.Current].ToString();
Dim currentCompanyName = NorthwindDataSet1.Customers(0)( "CompanyName", DataRowVersion.Current).ToString()
Consulte também
Criando e editando conjuntos de dados tipados
Como conectar a dados em um banco de dados
Como validar dados no controle DataGridView dos Windows Forms
Como exibir ícones de erro para validação do formulário com o componente ErrorProvider dos Windows Forms