ADO.NET
- DataTable - Obtendo desempenho em consultas e ordenações
Acessar uma fonte de dados para obter informações é uma tarefa complexa que consome recursos e necessita ser bem planejada para não impactar a sua aplicação nos quesitos desempenho e segurança. Muitas vezes você precisa acessar tabelas com uma grande quantidade de registros apenas para obter uma única informação ou obter um subconjunto ordenado de registros.
Neste artigo eu vou mostrar uma forma de você efetuar o acesso a uma base de dados efetuar uma consulta e criar um DataTable desconectado para em seguida usar o método Select do DataTable e efetuar ordenações e filtragens nos registros, obtendo um sub-conjuntos de dados de forma eficaz.
Eu sempre procuro usar o Visual Basic 2005 Express Edition pois é grátis , então , abra o VB 2005 Express e crie um novo projeto do tipo Windows Appliction;
Altere o nome do formulário form1.vb para frmDados e defina no formulário o seguinte leiaute:
![]() |
Componentes usados no
formulário: - 2 TextBox - txtDataSource e txtSQL - 4 GroupBox - grpDados1, grpDados2, grpDados3 e grpDados4 - 4 ListBox - lstDados1, lstDados2, lstDados3 e lstDados4 - 4 Button - btnDados1, btnDados2, btnDados3 e btnDados4 |
Defina o seguinte namespace no projeto: Imports System.data.sqlclient
Defina as seguintes variáveis no início do formulário :
Dim oConn As New SqlConnection()
Dim oTable As New DataTable()
Dim oRows As DataRow()
Dim sConnectionString As String = ""
Ao carregar o formulário no evento Load vamos desabilitar os botões de comando :
| Private Sub frmDados_Load(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles
MyBase.Load btnDados2.Enabled = False btnDados3.Enabled = False btnDados4.Enabled = False End Sub |
Vamos agora ao código de cada um dos botões de comando:
1- Neste código é feito o acesso ao banco de dados e gerado um DataTable que em seguida é percorrido para exibir os valores das colunas CustomerID e ContactName em um controle ListBox.;
Private Sub btnDados1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDados1.Click
Try
oConn.ConnectionString = txtDataSource.Text
oConn.Open()
Dim oDA As New SqlDataAdapter(txtSQL.Text, oConn)
oDA.Fill(oTable)
oConn.Close()
grpDados1.Text = oTable.Rows.Count & " registros ordenados por ContacName Crescente"
For Each oRow As DataRow In oTable.Rows
lstDados1.Items.Add(oRow("CustomerID").ToString() + vbTab + oRow("ContactName").ToString())
Next
btnDados2_.Enabled = True
Catch ex As Exception
MsgBox(ex.Message)
Finally
If oConn.State = ConnectionState.Open Then
oConn.Close()
End If
End Try
End Sub
|
2 - O código a seguir usa o DataTable gerado para efetuar a ordenação pelo CustomerID no modo Ascendente preenchendo também um ListBox;
Private Sub btnDados2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDados2.Click
Try
oRows = oTable.Select(Nothing, "CustomerID ASC")
grpDados2.Text = oTable.Rows.Count & " registros ordenados por CustomerID Crescente"
For Each oRow As DataRow In oRows
lstDados2.Items.Add(oRow("CustomerID").ToString() + vbTab + oRow("ContactName").ToString())
Next
btnDados3.Enabled = True
Catch ex As Exception
MsgBox(ex.Message)
Finally
If oConn.State = ConnectionState.Open Then
oConn.Close()
End If
End Try
End Sub
|
3- No código abaixo usamos o mesmo DataTable para selecionar os CustomerID ALFKI e ANATR ordenando por ContactName ascendente;
Private Sub btnDados3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDados3.Click
Try
oRows = oTable.Select("CustomerID in ('ALFKI','ANATR')", "ContactName ASC")
grpDados3.Text = oRows.Length & " registros selecionados e ordenados em ordem Crescente"
For Each oRow As DataRow In oRows
lstDados3.Items.Add(oRow("CustomerID").ToString() + vbTab + oRow("ContactName").ToString())
Next
btnDados4.Enabled = True
Catch ex As Exception
MsgBox(ex.Message)
Finally
If oConn.State = ConnectionState.Open Then
oConn.Close()
End If
End Try
End Sub
|
4- O último código repete a seleção para os clientes com CustomerID igual a ALFKI','ANATR','BONA','WOLZA ','TRADH' e efetua a ordenação por CustomerID descendente;
Private Sub btnDados4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDados4.Click
Try
oRows = oTable.Select("CustomerID in ('ALFKI','ANATR','BONA','WOLZA ','TRADH')", "CustomerID DESC")
grpDados4.Text = oRows.Length & " registros selecionados e ordenados em ordem Decrescente"
For Each oRow As DataRow In oRows
lstDados4.Items.Add(oRow("CustomerID").ToString() + vbTab + oRow("ContactName").ToString())
Next
Catch ex As Exception
MsgBox(ex.Message)
Finally
If oConn.State = ConnectionState.Open Then
oConn.Close()
End If
End Try
End Sub
|
O resultado pode ser visto na figura abaixo. Note que todas as operações foram realizadas em um mesmo DataTable gerado onde realizamos diversas operações sem ter que executar novas consultas no banco de dados ganhando assim desempenho.
![]() |
Pegue o projeto completo aqui: dataTableNet.zip
Eu sei é apenas VB.NET mas eu gosto...
José Carlos Macoratti