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