.NET  - O eterno problema de acesso e exibição dos dados


Iniciamos este artigo com a pergunta recorrente : Como acessar um banco de dados e exibir os dados na internet ou num formulário Windows ?

Há anos parece que esta pergunta não quer calar...

Com o advento da plataforma .NET , do Visual Basic 2005 Express e do Visual Web Developer Express o que teria mudado ?

Depende... Você deseja saber O QUE FAZER ou COMO FAZER ?

Se nos atermos ao QUE FAZER podemos afirmar que não houve alterações significativas..

Senão vejamos...

Os ingredientes para a receita de bolo : "O que fazer para acessar um banco de dados e exibir os dados"  são:

E quanto as etapas básicas quais seriam ?

Vamos passo a passo efetuar cada etapa do processo ?

1- Banco de dados

a - SQL Server - SQL Server .NET Data Provider :

Você deverá usar o seguinte namespace:

Aplicação Web    Aplicação Windows Forms
<%@ Import Namespace="System.Data.SQLClient" %>        Imports System.Data.SqlClient

b - Microsoft Access - OleDB .NET Data Provider :

Você deverá usar o seguinte namespace:

Aplicação Web    Aplicação Windows Forms
<%@ Import Namespace="System.Data.OleDb" %>        Imports System.Data.OleDb

Nota:

Você pode usar qualquer outro banco de dados como Oracle, FireBird, PosteGreeSQL , MySQL , etc.

Nestes casos , com exceção do Oracle , você deverá usar um provedor de terceiros e se orientar pela documentação fornecida para o provedor. Lembrando que muitos destes provedores estão em suas versões beta. Abaixo a localização para download de alguns provedores:

2- String de conexão

Exemplo de string de conexão com o banco de dados Northwind

a - SQL Server :

Aplicação Web e  Aplicação Windows Forms
Dim strConn as string = "server=(local);uid=sa;pwd=pwd;database=Northwind"

b - Microsoft Access -:

Aplicação Web e Aplicação Windows Forms
Dim strConn as string = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\dados\northwind.mdb"   

3- Conexão

a - SQL Server :

Exemplo de string de conexão com o banco de dados Northwind

Aplicação Web e  Aplicação Windows Forms
Dim Conexao as New SQLConnection(strConn)

b - Microsoft Access -:

Você deverá usar o seguinte namespace:

Aplicação Web e Aplicação Windows Forms
Dim Conexao as New OleDBConnection(strConn)

4- Consulta SQL

Exemplo de consulta SQL selecionando todos os registros da tabela Customers

a - SQL Server :

Aplicação Web e  Aplicação Windows Forms
Dim sql as String = " Select * from Customers

b - Microsoft Access -:

Aplicação Web e Aplicação Windows Forms
Dim sql as String = " Select * from Customers

5- Abrindo a conexão

a- Usando o DataReader

Usar um controle DataReader implica em um acesso conectado de somente-leitura com a fonte de dados, ou seja , a conexão deverá existir durante o processo e não poderão ser feitas alterações na fonte de dados.

Com DataReader você pode efetuar o tratamento para exibição dos dados de duas formas :

1- Receber o DataReader gerado e percorrê-lo linha por linha manipulando os dados para exibição;

Abaixo um exemplo de conexão com o banco de dados SQL Server Northwind.mdf onde percorremos a tabela Customers e exibimos o código e nome do contato em um controle ListBox:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim codigo As String
Dim nome As String

Dim strconn As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=C:\dados\NORTHWND.MDF;Integrated Security=True;Connect Timeout=30;User Instance=True"
Dim Conexao As New SqlConnection(strConn)

Dim sql As String = " Select * from Customers"

Dim dr As SQLDataReader
Dim cmd As New SQLCommand(Sql, conexao)

conexao.Open()

dr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection)

While dr.Read()
  codigo = dr("CustomerID")
  nome = dr("ContactName")
  ListBox1.Items.Add(codigo & vbTab & nome)
