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