VB .NET - Lendo registros de vários banco de dados e exibindo em um Form (Iniciantes) - II |
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. |
Na primeira parte do artigo criamos a solução e 3 projetos onde em cada um deles definimos o código para acessar os banco de dados : Microsoft Access, SQL Server e MySQL.
Mas essa abordagem fere um dos princípios básicos das boas práticas : a separação das responsabilidades.
As boas práticas recomendam que a camada de interface não deve conhecer particularidades de acesso a dados, e, que essa responsabilidade deve estar concentrada em uma camada separada e independente. Desta forma a camada de interface, aqui representada pela aplicação Windows Forms, não deveria ter código de acesso a dados e deveríamos criar uma outra camada contendo o código cuja responsabilidade seria realizar as tarefas pertinentes ao acesso a dados
Essa prática é adotada por ser mais rápida e intuitiva de ser feita, mas, traz grandes desvantagens como:
Portanto, embora o código esteja funcional, ele pode, e deve ser melhorado, e o que vamos fazer neste artigo é aplicar alguns princípios para tornar o projeto aderente às boas práticas de programação.
Recursos usados:
Nota: Baixe e use a versão Community 2015 do VS ela é grátis e é equivalente a versão Professional.
Fazendo a coisa certa desde o começo : Criando uma camada de Acesso a dados
Abra a solução criada na primeira parte do artigo usando o o VS Community 2015;
Vamos incluir um novo projeto Windows Forms nesta solução que será usado para acessar e exibir os dados.
No menu File clique em Add -> New Project;
Selecione a linguagem Visual Basic -> Windows -> Windows Forms Application e informe o nome WF_AcessoGenerico;
Definindo a interface do projeto Windows forms
A interface desse projeto será idêntica à dos demais projetos Windows Forms.
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:
Agora o acesso aos dados será feito apenas desse formulário.
Criando o Project Class Library para a camada de Acesso a Dados - DAL
Vamos agora incluir um novo projeto em nossa solução.
No menu File clique em Add -> New Project;
Selecione a linguagem Visual Basic -> Class Library e informe o nome DAL;
Vamos criar duas classes nesse projeto DAL : ConexaoBD e AcessoBD.
Criando a classe ConexaoBD - Responsável por realizar a conexão com o banco de dados
Clique com o botão direito sobre o projeto DAL criado e a seguir em Add New Item e inclua a classe ConexaoBD neste projeto.
A seguir inclua o código abaixo nesta classe :
Imports System.Configuration Public Class ConexaoBD Shared _connectionString As String Shared Sub New() End Sub Public Shared Function ConnectionString() As String Public Shared Function ProviderName() As String End Class |
Esta classe possui um construtor onde estamos obtendo a string de conexão e o nome do provedor a partir do arquivo de configuração App.Config.
Para isso temos que incluir uma referência no projeto ao namespace System.Configuration.
Clique no menu PROJECT -> Add Reference. Selecione a guia Assemblies e marque System.Configuration clicando a seguir em OK;
Definimos dois métodos estáticos (shared) :
Criando a classe AcessoBD - Responsável por consultar e realizar operações no banco de dados
Clique com o botão direito sobre o projeto DAL criado e a seguir em Add New Item e inclua a classe AcessoBD neste projeto.
O modelo Factory genérico é uma arquitetura que permite o acesso a qualquer banco de dados, a partir de um conjunto de código.
No namespace System.Data.Common existem algumas novas classes que nos permitem criar código independente de plataforma muito facilmente e neste artigo eu vou mostrar como usar esses recursos para criar uma singela camada de acesso a dados genérica de forma que poderemos acessar qualquer banco de dados para o qual exista um provedor disponível para a plataforma .NET.
Defina os seguintes namespaces na classe AcessoBD:
Imports
System.DataA seguir crie uma uma enumeração no início da classe onde vamos definir o tipo de comando que iremos usar:
Agora vamos definir o código abaixo na classe AcessoBD:
Public Class AcessoBD
Public Enum TipoDeComando Public Shared Function CriarComando(comandoTexto As String, comandoTipo As CommandType, listaParametros Try oConn.ConnectionString = ConexaoBD.ConnectionString Dim oCmd = oConn.CreateCommand oCmd.CommandText = comandoTexto If Not IsNothing(listaParametros) Then Return oCmd Catch ex As Exception End Function Public Shared Function ExecutarComando(comandoTexto As String, comandoTipo As CommandType, listaParametros Dim command = CriarComando(comandoTexto, comandoTipo, listaParametros) Try Select Case tipoComando Public Shared Function CriarParametro(nomeParametro As String, tipoParametro As DbType, valorParametro As Object) As DbParameter Try Dim oParam = oFactory.CreateParameter() If Not IsNothing(oParam) Then Return oParam Catch ex As Exception End Class |
O método CriarComando tem como objetivo criar um comando para um provedor. Observe que estamos usando a classe DBProviderFactories.
O novo modelo de provedor ADO.NET esta baseado em um série de classes base no namespace System.Data.Comom. A classe DBProviderFactories permite a realização de dois tipos de tarefas:
Obter uma lista de todos os provedores existentes via método estático GetFactoryClasses;
Criar uma instância de um determinado Factory conforme o seu tipo via método GetFactoryClass
Uma classe base de provedor é um objeto factory que é usado para criar um conjunto de objetos relacionados como SqlConnection e SqlCommand. Eles retornam um tipo de classe abstrata do tipo DBConnection. As classes de provider factory são derivadas de uma classe base abstrata : System.Data.Common.DbProviderFactory , e , para cada tipo de base de dados a ser acessado temos uma nova classe derivada desta classe base abstrata. A classe DbDataProvider define o número de funções que esta subclasse precisa implementar:
CreateComand() | Cria um objeto Command derivado de DBCommand. |
CreateCommandBuilder() | Cria um objeto derivado de DbCommandBuilder |
CreateConnection() | Cria um objeto derivado de DbConnection. |
CreateConnectionStringBuilder() | Cria um objeto derivado de DbConnectionStringBuilder |
CreateDataAdapter() | Cria um objeto derivado de DbDataAdapter. |
CreateDataSourceEnumerator() | Cria um objeto derivado de DbDataSourceEnumerator. |
CreateParameter() | Cria um objeto derivado de DbParameter. |
CreatePermission() | Cria um objeto derivado de CodeAccessPermission, |
Desde que o DbProviderFactory apropriado foi criado a função na tabela acima pode ser usada para criar o objeto apropriado ao invés de usar o operador New como anteriormente.(Para determinar todas as classes DbProviderFactory disponíveis e criar suas classes adicionais é fornecido a classe System.Data.Common.DbProviderFactories)
Cada provedor de dados faz o registro de uma classe ProviderFactory no arquivo machine.config da plataforma .NET. A classe base DbProviderFactory e a classe ProviderFactories podem retornar um DataTable de informações sobre os diferentes provedores registrados no arquivo machine.config e podem recuperar a ProviderFactory conforme a sequência do provedor fornecida ou um DataRow de um DataTable.
O método CriarComando foi definido para receber os seguintes parâmetros:
Assim temos a sequência de operações que serão executadas:
Obtenção do nome do provedor
Criação da conexão
Obtenção da string de conexão
Definição do comando e do tipo de comando usados
Obtenção dos parâmetros
retorno do comando criado
O método ExecutarComando foi definido para receber os seguintes parâmetros:
comandoTexto - O texto do comando a ser criado. Aqui podemos definir um comando SQL como : SELECT, INSERT, DELETE e UPDATE
comandoTIpo - Define o tipo de comando que o comandoTexto representa podendo ser Text para declarações SQL ou StoredProcedure;
listaParametros - Defina a lista de parâmetros que será usada para criar o comando;
TipoDeComando - O tipo de comando que será executado;
Estamos verificando o tipo de comando e executando a operação correspondente com o comando que foi criado.
Para os tipos de comando ExecuteDataTable e ExecuteDataSet estamos retornando respectivamente um datatable e um dataset que criamos via código.
O método CriarParametro define a criação de parâmetros para utilização com os comandos criados quando necessário.
Definindo as strings de conexão no arquivo de configuração da solução
vamos aproveitar e definir no arquivo de configuração do projeto, o arquivo App.Config, as strings de conexão que iremos usar. Fazemos isso inserindo uma seção <connectionstring> após a tag <configuration> onde definimos três propriedades importantes:
name = o nome usado para identificar a string de conexão;
connectionString - a string de conexão com o banco de dados;
providerName - o nome do provedor do banco de dados usado;
Abaixo vemos essas definições para o
MS Access : name = MSAccessConnectionString e providerName = "System.Data.Oledb"
SQL Server : name = SQLServerConnectionString e providerName= "System.Data.SqlClient"
MySQL : name = MySQLConnectionString e providerName= "MySql.Data.MySqlClient"
Abra o arquivo App.Config do projeto WF_AcessoGenerico e inclua o código que define cada string de conexão usada conforme abaixo:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /> </startup> <connectionStrings> <add name="MSAccessConnectionString" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source =c:\dados\Vendas.accdb" providerName="System.Data.Oledb"/> <add name="SQLServerConnectionString" connectionString="Data Source=.\sqlexpress;Initial Catalog=Vendas;Integrated Security=True" providerName="System.Data.SqlClient"/> <add name="MySQLConnectionString" connectionString="Server=localhost;Database=Cadastro;Uid=root;Pwd=******;Connect Timeout=30;" providerName="MySql.Data.MySqlClient" /> |
Para concluir temos que referenciar no projeto Windows Forms WF_AcessoGenerico o projeto da nossa camada de acesso a dados - DAL . Para isso clique com o botão direito sobre o nome do projeto Windows Forms e selecione Add Reference;
Clique em Projects e selecione o projeto DAL e clique em OK;
Agora já temos tudo pronto para podermos acessar os dados de cada um dos banco de dados e exibir as informações no formulário.
We will delete Series1 becuase we will replace it with Expenses and Sales.
Right click the chart and click on properties. In the properties window, scroll down to Series and click on the small button next to Collection:
- See more at: http://www.visual-basic-tutorials.com/display-data-as-charts-and-graph-in-visual-basic.html#sthash.lBTOTLaR.dpufWe will delete Series1 becuase we will replace it with Expenses and Sales.
Right click the chart and click on properties. In the properties window, scroll down to Series and click on the small button next to Collection:
- See more at: http://www.visual-basic-tutorials.com/display-data-as-charts-and-graph-in-visual-basic.html#sthash.lBTOTLaR.dpufNa última parte deste artigo vamos mostrar como fazer isso.
Por isso sinto prazer
nas fraquezas, nas injúrias, nas necessidades, nas perseguições, nas angústias
por amor de Cristo. Porque quando estou fraco então sou forte.
2 Coríntios 12:10-10
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: