Neste artigo/exemplo mostrarei como criar uma conexão genérica para qualquer banco de dados utilizando o ADO.Net. Inicialmente vamos falar sobre a forma padrão de conexão a um Banco de Dados onde temos um aplicativo que deverá realizar uma conexão com os seguintes banco de dados : SQL Server, Access, MySQL, PostGres, Oracle, etc. Neste caso teríamos de utilizar asp e cs onde temos um aplicativo que dever um provedor específico para cada banco de dados: OleDB para o Access, SqlCliente para o SQLServer, entre outros e além do provedor deveríamos ter uma string de conexão diferente para cada banco de dados.

Neste exemplo, a ideia é criar um código independente do provedor de acesso aos dados de forma simples e independente de referenciar cada provedor específico.

Para desenvolver essa solução o Visual Basic.Net 2005 possui um conjunto de interfaces usadas para implementar as classes específicas para cada provedor, dessa forma não é necessário referenciar uma classe específica (SQLClient,OleDB) mas a interface implementada.

Por exemplo, queremos criar um objeto conexão para o SqlClient. Da forma tradicional temos: Dim conn as new SqlClient(). Utilizando interfaces fazermos uma referência a interface IDbConnection. Dessa forma a declaração do objeto conexão ficaria: Dim conn as IDbConnection

Assim como na declaração do objeto conexão, podemos declarar os demais objetos para acesso a dados conforme vemos na lista abaixo:

Dim adapter As IDbDataAdapter
Dim comando As IDbCommand
Dim reader As IDbDataReader

Para exemplificar a situação descrita acima, desenvolvi uma classe de acesso a Banco de Dados. Para este exemplo utilizei conexão genérica para uma base de dados no Microsoft Access e no MySql.

Classe para banco de dados genérico

Neste classe existe três funções que retornam os respectivos objetos de Banco de Dados a partir de um Banco de dados escolhido

Fiz esse exemplo usando duas fontes de dados, o ACCESS e o MYSQL 5

Public Class BDGenerico
  
     função publica que retorna a conexao para o banco de dados escolhido
     Public Function RetornaConexao(ByVal BDEscolhido As String) As System.Data.IDbConnection
         If BDEscolhido = "ACCESS" Then se o banco de dados for access
             Return New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;
             Data Source=" & Application.StartupPath & "\teste.mdb")
         Else se o banco de dados for MYSQL
             Return New MySql.Data.MySqlClient.MySqlConnection("server=localhost;user 
             id=root;password=ilheus10;database=Teste")
         End If
     End Function
Public Function RetornaAdapter(ByVal BDEscolhido As String) As System.Data.IDataAdapter
 If BDEscolhido = "ACCESS" Then se o BD escolhido for access
     Return New System.Data.OleDb.OleDbDataAdapter()
 Else se o BD escolhido for MYSQL
     Return New MySql.Data.MySqlClient.MySqlDataAdapter()
 End If
End Function
Função publica que retorna um adapter para o banco de dados escolhido
Public Function RetornaComand(ByVal BDEscolhido As String) As System.Data.IDbCommand
     If BDEscolhido = "ACCESS" Then se BD escolhido for access
         Return New OleDb.OleDbCommand
     Else se BD escolhido for MYSQL
         Return New MySql.Data.MySqlClient.MySqlCommand
     End If
 End Function
End Class
Função publica que retorna um command para o banco de dados escolhido

Após a implementação da Classe, irei utilizá-la através do formulário abaixo:

bdGenerico.JPG

Nessa aplicação Windows Forms, tenho uma combobox que lista os bancos de dados Disponíveis: Accesse MySql. Além da combobox existe uma datagrid para exibir os dados do banco de dados escolhidos, uma textbox para informar um dado a ser buscado e a outra textbox que exibe o resultado da consulta.

Vejamos o código da implementação do formulário: Esse exemplo mostra como criar um BD Genérico para um sistema Existe um módulo no qual estão as funções que retornam os respectivos objetos do banco de dados que é escolhido para o usuário

Imports System.Data
Public Class Form1
 Dim BDEscolhido As String variavel publica que recebe o banco de dados escolhido 
 a partir de uma COMBOBOX

 Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e 
 As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
     BDEscolhido = ComboBox1.SelectedItem variável BDEscolhido recebe o item selecionado 
     na combobox
 End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 
Handles Button1.Click
 Try
     Dim conexao As IDbConnection = BDGenerico.RetornaConexao(BDEscolhido) 
     conexao recebe a o retorno da função RetornaConexão que retorna a conexão 
     para o banco escolhido
     Dim adapter As IDbDataAdapter = BDGenerico.RetornaAdapter(BDEscolhido) 
     conexao recebe a o retorno da função RetornaAdapter que retorna um adapter 
     para o banco escolhido
     Dim command As IDbCommand = BDGenerico.RetornaComand(BDEscolhido) 
     conexao recebe a o retorno da função RetornaConexão que retorna um comando 
     para o banco escolhido

     command.Connection = conexao
     command.CommandText = "Select * From Nomes"
     adapter.SelectCommand = command

     Dim ds As New DataSet
     adapter.Fill(ds) preenche o DataSet

     DataGridView1.DataSource = ds.Tables(0) preeche a grid com a tabela Nomes
 Catch ex As Exception
     MsgBox(ex.Message)
 End Try

 End Sub
Botão que exibe na datagrid todos os Códigos e Nomes presentes no Banco de Dados
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 
Handles Button2.Click
     Dim conexao As IDbConnection = BDGenerico.RetornaConexao(BDEscolhido) declarando uma conexão
     Dim command As IDbCommand = BDGenerico.RetornaComand(BDEscolhido) declarando um objeto command

     conexao.Open() abrindo a conexao 
     command.Connection = conexao
     command.CommandText = "Select Nome from Nomes where Codigo =" & TextBox1.Text
     Dim datareader As IDataReader
     datareader = command.ExecuteReader
     datareader.Read()

     TextBox2.Text = datareader("Nome") recebe o nome armazenado em um datareader

     conexao.Close()
 End Sub


 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     ComboBox1.SelectedItem = 1  inicia a combobox com o item ACCESS
 End Sub
End Class
Botão que pesquisa um nome a partir de um código

Ao final do artigo temos uma classe e um formulário que acessa a classe que contém o código para conexão genérica com o banco de dados. Espero que esse artigo/exemplo seja útil a todos.