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 :
o provedor OLE DB usado : Microsoft.Jet.OLEDB.4.0
o nome do banco de dados ( gravado no arquivo de configuração) : ConfigurationSettings.AppSettings("MsAccess_NomeBD")
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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a Objetos com VB .NET
José Carlos Macoratti