 ADO.NET  
- Usando Factories de Provedores
 ADO.NET  
- Usando Factories de Provedores
|  | Dentre as inúmeras novidades que a plataforma .NET trouxe na versão 2.0 com relação ao acesso a dados temos o novo conceito de provider e de factory contidos na classe Data.Comon.DbProviderFactories. | 
Até o momento quando pretendíamos efetuar uma conexão com uma base de dados criávamos os objetos diretamente. Assim, para acessar o SQL Server usávamos as classes SqlConnection, SqlDataAdapter, SqlXXX; para acessar uma base de dados Access usávamos os provedores OleDbConnection,OleDbDataAdapater , OleDbCommand, OleDbXXX; assim por diante;ou seja tínhamos uma série de classes específicas de provedores que eram usadas conforme a fonte de dados a ser acessada.
O problema é quando desejamos poder acessar tanto uma base SQL Server como uma base Oracle ou Access usando código genérico.
Isto era possível pois cada classe implementava uma interface genérica IDbConnection, IDbDataAdapter, IDbCommand, etc.
O novo modelo de provedor ADO.NET 2.0 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:
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, | 
| Funções DbDataProvider | |
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.
Com base nisto podemos descobrir quais os provedores de dados instalados usando o código abaixo:
| ImportsSystem.Data.common PublicClass Form1 
     
 Dim vetor As ArrayList = New ArrayList Dim i As Integer = 0 
     Try factory = DbProviderFactories.GetFactory(drFactory) vetor.Add(factory) ListBox1.Items.Add(vetor(i)) i = i + 1 Catch ex As Exception factory = Nothing End TryNext End Sub EndClass | 
    
     | 
No código acima 
DbProviderFactories.GetFactoryClasses() retorna um DataTabe com todos 
os possíveis provedores de dados. 
Usamos DbProviderFactories.GetFactory  
para criar um DbProviderFactory baseado no nome da
DataRow do DataTable obtido acima. 
Poderíamos usar o código abaixo para tentar efetuar a conexão com a base de dados MSDE. Como o provedor de dados é o Data.SqlClient haveria 3 tentativas frustradas com exibição de mensagem de erros pois a string de conexão usada refere-se ao provedor SqlClient que é o último data provider registrado no machine.config.
| ImportsSystem.Data.common PublicClass Form1 
     
 Dim i As Integer = 0 
     Try factory = DbProviderFactories.GetFactory(drFactory) conn = factory.CreateConnection()    
    conn.ConnectionString = 
    "Integrated Security=SSPI;Persist Security Info=False;Initial 
    Catalog=Northwind; _ conn.Open() conn.Close() conn = Nothing ExitFor Catch ex As Exception conn = Nothing factory = Nothing MsgBox(ex.Message) End TryNext End Sub EndClass | 
Vamos mostrar um exemplo onde iremos trabalhar com classes de uma base de dados sem definirmos o tipo das classes. Vamos preencher um DataGridView com os dados da tabela Orders do banco de dados Northwind do MSDE (compatível com SQL Server).
Obs: Utilize uma string de conexão compatível com a sua base de dados.
Crie um novo projeto no Visual Basic 2005 Express com o nome de acessoBD, e, no formulário principal inclua um componente DataGridView(dgv1) e um botão de comando (btnPreencherGrid) conforme figura abaixo:
|  | 
Defina o seguinte import no código :
Imports
System.Data.CommonAgora clique duas vezes no botão de comando do formulário e inclua o seguinte código :
| Private
    Sub 
    btnPreencherGrid_Click(ByVal 
    sender As System.Object,
    ByVal e 
    As System.EventArgs)
    Handles 
    btnPreencherGrid.Click 
     Dim factory As DbProviderFactory = DbProviderFactories.GetFactory(provider) Dim cnn As DbConnection = factory.CreateConnection 
 Dim cmd As DbCommand = factory.CreateCommand 
 cmd.CommandText = "select * from Orders" cmd.CommandType = CommandType.Text 
 
     Dim info As DataTable = New DataTable 
 
 
 End Sub | 
| Nota: 
    Poderíamos ter armazenado a string de conexão e a  informação do 
    provedor de dados no arquivo de configuração
    web.config: 
 Para obter os valores do web.config teríamos que usar o seguinte código: 
 | 
Este exemplo ilustra como você pode trabalhar com as classes de uma base de dados sem especificar o tipo das classes; perceba que embora eu esteja acessando uma base de dados MSDE (compatível com SQL Server) e que usa a classe SQLClient eu não precisei especificar nada a respeito desta classe.
As classes do tipo Factory são capazes de criar os objetos associados que permitem o acesso a base de dados. Foi necessário apenas definir o provedor na linha de código :
Dim provider As String = "System.Data.SqlClient"
A seguir, usando o método GetFactory, criamos um DbProviderFactory baseado no provedor fornecido acima.
Dim factory As DbProviderFactory = DbProviderFactories.GetFactory(provider)
Dim cnn As DbConnection = factory.CreateConnection
Observe que criamos um DataReader e preenchemos o um DataTable usando o método Load.
Dim info As DataTable = New DataTable
info.Load(reader)
Executando o projeto teremos o seguinte resultado:
|  | 
Pegue o código do projeto aqui : acessoBD.zip
Até 
breve...
| 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 Facebook
  
 Compartilhe no Twitter
 
Compartilhe no Twitter 
Referências: