VB.NET - Criando uma Conexão Genérica


 

Procurando no site achei dois artigos que relacionados ao tema : Como criar uma conexão genérica com um banco de dados ?

Vou colocar novamente o problema para, em seguida, mostrar outra solução possível.

 

Vamos supor que você tenha que criar uma aplicação que realize uma conexão com os seguintes banco de dados :  Access, MSDE, MySQL e FireBird.

 

Como você faria ?

 

Você já deve saber que cada um destes banco de dados possui um provedor específico :

Deve saber também que cada um usa uma string de conexão diferente :

Nota:  As strings para conexão acima não são únicas e podem variar de acordo com o ambiente, o banco de dados e a tabela.

 

Se pensou em criar um código independente do provedor de acesso aos dados acertou . Mas como fazer isto ?

 

Neste artigo vou mostrar como você pode criar uma conexão com cada um dos banco de dados mencionados de forma simples sem precisar referenciar cada provedor específico.

 

Vamos criar um código para acessar de forma transparente os 4 banco de dados acima (você pode implementar para mais banco de dados relacional) apenas mudando a string de conexão.

 

Nota: a limitação a esta solução esta no fato de que é preciso usar comandos SQL padronizados pela norma ANSI 92 .

 

O pulo do gato para resolver o problema é usar as interfaces usadas para implementar as classes específicas para cada provedor.

 

Não vamos referenciar uma classe específica mas sim a interface que é implementada por cada classe. Por exemplo:

Não vou referenciar a classe SqlConnection mas a interface IDbConnection. Com isto eu tenho uma referência genérica que vai funcionar com qualquer instância de conexão para um banco de dados específico.

Ex:

 

Cria uma referência a interface IDbConnection Dim comexao as IDbConnection

 

Agora posso instanciar de forma dinâmica qualquer objeto conexão que eu quiser:

 

conexao = new SqlClient.SqlConnection  ou  conexao = new OleDb.OleDb.Connection

 

Entendeu ?

 

Da mesma forma eu faço para os demais objetos :

 

Dim cmd As IDbCommand

Dim dr As IDbDataReader

Dim da As IDbDataAdapter

 

Se você não tem o conceito de interface precisa parar aqui e dar uma olhada no artigo : Net-  Trabalhando com objetos

 

Criando o projeto para conexão Genérica

 

Vamos então ao que realmente interessa: Criar o projeto que efetua a conexão com os 4 tipos de banco de dados mencionados.

 

Para testar este código em sua máquina local você vai precisar ter instalado os banco de dados : Access , MSDE , MySQL e FireBird (felizmente eu tenho...) e cada um dos provedores para MySQL e FireBird.

 

Se não tiver leia os artigos relacionados que mostra como fazer a instalação para o MSDE , MySQL e FireBird

  1. VB.NET - Acessando o MySQL.

  2. VB.NET - Acessando o FireBird.

Inicie um novo projeto no VS.NET do tipo Windows Application usando a linguagem VB.NET.

 

No formulário padrão - form1.vb - inclua os seguintes componentes :

 

 

Note que o projeto exibe as referências aos provedores que serão usados para conexão com cada um dos banco de dados. Abaixo eu estou repetindo o roteiro para o MySQL e para o FireBird:

 

Para o MySQL :

Neste momento devemos incluir no projeto uma referência ao provedor MySQL Connector/NET que foi instalado. Para isto clique com o botão direito do mouse sobre o projeto e selecione a opção Add Reference.

Na janela Add Reference escolha a opção MySQL.Data.dll conforme abaixo:

 

Para o FireBird :

 

Vamos agora fazer a referência ao provedor FireBird .NET Provider que você já instalou. Clique com o botão direito do mouse sobre o nome do projeto e selecione a opção Add Reference.

 

Na janela Add Reference localize o componente Firebird .NET Provider , clique em Select e a seguir em OK.

 

 

Agora vamos ao código do projeto:

 

No evento Load do formulário teremos o código que preenche a combobox com os tipos de banco de dados usados no artigo:

 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

  cboTipoBD.Items.Add("Access")

  cboTipoBD.Items.Add("MSDE")

  cboTipoBD.Items.Add("MySql")

  cboTipoBD.Items.Add("FireBird")

  cboTipoBD.SelectedIndex = 0

End Sub

 

No evento Click do botão de comando inclua o seguinte código :

 

Private Sub btnPreencheGrid_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPreencheGrid.Click


' Instancia objetos dataadapter e connection de forma dinâmica via interface

Dim da As System.Data.IDbDataAdapter

Dim cn As System.Data.IDbConnection = GetConnection()


'verifica se a conexão esta vazia

If Not IsNothing(cn) Then

    da = GetDataAdapter(cn)

Else

    MsgBox("A conexão esta vazia !")

    Exit Sub

End If


' Executa o dataadapter e mostra o datagrid

Dim ds As System.Data.DataSet = New System.Data.DataSet


'tratamento de erros

Try

    da.Fill(ds)

    dgCustomers.DataSource = ds.Tables(0)

Catch ex As Exception

    MsgBox(ex.Message)

Finally

   'sempre fecha a coenxao

   cn.Close()

End Try
 

End Sub

 

Neste código estamos usando duas funções muito importantes :

 

1- GetConnection()  - que irá retornar a conexão de acordo com o banco de dados selecionado :

 

Aqui eu apenas usei as strings de conexão para cada banco de dados. Observando que :

Private Function GetConnection() As System.Data.IDbConnection

If cboTipoBD.SelectedItem = "Access" Then

    Return New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\teste\Northwind.mdb")

ElseIf cboTipoBD.SelectedItem = "MSDE" Then

   Return New System.Data.SqlClient.SqlConnection("Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Master;Data Source=MACORATI\VSDOTNET")

ElseIf cboTipoBD.SelectedItem = "MySql" Then

  Return New MySql.Data.MySqlClient.MySqlConnection("server=localhost;user id=root;password=mac;database=northwind")

ElseIf cboTipoBD.SelectedItem = "FireBird" Then

   Return New FirebirdSql.Data.Firebird.FbConnection("User=SYSDBA;Password=masterkey;Database=d:\teste\cadastro.gdb;DataSource=localhost;Port=3050;Dialect=3;")

End If

End Function

 

Obs: MACORATI\VSDOTNET é o nome do meu servidor MSDE , altere para o nome usado na sua máquina local

 

2- GetDataAdapter(cn) - que irá receber a conexão e retornar um DataAdapter de acordo com o banco de dados selecionado

Private Function GetDataAdapter(ByRef cn As System.Data.IDbConnection) As System.Data.IDbDataAdapter


Dim
sql As
String


If
cboTipoBD.SelectedItem = "Access"
Then

    sql = "select * from Customers"

    Return New System.Data.OleDb.OleDbDataAdapter(sql, cn)

ElseIf cboTipoBD.SelectedItem = "MSDE" Then

   sql = "select * from Clientes"

   Return New System.Data.SqlClient.SqlDataAdapter(sql, cn)

ElseIf cboTipoBD.SelectedItem = "MySql" Then

   sql = "SELECT * FROM northwind.employees"

   Return New MySql.Data.MySqlClient.MySqlDataAdapter(sql, cn)

ElseIf cboTipoBD.SelectedItem = "FireBird" Then

   sql = "SELECT * FROM CLIENTES"

   Return New FirebirdSql.Data.Firebird.FbDataAdapter(sql, cn)

End If
 

End Function

 

Agora é só rodar a aplicação. Abaixo estou exibindo o resultado para os banco de dados MSDE e FireBird:

 

 

 

Acabamos de criar um super conector geral para banco de dados. Na verdade você pode melhorar a ideia implementando classes e fazendo um tratamento de erros mais consistente e colocando outros recursos e etc....

 

Pegue o código do projeto completo aqui:  conexaoGenerica.zip

 

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

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

Aguarde mais artigos sobre VB.NET ...

Mat 8:24 E eis que se levantou no mar tão grande tempestade que o barco era coberto pelas ondas; ele, porém, estava dormindo.

Mat 8:25 Os discípulos, pois, aproximando-se, o despertaram, dizendo: Salva-nos, Senhor, que estamos perecendo.

Mat 8:26 Ele lhes respondeu: Por que temeis, homens de pouca fé? Então, levantando-se repreendeu os ventos e o mar, e seguiu-se grande bonança.

Mat 8:27 E aqueles homens se maravilharam, dizendo: Que homem é este, que até os ventos e o mar lhe obedecem? (Jesus)

        Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:

 


José Carlos Macoratti