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 :
Connection - responsável por efetuar a conexão com o banco de dados
Command - responsável por executar comandos contra o banco de dados;
DataAdapter - é utilizado para preencher o objeto DataSet/DataTable;
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:
Banco de dados MS Access - System.Data.Oledb (nativo da plataforma .Net): Ex: Imports System.Data.Oledb
Banco de dados SQL Server - System.Data.SqlClient (nativo da plataforma .Net): Ex: Imports System.Data.SqlClient
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 :
OleDbConnection, OleDbCommand, OleDbDataReader, OleDataAdapter;
SqlConnection, SqlCommand, SqlDataReader, SqlDataAdapter;
OdbcConnection, OdbcCommand,etc.
MySqlConnection, MySqlCommand, MySqlDataReader, etc.
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:
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:
|
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:
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;
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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#