VB.NET - Filtrando valores Nulos em um DataView


Como filtrar um DataView de forma a tratar valores NULL ?

Este artigo vai usar a tabela Customers do banco de dados Northwind do SQL Server 2000. Abaixo temos a exibição no Enterprise Manager  do banco de dados e da tabela :

A estrutura da tabela Customers é exibida na figura abaixo e foi obtida também no Enterprise Manager do SQL Server:

Exibindo os dados presentes na tabela temos o seguinte resultado:

Note que o campo Region possui valores Null. Nosso objetivo e tratar estes valores em um DataTable/DataView de forma a saber como exibir somente os registros com valores Null para o campo Region e também como não exibir estes mesmos valores.

Vamos criar um novo projeto no VS.NET do tipo Windows Application usando a linguagem VB.NET e no formulário principal vamos incluir somente um botão de comando e um componente DataGrid para exibir os valores.

Como vamos acessar um banco de dados SQL Server temos que usar um import System.Data.SqlClient ; no inicio do formulário vamos declarar também uma constante com a string de conexão com o banco de dados SQL Server:

Public conexaoSQLServer As String = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Northwind"

No evento Load do formulário vamos colocar o código que estabelece a conexão com o SQL Server e preenche o DataGrid, conforme abaixo:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     ' cria e preenche a tabela customers
Dim dt As New DataTable("Customers")
Dim da As New SqlDataAdapter("SELECT CustomerID,ContactName,City,Region,Country FROM Customers", conexaoSQLServer)
        Try
            da.Fill(dt)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
 ' vincula o modo de visualização padrão ao grid
DataGrid1.DataSource = dt.DefaultView
End Sub

Agora no evento Click do botão de comando o código abaixo irá filtrar os dados para exibir somente os valores Null ou exibir somente os valores não Null.

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim filtro As String = "Region IS NULL"

        Dim dv As DataView = CType(DataGrid1.DataSource, DataView)

        If Button1.Text = "Exibir Somente Nulos" Then
            dv.RowFilter = filtro
            DataGrid1.CaptionText = "Tabela Customers : Campo Region is Null."
            Button1.Text = "Não Exibir Nulos"
        Else
            dv.RowFilter = "Region is Not NULL"
            DataGrid1.CaptionText = "Tabela Customers: Campo Region is Not NULL."
            Button1.Text = "Exibir Somente Nulos"
        End If
    End Sub

Aqui estamos usando a cláusula IS NULL e IS NOT NULL para efetuar o tratamento exibindo os valores desejados.

Lembre-se que cada objeto DataTable possui um DataView padrão associado que podemos usar para filtrar a tabela usando critérios definidos.

A propriedade RowFilter de DefaultView é filtrada para linhas que contenham o campo Region com valores Null. Aplicando filtro o resultado se reflete imediatamente no DataGrid.

A linha de código a seguir merece uma atenção especial:

 Dim dv As DataView = CType(DataGrid1.DataSource, DataView)

nele estamos convertendo a fonte de dados do DataGrid para um DataView. Estamos efetuando um Cast usando Ctype.

Onde Ctype retorna o resultado de uma conversão explícita para um tipo de dados especificado , objeto , estrutura , classe ou interface.

A sintaxe é :    CType(expression, typename)

Para saber mais leia o artigo : VB.NET - Casting : Ctype ou DirectCast.

O resultado da execução do projeto é exibido nas figuras abaixo:

Exibindo somente valores Null Não exibindo valores Null

Você também poderia ter usado uma instrução SQL para obter diretamente um DataTable com ou sem valores Null  para o campo Region:

1- Seleciona os registros da tabela Customers para Region com valor Null

SELECT CustomerID,ContactName,City,Region,Country FROM Customers Where Region is Null
 

2-   Seleciona os registros da tabela Customers para Region com valores NÃO Null

SELECT CustomerID,ContactName,City,Region,Country FROM Customers Where Region is Not Null

Neste caso o DataGrid já exibiria o resultado final sem necessitar realizar o filtro.

Eu sei é apenas VB.NET , mas eu gosto ...


José Carlos Macoratti