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:

  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:

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 _providerName As String
    Shared Sub New()
        Try
            _connectionString = ConfigurationManager.ConnectionStrings("ConexaoBD").ConnectionString
            _providerName = ConfigurationManager.ConnectionStrings("ConexaoBD").ProviderName
        Catch ex As Exception
            Throw New Exception("Erro ao acessar a string de conexão")
        End Try
    End Sub
    Public Shared Function ConnectionString() As String
        Return _connectionString
    End Function
    Public Shared Function ProviderName() As String
        Return _providerName
    End Function
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.Data
Imports
System.Data.Common
Imports
System.Collections.Generic

A 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
    ExecuteNonQuery
    ExecuteReader
    ExecuteScalar
    ExecuteDataTable
    ExecuteDataSet
End Enum
    Public Shared Function CriarComando(comandoTexto As String, comandoTipo As CommandType, listaParametros
As List(Of DbParameter))  As DbCommand
        Try
            Dim oFactory = DbProviderFactories.GetFactory(ConexaoBD.ProviderName)
            Dim oConn = oFactory.CreateConnection
            oConn.ConnectionString = ConexaoBD.ConnectionString
            Dim oCmd = oConn.CreateCommand
            oCmd.CommandText = comandoTexto
            oCmd.CommandType = comandoTipo
            If Not IsNothing(listaParametros) Then
                For Each oParam In listaParametros
                    oCmd.Parameters.Add(oParam)
                Next
            End If
            Return oCmd
        Catch ex As Exception
            Throw ex
        End Try
    End Function
    Public Shared Function ExecutarComando(comandoTexto As String, comandoTipo As CommandType, listaParametros
As List(Of DbParameter), tipoComando As TipoDeComando) As Object
        Dim command = CriarComando(comandoTexto, comandoTipo, listaParametros)
        Dim retorno As Object = Nothing
        Try
            command.Connection.Open()
            Select Case tipoComando
                Case TipoDeComando.ExecuteNonQuery
                    retorno = command.ExecuteNonQuery
                Case TipoDeComando.ExecuteReader
                    retorno = command.ExecuteReader
                Case TipoDeComando.ExecuteScalar
                    retorno = command.ExecuteScalar
                Case TipoDeComando.ExecuteDataTable
                    Dim table = New DataTable
                    Dim reader = command.ExecuteReader
                    table.Load(reader)
                    reader.Close()
                    retorno = table
                Case TipoDeComando.ExecuteDataSet
                    Dim oFactory = DbProviderFactories.GetFactory(ConexaoBD.ProviderName)
                    Dim da As DbDataAdapter = oFactory.CreateDataAdapter
                    command.CommandText = comandoTexto
                    command.CommandType = comandoTipo
                    da.SelectCommand = command
                    Dim ds As New DataSet
                    da.Fill(ds)
                    retorno = ds
            End Select
        Catch ex As Exception
            Throw ex
        Finally
            If Not tipoComando = TipoDeComando.ExecuteReader Then
                If command.Connection.State = ConnectionState.Open Then
                    command.Connection.Close()
                End If
                command.Connection.Dispose()
            End If
        End Try
        Return retorno
    End Function
    Public Shared Function CriarParametro(nomeParametro As String, tipoParametro As DbType, valorParametro As Object) As DbParameter
        Try
            Dim oFactory = DbProviderFactories.GetFactory(ConexaoBD.ProviderName)
            Dim oParam = oFactory.CreateParameter()
            If Not IsNothing(oParam) Then
                oParam.ParameterName = nomeParametro
                oParam.DbType = tipoParametro
                oParam.Value = valorParametro
            End If
            Return oParam
        Catch ex As Exception
            Throw ex
        End Try
    End Function
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:

  1. Obter uma lista de todos os provedores existentes via método estático GetFactoryClasses;

  2. 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:

O método ExecutarComando foi definido para receber os seguintes parâmetros:

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:

Abaixo vemos essas definições para o

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" />

      </connectionStrings>
</configuration>

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.

The Series is the title of data that we are displaying. In this tutorial we will display sales and expenses data from a database. Therefore our series collection will be Sales, Expenses.

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.dpuf
The Series is the title of data that we are displaying. In this tutorial we will display sales and expenses data from a database. Therefore our series collection will be Sales, Expenses.

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.dpuf

Na ú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 ?


  Gostou
?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti