VB - Vinculando tabelas de banco de dados diferentes


Já precisou trabalhar com mais de um banco de dados ? Você sabe como podemos trabalhar com tabelas de banco de dados diferentes em uma conexão ADO ?

Neste artigo eu vou mostrar como fazer uma junção com tabelas que estão em banco de dados diferentes.

Para poder alcançar nosso objetivo teremos que usar ADOX - ADO Extension for DDL and Security ; ela é uma extensão do modelo objeto ADO padrão que oferece objetos para manipular informações sobre os objetos do seu banco dados e questões relacionadas a segurança. Ela fornece os métodos , eventos e propriedades 

Eu tenho dois banco de dados : Empregados.mdb. e Departamentos.mdb.

1- O banco de dados Departamentos.mdb possui a tabela Setores que tem a seguinte estrutura.

Os dados da tabela Funcionarios são :

2- O banco de dados Departamentos.mdb possui a tabela Setores que tem a seguinte estrutura.

Os dados da tabela Setores são :

Meu objetivo é criar abrir o banco de dados Departamentos.mdb e criar um link com a tabela funcionarios do banco de dados Empregados.mdb após fazer a vinculação vou executar uma consulta junção entre as tabelas dois dois banco de dados e exibr os dados. Vou usar ADOX para fazer esta operação.

Leia o artigo - ADOX - Gerenciando o seu banco de dados - para saber mais sobre o assunto.

Crie um novo projeto do tipo EXE no VB e faça referência no seu projeto as seguintes librarys:

No formulário padrão eu vou apenas exibir o resultado da consulta junção entre as duas tabelas por isto inclua apenas um botão de comando e um TextBox conforme o layout abaixo:

O banco de dados Departamentos.mdb contém a tabela Setores com os campos : SetorId e NomeSetor

O banco de dados Empregados.mdb contém a tabela Funcionarios com os campos: Nome,Sobrenome,Cargo , Rua , Cidade, Estado, Cep e SetorId.

O campo SetorId é o vínculo com a tabela Setores. Como existe esta relação eu posso fazer a consulta junção e exibir o nome, cargo e o setor.

O código associado ao evento Click do botão de comando é dado a seguir :

Private Sub cmdExecute_Click()

Dim app_path As String
Dim Arq_DB As String
Dim conn As ADODB.Connection
Dim adox_catalog As ADOX.Catalog
Dim adox_table As ADOX.Table
Dim rs As ADODB.Recordset
Dim i As Integer
Dim txt As String

    ' Encontra o caminho da aplicação
    app_path = App.Path
    If Right$(app_path, 1) <> "\" Then app_path = app_path & "\"

    ' Abre o banco de dados Departamentos
    Arq_DB = app_path & "Departamentos.mdb"
    Set conn = New ADODB.Connection
    conn.ConnectionString = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & Arq_DB & ";" & _
        "Persist Security Info=False"
    conn.Open

    ' Cria um link para a tabela funcionarios no banco de dados Funcionarios
    Set adox_catalog = New ADOX.Catalog

    ' Liga a tabela vinculada com conexão aberta
    Set adox_catalog.ActiveConnection = conn

    Set adox_table = New ADOX.Table
    With adox_table
        Set .ParentCatalog = adox_catalog
        .Name = "LinkedTable"
        .Properties("Jet OLEDB:Link Datasource") = app_path & "Empregados.mdb"
        .Properties("Jet OLEDB:Link Provider String") = "MS Access"
        .Properties("Jet OLEDB:Remote Table Name") = "Funcionarios"
        .Properties("Jet OLEDB:Create Link") = True
    End With

    ' Inclui a tabela na coleção Tables
    adox_catalog.Tables.Append adox_table

    ' Realiza a consulta
    Set rs = conn.Execute( _
        "SELECT * " & _
        "FROM Setores, LinkedTable " & _
        "WHERE Setores.SetorId = LinkedTable.SetorId", , adCmdText)

    ' Mostra o resultado
    Do While Not rs.EOF
        txt = txt & rs.Fields(0).Value
        For i = 1 To rs.Fields.Count - 1
            txt = txt & ", " & rs.Fields(i).Value
        Next i
        txt = txt & vbCrLf
        
        rs.MoveNext
    Loop
    rs.Close
    txtResults.Text = txt

    ' Exclui o link do banco de dados Departamentos
    adox_catalog.Tables.Delete "LinkedTable"

    ' Fecha a conexao
    conn.Close
End Sub

Após realizar a consulta o resultado será o seguinte :

Agora você já sabe como tratar tabelas de banco de dados diferentes que estão relacionadas.  Hasta la vista 


José Carlos Macoratti