VB.NET - O acesso a dados com ASP.NET


Após uma primeira incursão na plataforma .NET da Microsoft onde já abordamos os seguintes artigos :

  1. Visual Basic .NET - aquecendo as turbinas.
  2. Minha primeira aplicação no Visual Basic .NET
  3. Minha primeira aplicação Windows no Visual Basic .NET
  4. VB.NET - Windows Forms
  5. ADO .NET - O acesso aos Dados.
  6. Meu primeiro acesso a dados com o VB.NET.
  7. ASP.NET - evolução ou enganação ?.

Voltamos para mostrar o acesso a dados usando o VB.NET utilizando uma aplicação ASP.NET. Para não complicar vamos começar com uma tarefa bem simples: Carregar uma caixa de combinação - DropDownList - e de acordo com a seleção do usuário exibir os dados relacionados em uma caixa de texto - TextBox.

A idéia é acessar o banco de dados Northwind.mdb que vem com o Access (vou usar uma versão em português) e aproveitar o relacionamento existente entre a tabela categorias e produtos e exibir no controle DropDownList o nome das categorias e conforme o usuário selecionar uma categoria exibir os produtos relacionados na caixa de texto. Como disse uma tarefa básica e simples.

Para acompanhar este artigo você vai precisar da Versão Beta 2 ( a versão completa já saiu , mas a versão beta funciona) do Microsoft Visual Studio .Net instalada em sua máquina.

1- Inicie o Microsoft Visual Studio .Net 7.0 e abra um novo projeto selecionando - New Project.

2- Na janela New Project Selecione em Project Type : Visual Basic Projects e em Templates: ASP.NET Web Application . Vamos dar o nome ao nosso projeto de Database_Acesso1. No final clique em OK.

3- Altere o nome do formulário para - Database_Acesso1.aspx e monte o formulário conforme a figura abaixo:

O formulário - Database_Acesso1.aspx Os controles usados no formulário

O formulário foi montado usando os seguintes controles :

A conexão com o banco de dados northwind.mdb será feita via OleDb.

Agora vamos a parte mais interessante : o código.

Clique duas vezes no formulário - Database_Acesso1.aspx - Você verá algo parecido com a figura abaixo:

A primeira linha de código será colocada acima da declaração Public Class WebForm1 e vai indicar que vamos usar OLeDB para a conexão com nosso banco de dados:

Imports.System.Data.OleDb

As próximas linhas de código serão inseridas na área reservada para o evento Page_Load.

A primeira coisa que você deve ter em mente é que estamos usando ADO.NET e isso trouxe uma grande mudança no modo como os dados são manuseados. Quando você usava a ADO os dados eram armazenados em um Recordset e temos um modelo orientado ao banco de dados.

Com a ADO.NET o  modelo usado é orientado aos dados e não mais existe o objeto Recordset mas vários outros objetos que tratam do acesso a dados de forma mais flexivel. O DataSet é um desses novos objetos , ele é uma representação dos dados na memória e é usado para representar tabelas, relacionamentos , stored procedures, etc., de forma que não existe uma conexão com a fonte de dados, ou seja, o DataSet é independente da fonte de dados ; isto permite uma economia de recursos  pois não estamos acessando diretamente o banco de dados mas uma cópia dos dados no objeto DataSet.

Abaixo temos o código do evento Page_Load :

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

If Not IsPostBack Then
    Dim strSql As String
    Dim conexao As OleDbConnection
    Dim dscmd As OleDbDataAdapter
    Dim ds As DataSet

   conexao =
New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=C:\teste\Northwind.mdb;")
   conexao.Open()

   Try
      strSql =
"Select distinct NomeDaCategoria From Categorias ORDER BY NomeDaCategoria"

      dscmd = New OleDbDataAdapter(strSql, conexao)
      ds = New DataSet()
      dscmd.Fill(ds, "Categorias")

     
DropCategorias.DataTextField = "NomeDaCategoria"
      DropCategorias.DataValueField = "NomeDaCategoria"
      DropCategorias.DataSource = ds.Tables("Categorias").DefaultView
      DropCategorias.DataBind()
      DropCategorias.Items.Insert(0, New ListItem("Selecione a Categoria...", ""))

   Finally
      conexao.Close()
   End Try
End If
End Sub

Se você clicar no botão Start ou pressionar F5 para executar o projeto deverá obter a seguinte página:

Vamos analisar e explicar o código linha por linha:

- If Not IsPostBack - checa se algum dado foi postado para o servidor , em caso positivo o código a seguir é exectado

Dim strSql As String
Dim conexao As OleDbConnection
Dim dscmd As OleDbDataAdapter
Dim ds As DataSet
Definição das variáveis objeto usadas na aplicação

- conexao = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=C:\teste\Northwind.mdb;")

Definimos a conexão com o banco de dados Northwind.mdb localizado no diretorio c:\teste usando o provoder OLE DB 4.0 ; onde Connection - é a classe que implementa a interface de conexão. (IDbConnection interface).

- Conexao.Open - abrimos a conexão com o banco de dados

- A estrutura Try-Catch-Finally - Dentro do bloco Try colocamos o código que pode apresentar erros . Se ocorrer um erro durante o processamento cada declaração Catch vai ser percorrida em busca do tratamento para o erro em questão. O bloco Finally sempre será executado depois do processamento do bloco Try . (A declaração Throw pode ser usada para gerar um erro.)

- strSql = "Select distinct NomeDaCategoria From Categorias ORDER BY NomeDaCategoria"

Definimos aqui a instrução SQL para selecionar os registros da tabela Categorias a ser exibidos no controle DropDownList

- dscmd = New OleDbDataAdapter(strSql, conexao)

DataAdapter - Fornece dados ao DataSet e propaga as alterações do DataSet para a fonte de dados. O serviço do DataAdpater é adpatar os dados dos objetos Command e incluí-los no DataSet e levar os dados do DataSet à fonte de dados usando objetos Command.

- ds = New DataSet()

Gera um objeto ds do tipo DataSet

- dscmd.Fill(ds, "Categorias")

Aqui temos o objeto Data Adapter  - dscmd - usando o método Fill que esta vinculado a instrução SQL.

DropCategorias.DataTextField = "NomeDaCategoria"
DropCategorias.DataValueField = "NomeDaCategoria"
DropCategorias.DataSource = ds.Tables("Categorias").DefaultView
DropCategorias.DataBind()
DropCategorias.Items.Insert(0, New ListItem("Selecione a Categoria...", ""))
Atribuimos ao controle os valores que vamos exibir.

Perceba que o DataSet esta relacionado com Tabelas ( Tables ) e Relacionamentos ( Relations ) e que as tabelas contidas no DataSet pertence a classe DataTable

O DataBind é quem preenche o componente DropDownList

Vamos agora implementar a exibição dos produtos relacionados com a categoria exibida na caixa de texto . Para fazer isto vamos usar uma instrução SQL para extrair os registros da tabela Produtos de acordo com a categoria selecionada.

O código será inserido no evento SelectedIndexChanged do componente DropDownlist. Clique duas vezes no componente e insira o código abaixo no evento:

Private Sub DropCategorias_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DropCategorias.SelectedIndexChanged
    Dim strSql As String
    Dim conexao As OleDbConnection
    Dim cmd As OleDbCommand
    Dim dr As OleDbDataReader

   strSql = " SELECT Produtos.NomeDoProduto"
   strSql = strSql & " FROM Categorias INNER JOIN Produtos ON Categorias.CódigoDaCategoria =    Produtos.CódigoDaCategoria "
   strSql = strSql & " WHERE Categorias.NomeDaCategoria= '" & DropCategorias.SelectedItem.Value & "'"

  conexao = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=C:\teste\Northwind.mdb;")
  conexao.Open()
  Try
         cmd = New OleDbCommand(strSql, conexao)
         dr = cmd.ExecuteReader()
         TxtProdutos.Text = ""
         Try
              Do While dr.Read()
                 TxtProdutos.Text += dr("NomeDoProduto") & vbCrLf
             Loop
         Finally
           dr.Close()
         End Try
  Finally
    conexao.Close()
  End Try
End Sub
End Class

O resultado do processamento após o usuário selecionar uma Categoria é  o seguinte:

Como funciona ?

   Dim strSql As String
    Dim conexao As OleDbConnection
    Dim cmd As OleDbCommand
    Dim dr As OleDbDataReader
definimos as variáveis objetos e strings que serão usadas no evento

- strSql = " SELECT Produtos.NomeDoProduto"
   strSql = strSql & " FROM Categorias INNER JOIN Produtos ON Categorias.CódigoDaCategoria =    Produtos.CódigoDaCategoria "
   strSql = strSql & " WHERE Categorias.NomeDaCategoria= '" & DropCategorias.SelectedItem.Value & "'"

Construimos aqui a string que irá gerar o comando SQL para selecionar o nome dos produtos para a categoria selecionada

- conexao = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=C:\teste\Northwind.mdb;")
  conexao.Open()

Criamos a conexão com o banco de dados Northwind.mdb e abrimos a conexão

- A estrutura Try-Catch-Finally - Dentro do bloco Try colocamos o código que pode apresentar erros . Se ocorrer um erro durante o processamento cada declaração Catch vai ser percorrida em busca do tratamento para o erro em questão. O bloco Finally sempre será executado depois do processamento do bloco Try .

cmd = New OleDbCommand(strSql, conexao)
dr = cmd.ExecuteReader()
TxtProdutos.Text = ""
Criamos um novo comando OLeDbCommand usando a string SQL e a conexão criadas

-          Do While dr.Read()
                 TxtProdutos.Text += dr("NomeDoProduto") & vbCrLf
             Loop

Preenchemos o controle TxtProdutos com os nomes dos produtos selecionados e exibimos no formulário do projeto.

Se você esta estranhando um pouco o código , no começo é assim mesmo...(depois piora. )

Embora a plataforma .NET apresente novidades revolucionárias , você só tem uma escolha , arregaçar as mangas e estudar , estudar e ... estudar.

Até a próxima...


José Carlos Macoratti