VB.NET -  Combinando dados de fonte de dados distintas

 

Você acha que é possível combinar em uma tabela dados de fontes de dados diferentes ?

 

Vamos colocar um problema que pode ocorrer no dia a dia de um desenvolvedor. (Vou pegar como exemplo o banco de dados Northwind do SQL Server e o mesmo banco de dados do MsAccess.)

 

Você precisa exibir os dados que estão em uma na tabela Orders do banco de dados Northwind do SQL Server combinados com os dados da tabela Order Details que está no banco de dados Microsoft Access Northwind.mdb.

 

Você precisa exibir os campos :

 

OrderID , CustomerID e OrderDate da tabela Orders (abaixo temos a estrutura desta tabela) do SQL Server.

 

 

e os campos :

 

ProductID , UnitPrice, Quantity e Discount da tabela Order Details (abaixo temos a estrutura desta tabela) do MsAccess.

 

 

Perceba que ambas estão relacionadas pelo campo OrderID.

 

E então , imaginando malabarismos para realizar tal proeza ?

 

E seu eu disser que com apenas uma única linha de código você resolve o problema ?????

 

Não acredita ??? Pois abaixo esta a linha de código que resolve o problema...

SELECT o.OrderID, o.CustomerID, o.OrderDate, " & "od.ProductId, od.UnitPrice, od.Quantity, od.Discount " & "FROM Orders o INNER JOIN " & "OPENROWSET('Microsoft.Jet.OLEDB.4.0','" & ConfigurationSettings.AppSettings("MsAccess_NomeBD") & "';'admin';'',[Order Details]) " & "AS od ON o.OrderID = od.OrderID " & "ORDER BY o.OrderID, od.ProductID"

Temos acima uma instrução SQL onde estamos fazendo uma junção entre as tabelas Orders e Orders Details.

Até ai tudo normal. O detalhe fica por conta de que as tabelas estão em fonte de dados diferentes.

 

Na verdade não existe nada de mágico aqui , estou usando uma já conhecida propriedade do SQL Server 2000 que é poder acessar dados de fontes de dados heterogêneas através do OLE DB.

 

Podemos fazer isto via Linked Server através das funções OPENROWSET ou OPENDATASOURCE para abrir um conjunto de linhas na fonte de dados OLE DB. Ambas as funções tomam argumentos contendo todos os dados da conexão necessárias para acessar a fonte de dados.

Isto pode ser visto no código abaixo extraído da instrução acima :

 

OPENROWSET('Microsoft.Jet.OLEDB.4.0','" & ConfigurationSettings.AppSettings("MsAccess_NomeBD") & "';'admin';'',[Order Details])

 

aqui estamos informando :

A instrução SQL não tem segredo mas para que todos entendam vou debulhar a mesma:

 

SELECT o.OrderID, o.CustomerID, o.OrderDate, " & "od.ProductId, od.UnitPrice, od.Quantity, od.Discount " & "FROM Orders o INNER JOIN " & "OPENROWSET('Microsoft.Jet.OLEDB.4.0','" & ConfigurationSettings.AppSettings("MsAccess_NomeBD") & "';'admin';'',[Order Details]) " & "AS od ON o.OrderID = od.OrderID " & "ORDER BY o.OrderID, od.ProductID"

 

Nesta linha estou selecionando os campos OrderID,CustomerID e OrderDate da tabela Orders (o) e fazendo uma junção com a tabela Order Details (od) selecionando os campos ProductId,UnitPrice,Quantity e Discount quando o campo OrderId em ambas as tabelas for igual. O resultado esta sendo ordenado pelos campos OrderID e ProductID.

 

Criando o projeto VB.NET

 

Inicie um novor projeto do tipo Windows Application usando a linguagem VB.NET e no formulário padrão inclua um componente DataGrid , um componente Button e uma Label conforme o layout abaixo:

 

Defina os imports usado pelo sistema conforme abaixo :

Imports System.Configuration
Imports System.Data.SqlClient

Em seguida vamos criar um arquivo de configuração para aplicação onde iremos armazenar as strings de conexão para o banco de dados SQL Server e para o banco de dados Access.

Abaixo o código do nosso arquivo de configuração:(Nele estou armazenando a string de conexão com o SQL Server e o nome do banco de dados Access usado no projeto.)

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<appSettings>

<add key="SqlServer_Conexao" value="Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Northwind" />

<add key="MsAccess_NomeBD" value="d:\teste\Northwind.mdb" />

</appSettings>

</configuration>

 

Nota: Para saber mais sobre como criar o seu arquivo de configuração leia o artigo : NET - Tratando arquivos de configuração

No evento Click do botão - Exibir dados combinados de fontes de dados distintas - inclua o seguinte código:

  Private Sub btnCombinarDados_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCombinarDados.Click

        ' preenche a tabela com dados do SQL Server e do MS Access
        Dim sqlSelect As String = "SELECT o.OrderID, o.CustomerID, o.OrderDate, " & "od.ProductId, od.UnitPrice, od.Quantity, od.Discount " & _
                                          "FROM Orders o INNER JOIN " & _
                                          "OPENROWSET('Microsoft.Jet.OLEDB.4.0','" & ConfigurationSettings.AppSettings("MsAccess_NomeBD") _
                                          & "';'admin';'',[Order Details]) " & "AS od ON o.OrderID = od.OrderID " & "ORDER BY o.OrderID, od.ProductID"
 
        Dim da As New SqlDataAdapter(sqlSelect, ConfigurationSettings.AppSettings("SqlServer_Conexao"))
        Dim dt As New DataTable
        da.Fill(dt)

        ' configura e vincula uma visão com dados de ambas as tabelas
        Dim dv As DataView = dt.DefaultView
        dv.AllowDelete = False
        dv.AllowEdit = False
        dv.AllowNew = False

        dg.DataSource = dv

    End Sub

 

Pegue o arquivo do exemplo aqui : combDS.zip

 

Eu sei , é apenas VB.NET , mas eu gosto.

Referências:


José Carlos Macoratti