End While
End Sub

2- Receber o DataReader gerado e vinculá-lo a um controle para exibição de dados como DataGridView, GridView, etc.

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim dt as new DataTable
Dim strconn As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=C:\dados\NORTHWND.MDF;Integrated Security=True;Connect Timeout=30;User Instance=True"

Dim Conexao As New SqlConnection(strconn)
Dim sql As String = " Select CustomerID, ContactName from Customers"

Dim dr As SqlDataReader
Dim cmd As New SqlCommand(sql, Conexao)

Conexao.Open()

dr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection)
dt.Load(dr)

DataGridView1.DataSource = dt

End Sub

Acima estamos usando um DataTable para receber o resultado pelo DataReader.

Nota: Porque não podemos vincular um DataReader diretamente a um DataGridView ?

A fonte de dados vinculada ao um controle DataGridView pode ser de qualquer tipo que implemente as seguintes interfaces:

  • IList , como ListBox, Combobox e arrays de uma dimensão;
  • IListSource , como as classes DataTable e DataSet;
  • IBindingList , como a classe BindingList;
  • IBindingListView , como a classe BindingSource;

Por isso usamos um objeto DataTable para receber o DataReader e em seguida abribuir o datatable ao DataGridView.

Poderiamos também usar um BindingSource da seguinte forma:

  1. Usar o método Read() do DataReader
  2. Armazenar os registros em uma coleção de objetos;
  3. Então definir a propriedade DataSource do BindingSource para a coleção de objetos;
  4. Vincular o DataGridView com o BindingSource;
dr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection)
dt.Load(dr)

Dim bs As New BindingSource
bs.DataSource = dt

DataGridView1.DataSource = bs

b- Usando o DataSet

Usar um DataSet é muito simples. Usando somente código  efetuamos as seguintes etapas:

- definimos o DataSet;
- Definimos consulta SQL que irá obter os dados da tabela;
- Criamos um objeto Command com base na consulta SQL e na conexão obtida a partir do arquivo de configuração;(Para acessar clique com botão direito do mouse sobre My Project e selecione Open)

- Preenchemos o DataSet a partir do objeto Command;
- Exibimos o resultado no controle DataGridView via propriedade DataSource;

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 

Dim ds As DataSet = New DataSet()

Dim sql As String = "Select * from Categories"
 

Dim Cmd As New OleDbDataAdapter(sql, My.Settings.connBD)


Cmd.Fill(ds,
"Categorias")


DataGridView1.DataSource = ds.Tables(
"Categorias").DefaultView

End Sub

 

A conexão esta definida no arquivo de configuração app.config como : Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Dados\Northwind.mdb

Executando o projeto iremos ter o DataGridView preenchido com os dados da tabela Categories:

Se desejar obter o mesmo resultado em uma página web usando ASP.NET  o código muda pouca coisa. Veja o código :

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click


'define o dataset, a instrução sql e a string de conexao

Dim ds As DataSet = New DataSet()

Dim sql As String = "Select * from Categories"

Dim connstring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Dados\Northwind.mdb"


'define o objeto connection e objeto dataadpater

Dim con As New OleDbConnection(connstring)

Dim da As OleDbDataAdapter = New OleDbDataAdapter(sql, con)


'preenche o dataset

da.Fill(ds, "Categorias")


'exibe os dados no grid usando o modo padrão

GridView1.DataSource = ds.Tables("Categorias").DefaultView

GridView1.DataBind()


End
Sub

      

Você notou que embora O COMO FAZER tenha mudado substancialmente O QUE FAZER praticamente continua da mesma forma.  Será que o modelo fornecido pode ser considerado realmente um modelo legítimo de acesso aos dados orientado a objetos. Notou que velhos esqueletos ainda permanecem , talvez como uma herança dos velhos tempos , até quando vamos continuar nesse esquema ???

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


José Carlos Macoratti