VB .NET - Lendo registros de vários banco de dados e exibindo em um Formulário (p/Iniciantes) - I  

 Neste artigo eu mostrar como ler os registros de uma tabela de um banco de dados e exibir o resultado em um formulário Windows Forms usando o VB .NET.

Esse artigo é para iniciantes que desejam aprender a acessar uma tabela de um banco de dados e exibir os valores obtidos em controles de formulários Windows Forms.

Eu vou mostrar como acessar os dados de um banco de dados Microsoft Access, de um SQL Server e de um MySQL.

Vamos criar um banco de dados chamado Vendas em cada um desses SGBDs e a seguir vamos criar 3 tabelas com a mesma estrutura e de nome Produtos em cada banco de dados:

MS Access 
SQL Server

 

MySQL

 Se você esta começando agora com a linguagem VB .NET e com a plataforma .NET deve saber que para acessar dados a tecnologia mais usada na plataforma .NET é a ADO .NET. (A recomendação atual da Microsoft é pela utilização da ferramenta ORM - Entity Framework que não será abordada neste artigo).

Para saber detalhes da tecnologia ADO .NET acompanhe os artigos, cursos e exemplo postados no site Macoratti .net (dou alguns links nas referências).

A ADO .NET oferece suporte a uma variedade de opções para desenvolvimento de soluções com acesso a dados que permitem a comunicação com qualquer fonte de dados, desde os já conhecidos gerenciadores de banco de dados relacionais (SGBD) como : SQL Server, MySQL, FireBird, Oracle, Sybase, Access, XML, arquivos textos, etc.

Os componentes considerados os pilares da ADO.NET são os objeto DataSet/DataTable e os provedores .NET que são um conjunto de componentes que incluem os objetos :

A primeira coisa que você deverá fazer é definir qual provedor dados .NET vai utilizar em sua aplicação e isso vai depender de qual banco de dados você esta usando.

