VB.NET - Localizando linhas em um DataTable


Como localizar uma linha (registro) ou um grupo de linhas (registros) em um DataTable usando um critério determinado ?

Existem 3 formas básicas de você localizar registros em um DataTable :

  1. DataTable.Select() - Usa o método Select() do objeto DataTable - Retorna um array de objetos DataRow que coincidem com critério definido. Por padrão as linhas no array são ordenadas pela chave primária , ou pela ordem na qual as linhas foram incluidas na tabela. Podemos usar o método Select() com um argumento opcional para selecionar registros de acordo com o estado de uma linha a partir da enumeração do DataViewRowState.
  2. DataTable.Rows.Find() - Usa o método Find() de DataRowCollection() de uma tabela para retornar uma linha que coincide com um valor da chave primária ou com valores passados como um argumento objeto our um array de objetos. Para usar o método Find() , o objeto Datatable no qual a DataRowCollection pertence precisa ter uma chave primária definida caso contrário a exceção MissingPrimaryKeyException será disparada. Se a chave primária não existe em DataRowCollection o método retorna Null.
  3. DataView.RowFilter - Podemos usar um DataView baseado em um Datatable para localizar registros das seguintes formas :

Vamos criar um projeto no VS.NET para mostrar como usar na prática estas soluções. Inicie um novo projeto no VS.NET com o nome localizaDataTable e no formulário principal inclua os seguintes controles :

O layout do formulário deverá ser idêntico ao da figura abaixo:

Vamos acessar a tabela Orders do banco de dados NorthWind do SQLServer.

A estrutura da tabela Orders é a seguinte :

Como critério estarei usando o campo ShipCountry

A string de conexão para o SQL Server instalado em minha máquina é :

server=(local);trusted_connection=true;database=Northwind;_
Integrated Security=SSPI

Você dever alterar esta string de conexão para o seu caso específico caso
seja necessário.

Vamos incluir no início do formulário os imports usados :

Imports System
Imports System.Data
Imports System.Data.SqlClient

e a definição das constantes para a tabela usada e para os campos usados como critério para filtrar os dados:

' constantes para os nomes das tabelas
Private TABELA_ORDERS As [String] = "Orders"

' constantes para os nomes dos campos usados
Private CAMPO_ORDERID As [String] = "OrderID"
Private CAMPO_SHIPCOUNTRY As [String] = "ShipCountry"

No evento Load do formulário vamos incluir o código que efetua as seguintes tarefas:

'define as strings de conexao e de instrução SQL
Dim strSql As String = "SELECT OrderID, CustomerID, ShipName, ShipCity, ShipCountry FROM " & TABELA_ORDERS
Dim strConexao As String = "server=(local);trusted_connection=true;database=Northwind;Integrated Security=SSPI"

'define o dataadapter e o datatable
Dim da As New SqlDataAdapter(strSql, strConexao)
Dim dt As New DataTable(TABELA_ORDERS)

' preenche a tabela Orders
da.Fill(dt)
da.FillSchema(dt, SchemaType.Source)

' vincula a tabela ao datagrid
dgLocalizaLinhas.DataSource = dt.DefaultView

Agora no evento Click do botão - Localiza Linhas - inclua o código abaixo:

Private Sub btnLocalizaLinhas_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLocalizaLinhas.Click
' obtem a tabela vinculada ao datagrid
Dim dt As DataTable = CType(dgLocalizaLinhas.DataSource, DataView).Table
 

' constroi o filtro usando o conteudo do combobox
Dim filtro As [String] = CAMPO_SHIPCOUNTRY & " = '" & cboPais.Text & "'"

' localiza os registros usando o método select do datatable
Dim drc As DataRow() = dt.Select(filtro)
txtResultado.Text = "DataTable.Select retornou " & drc.Length & " registros(s)." & Environment.NewLine

' percorre a coleção de linhas filtradas no passo anterior e localiza o item
'na tabela usando o método Find() de DataRowCollection do DataTable

Dim contador As Integer = 0
Dim linha As DataRow

For Each linha In drc
    Dim RegistroLocalizado As DataRow = dt.Rows.Find(linha(CAMPO_ORDERID))
    If Not (RegistroLocalizado Is Nothing) Then
       contador = contador + 1
     End If
Next linha

txtResultado.Text = txtResultado.Text & "DataTable.Rows.Find retornou " & contador & " registros(s)." & Environment.NewLine

' localiza os registros usando a propriedade RowFilter do DataView
Dim dv As New DataView(dt)

'executa o filtro no dataview
dv.RowFilter = filtro

'vincula o resultado ao dtagrid
dgLocalizaLinhas.DataSource = dv

'exibe o resultado dos três métodos usados para retornar os registros com o criterio usado
txtResultado.Text = txtResultado.Text & "DataView.RowFilter retornou " & dv.Count & " registro(s)."

End Sub

Destacamos a seguir as linhas de código que usam os métodos indicados :

O filtro usado é obtido usando o nome do país selecionado na combobox pelo usuário :

Dim filtro As [String] = CAMPO_SHIPCOUNTRY & " = '" & cboPais.Text & "'"

Executando o projeto e selecionando um país da combobox temos o resultado :

O resultado exibido no TextBox (multiline) é obtido pelas linhas de código :

txtResultado.Text = "DataTable.Select retornou " & drc.Length & " registros(s)." & Environment.NewLine

txtResultado.Text = txtResultado.Text & "DataTable.Rows.Find retornou " & contador & " registros(s)." & Environment.NewLine

txtResultado.Text = txtResultado.Text & "DataView.RowFilter retornou " & dv.Count & " registro(s)."

Onde :

drc, linha e RegistroLocalizado são do tipo DataRow. Para a acessar os items do array basta usar:

linha(itemArray(0)) ou linha(0) -> retorna o primeiro elemento do array.

 

Aguarde mais artigos com VB.NET.

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti