Compartilhar via


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:

Há vários eventos que são gerados pelo DataTable quando uma alteração está ocorrendo em um registro de objeto:

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)

  1. Abra o dataset no Dataset Designer. Para obter mais informações, consulte Como abrir um conjunto de dados no Designer de Conjunto de Dados.

  2. 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#)

  1. Abra o dataset no Dataset Designer. Para obter mais informações, consulte Como abrir um conjunto de dados no Designer de Conjunto de Dados.

  2. 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.

  3. 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 chamado dataSet1.

                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 chamada dataTable1.

                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 o dataSet1 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