Back-End

12 mar, 2018

VB .NET – Acesso a dados genéricos: SQL Server e MySQL

Publicidade

Neste artigo vou recordar como podemos acessar um banco de dados de forma genérica usando a linguagem VB .NET.

O modelo de provedor está baseado em uma 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

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.

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.

Neste artigo vou mostrar como realizar as duas tarefas: obter a lista dos provedores e acessar os bancos de dados SQL Server e o MySQL.

Para acessar cada banco de dados, precisamos definir as seguintes configurações:

1- SQL Server

  • string de conexão – “Data Source=MACORATTI;Initial Catalog=Northwind;Integrated Security=True”
  • nome do provedor – “System.Data.SqlClient”
  • string sql de consulta para acesso a tabela – “Select * from Customers”

2- MySQL

  • string de conexão – “server=localhost;user id=root;password=??????;database=cadastro”
  • nome do provedor – “MySql.Data.MySqlClient”
  • string sql de consulta para acesso a tabela – “Select * from alunos”

Estou fazendo o acesso local, e por esse motivo preciso ter instalado os dois bancos de dados.

Recursos usados

Criando o projeto no VS Community 2017

Abra no VS community 2017 e no menu File clique em New Project;

A seguir, selecione o template Visual Basic -> Windows -> Windows Forms Application, informe o nome Vbn_DBTexto e clique em OK;

Agora abra o formulário Form1.vb e inclua os seguintes controles no formulário:

  • 2 Buttons – btnAcessarBD e btnExibirProvedores
  • 2 RadioButtons – rdbSQLServer e rdbMySQL
  • 1 ListBox – lbProvedores
  • 1 DataGridView – dgvDados

Disponha os controles conforme o layout da figura abaixo:

Definindo o código do formulário

Namespaces usados no formulário:

Imports System.Data.Common

Variáveis definidas no início do formulário:

Dim conexaoBD As String = “”
Dim provider As String = “”
Dim consultaSQL As String = “”

1- Código do botão de comando para exibir os provedores existentes

No evento btnExibirProvedores_Click, inclua o código que vai permitir exibir os provedores que você tem registrado na sua máquina local:

Private Sub btnExibirProvedores_Click(sender As Object, e As EventArgs) Handles btnExibirProvedores.Click
        Dim factory As DbProviderFactory = Nothing
        Dim dtFactories As DataTable = DbProviderFactories.GetFactoryClasses()
        Dim vetor As ArrayList = New ArrayList
        Dim i As Integer = 0
        For Each drFactory As DataRow In dtFactories.Rows
            Try
                factory = DbProviderFactories.GetFactory(drFactory)
                vetor.Add(factory)
                lbProvedores.Items.Add(vetor(i))
                i = i + 1
            Catch ex As Exception
                factory = Nothing
            End Try
        Next
    End Sub

O código acima usa o método estático DbProviderFactories.GetFactoryClasses() para retornar um DataTable contendo os provedores registrados.

2- Código do botão para acessar o SQL Server e o MySQL de forma genérica

Este código verifica qual radiobutton foi selecionado para definir o provedor, a string de conexão e a consulta SQL usada.

Em seguida obtém os provedores registrados e cria uma conexão usando o provider apropriado para a seguir e criar um comando definir a consulta, abrir a conexão e ler os dados do banco de dados exibindo-os no DataGridView:

Private Sub btnAcessarBD_Click(sender As Object, e As EventArgs) Handles btnAcessarBD.Click
        If rdbSQLServer.Checked Then
            provider = "System.Data.SqlClient"
            conexaoBD = "Data Source=MACORATTI;Initial Catalog=Northwind;Integrated Security=True"
            consultaSQL = "Select * from Customers"
        ElseIf rdbMySQL.Checked Then
            provider = "MySql.Data.MySqlClient"
            conexaoBD = "server=localhost;user id=root;password=gpxpst;database=cadastro"
            consultaSQL = "Select * from alunos"
        End If
        Dim factory As DbProviderFactory = DbProviderFactories.GetFactory(provider)
        Dim cnn As DbConnection = factory.CreateConnection
        cnn.ConnectionString = conexaoBD
        Dim cmd As DbCommand = factory.CreateCommand
        cmd.Connection = cnn
        cmd.CommandText = consultaSQL
        cmd.CommandType = CommandType.Text
        cnn.Open()
        Dim reader As DbDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
        Dim info As DataTable = New DataTable
        info.Load(reader)
        reader.Close()
        dgvDados.DataSource = info
    End Sub

Executando o projeto teremos o resultado a seguir:

Pegue o projeto completo aqui: Vbn_DBTexto.zip.