Neste artigo vamos usar 3 provedores de dados distintos conforme abaixo:

  1. Banco de dados MS Access - System.Data.Oledb  (nativo da plataforma .Net): Ex: Imports System.Data.Oledb

  2. Banco de dados SQL Server - System.Data.SqlClient (nativo da plataforma .Net): Ex:  Imports System.Data.SqlClient

  3. Banco de dados MySQL - Connector/Net : MySql.Data.MySqlClient (obtido no site https://dev.mysql.com/downloads/connector/net/6.9.html ou via Nuget): Ex: Imports MySql.Data.MySqlClient

Após definir o provedor de dados, instalar o pacote no projeto e incluir o namespace na aplicação você terá acesso ás classes para realizar a conexão e usar os objetos ADO .NET.

Cada objeto possui uma versão para cada uma dos bancos de dados usados, assim temos os objetos :

A figura a seguir ilustra a arquitetura ADO .NET :

Vamos agora aplicar essa teoria na prática mostrando como acessar cada uma das base de dados usando ADO .NET.

Recursos usados:

Nota: Baixe e use a versão Community 2015 do VS ela é grátis e é equivalente a versão Professional.

Criando uma solucão em branco no VS Community

Abra o VS Community 2015 e clique em New Project;

Selecione Other Project Types -> Visual Studio Solutions -> Blank Solution e informe o nome ADONET_AcessoDados;

E clique no botão OK;

Vamos criar 3 projetos nesta solução em branco.

No menu File clique em Add -> New Project;

Selecione a linguagem Visual Basic -> Windows -> Windows Forms Application e informe o nome WF_Access;

Repeita o procedimento acima e inclua um projeto com o nome WF_MySql e WF_SQLServer;

Ao final teremos 1 solução contendo os 3 projetos conforme figura a seguir:

Definindo a interface para os 3 projetos

A interface dos 3 projetos serão idênticas. Por isso vou descrever como incluir os controles, definir os nomes e ajustar o leiaute apenas uma vez.

A partir da ToolBox inclua no formulário Form1 de cada projeto os seguintes controles:

  1. 4 Labels - Código, Descrição, Preço de Custo e Preço de Venda
  2. 4 TextBox - txtCodigo, txtDescricao, txtCusto, txtVenda
  3. 2 Buttons - btnLocalizar e btnSair

Agora disponha os controles no formulário conforme o leiaute abaixo:

Nota: Eu vou alterar somente a cor de fundo do formulário para cada projeto.

Acessando dados e exibindo no formulário - Uma abordagem não aderente às boas práticas de programação

Se você esta começando agora no mundo da programação usando o paradigma da  programação orientada a objetos(POO) deve conhecer os seus fundamentos que são: abstração, encapsulamento, herança, polimorfismo. Muito complicado ???

Então adote um lema : Não misture responsabilidades ou seja, não chupe cana e assovie ao mesmo tempo.

Com esse lema em mente você deve saber que camada de apresentação não tem que conhecer como acessar dados e vice-versa.

Para mostrar como não se faz, e, porque você não deve fazer isso, vamos mostrar a maneira errada de acessar dados em uma aplicação Windows Forms.

Em todos os projetos iremos adotar o mesmo procedimento:

1- Definir o namespace referente ao provedor de dados ADO .NET usado

2- Definir as variáveis objetos para criar a conexão e o DataReader no formulário

3- No evento Load do formulário vamos definir os valores das variáveis

4- No evento Click do botão Localizar vamos fazer o seguinte:

  • Abrir a conexão;
  • Definir a seguinte instrução SQL para localizar o registro com base no código informado no formulário:

    "SELECT * FROM Produtos WHERE (Codigo = " & Convert.ToInt32(txtCodigo.Text) & ")"
     

  • Criar o objeto Command para a conexão definida usando o comando SQL criado;
  • Executar o comando via ExecuteReader;
  • Percorrer o resultado no datareader e exibir os registros nas caixas de texto do formulário;
  • Fechar a conexão;

 

a - Acessando o MS Access

A seguir temos o código usado para acessar o banco de dados Microsoft Access

Imports System.Data.OleDb
Public Class Form1
    Dim provider As String
    Dim arquivoDados As String
    Dim connString As String
    Public conexaoAccess As OleDbConnection = New OleDbConnection
    Public dr As OleDbDataReader
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source ="
        arquivoDados = "C:\Dados\Vendas.accdb"
        connString = provider & arquivoDados
        conexaoAccess.ConnectionString = connString
    End Sub
    Private Sub btnLocalizar_Click(sender As Object, e As EventArgs) Handles btnLocalizar.Click
        conexaoAccess.Open()
        Dim str As String
        str = "SELECT * FROM Produtos WHERE (Codigo = " & Convert.ToInt32(txtCodigo.Text) & ")"
        Dim cmd As OleDbCommand = New OleDbCommand(str, conexaoAccess)
        dr = cmd.ExecuteReader
        While dr.Read()
            txtDescricao.Text = string.dr("Descricao").ToString
            txtCusto.Text = dr("Custo").ToString
            txtVenda.Text = dr("Preco").ToString
        End While
        conexaoAccess.Close()
    End Sub
   Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Me.Close()
    End Sub
End Class

Executando o projeto iremos obter o seguinte resultado:

b - Acessando o MySql

Agora é a vez do MySQL e temos que referenciar o connector/NET no projeto. 

No menu Tools clique em Nuget Package Manager -> Manage Nuget Packages for Solution;

Clique no link Browse e informe MySQL Connector;

Selecione o item MySql.Data e marque o projeto WF_MySql e clique no botão Install;

Pronto ! agora vamos ao código:

Imports MySql.Data.MySqlClient
Public Class Form1
    Dim connString As String
    Public conexaoAccess As MySqlConnection = New MySqlConnection
    Public dr As MySqlDataReader
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        connString = "Server=localhost;DataBase=Vendas;Uid=root;Pwd=sua_senha"
        conexaoAccess.ConnectionString = connString
    End Sub
    Private Sub btnLocalizar_Click(sender As Object, e As EventArgs) Handles btnLocalizar.Click
        conexaoAccess.Open()
        Dim str As String
        str = "SELECT * FROM Produtos WHERE (Codigo = " & Convert.ToInt32(txtCodigo.Text) & ")"
        Dim cmd As MySqlCommand = New MySqlCommand(str, conexaoAccess)
        dr = cmd.ExecuteReader
        While dr.Read()
            txtDescricao.Text = dr("Descricao").ToString
            txtCusto.Text = String.Format("{0:C2}", dr("Custo"))
            txtVenda.Text = String.Format("{0:C2}", dr("Preco"))
        End While
        conexaoAccess.Close()
    End Sub
End Class

Observe que o namespace usado agora é MySql.Data.MySqlClient e que OledbConnection virou MySqlConnection, onde Oledb foi substituido por MySQL, o mesmo acontecendo com os demais objetos ADO .NET.

A string de conexão também foi alterada para : "Server=localhost;DataBase=Vendas;Uid=root;Pwd=sua_senha"

Executando o projeto iremos obter:

c - Acessando o SQLServer

Agora temos o código para acessar o SQL Server

Imports System.Data.SqlClient
Public Class Form1
    Dim connString As String
    Public conexaoAccess As SqlConnection = New SqlConnection
    Public dr As SqlDataReader
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        connString = "Data Source=.\sqlexpress;Initial Catalog=Vendas;Integrated Security=True;"
        conexaoAccess.ConnectionString = connString
    End Sub
    Private Sub btnLocalizar_Click(sender As Object, e As EventArgs) Handles btnLocalizar.Click
        conexaoAccess.Open()
        Dim str As String
        str = "SELECT * FROM Produtos WHERE (Codigo = " & Convert.ToInt32(txtCodigo.Text) & ")"
        Dim cmd As SqlCommand = New SqlCommand(str, conexaoAccess)
        dr = cmd.ExecuteReader
        While dr.Read()
            txtDescricao.Text = dr("Descricao").ToString
            txtCusto.Text = String.Format("{0:C2}", dr("Custo"))
            txtVenda.Text = String.Format("{0:C2}", dr("Preco"))
        End While
        conexaoAccess.Close()
    End Sub
End Class

Observe que o namespace usado agora é System.Data.SqlCient e que OledbConnection virou SqlConnection, onde Oledb foi substituido por Sql, o mesmo acontecendo com os demais objetos ADO .NET.

A string de conexão também foi alterada para : Data Source=.\sqlexpress;Initial Catalog=Vendas;Integrated Security=True;"

Executando o projeto iremos obter:

Como você pode conferir o código funciona mas a nossa abordagem violou diversos princípios relacionados às boas práticas de programação.  Vejamos alguns:

  1. Princípio da separação das responsabilidades e da responsabilidade única (SRP) - A camada de apresentação possui código de acesso a dados então qualquer alteração em uma responsabilidade afeta a aplicação. Além isso o código não pode ser reutilizado;

  2. Repetição de código -  princípio DRY - Não se repita  - código repetido leva ao retrabalho;

Na segunda parte do artigo vamos ver a maneira certa de fazer a mesma coisa.

Pegue o projeto completo aqui :  ADONET_AcessoDados1.zip

(Disse Jesus) "Eu sou a videira, vós as varas; quem está em mim, e eu nele, esse dá muito fruto; porque sem mim nada podeis fazer.
Se alguém não estiver em mim, será lançado fora, como a vara, e secará; e os colhem e lançam no fogo, e ardem."
João 15:5,6

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

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?


Referências:


José Carlos Macoratti