Arquivos mdb (MS Access) sem ODBC

Trabalhar com arquivos MDB do Microsoft Access no Windows pode ser um tanto fácil via ODBC, mas o mesmo não é verdade em outros sistemas operacionais. Garantir a portabilidade do projeto ao se trabalhar com esse tipo de tecnologia é um desafio que vamos explorar nesse artigo.

A maioria do conteúdo que se encontra pela web tenta trabalhar com arquivos .mdb criando uma ponte JDBC-ODBC e embora você possa encontrar bons drivers ODBC, o único gratuito que encontrei para Linux foi o libmdbodbc (via repositório apt: apt-get install libmdbodbc mdbtools), porém o mesmo não suporta result set, impedindo o seu uso com o Talend/Java. Apesar disso, em conjunto com o pacote mdbtools essa é uma boa ferramenta para explorar arquivos mdb, permitindo executar queries, listar tabelas… tudo fora do Talend, claro.

Há também a possibilidade de obter drivers puramente JDBC, como o desenvolvido pela HXTT, porém esta não é uma solução gratuita. Você pode fazer o download de um trial por 30 dias, mas o result set das queries tem um limite de 1000 registros.

Assim sendo, utilizaremos um método não JDBC, tampouco ODBC, através da biblioteca Jackcess. Esta biblioteca contém uma série de funcionalidades que nos permite trabalhar com este tipo de tecnologia. Demonstrarei agora como utilizar algumas destas funcionalidades e ler o conteúdo de tabelas em arquivos access.

Primeiramente você deve ir até o site do projeto Jackcsess e realizar o download da biblioteca. Feito isso vamos carregar esta biblioteca em nosso job. Para isso utilizamos o componente tLibraryLoad, conforme na imagem abaixo:

Demonstração do componente tLibraryLoad

Observe que para carregar uma biblioteca que não está na listagem do componente, basca clicar no botão à direita da combo box e apontar para o arquivo com extensão .jar desejado. Além disso, observe também que temos três componentes tLibraryLoad neste job, isto se deve ao fato da biblioteca Jackcess possuir duas dependências: as bibliotecas commons-logging.jar e commons-lang-2.6.jar, ambas já existentes na listagem de bibliotecas do Talend.

Agora que já carregamos as bibliotecas necessárias, partiremos para a leitura dos dados do arquivo. Suponha que desejamos carregar estes dados em um Mysql. Utilizaremos então dois componentes: tJavaFlex e tMysqlOutput.

O componente tJavaFlex possui uma funcionalidade mesclada dos componentes tJava e tJavaRow. Através dele você pode trabalhar o código em três partes diferentes: Begin, Main e End. Mas antes que possamos compreender isto vamos definir o schema da tabela que pretendemos ler. Se você está em um ambiente Windows pode simplesmente abrir o Microsoft Access para obter os metadados da tabela, mas caso esteja em um ambiente Linux e tenha instalada a ferramenta mdbtools, pode executar o comando:

mdb-schema arquivo.mdb

Este comando irá listar os metadados de todas as tabelas existentes neste arquivo, e então você poderá utilizar o resultado deste comando para definir o schema do componente tJavaFlex.

Feito isso, vamos ao código que irá ler uma das tabelas e mapear o conteúdo obtido com as colunas definidas em nosso schema. Primeiramente, vamos importar as classes utilizadas, nós já carregamos as bibliotecas com os componentes tLibraryLoad, mas temos que dizer ao Java quais classes especificamente pretendemos utilizar destas bibliotecas. Para isso vá até o componente tJavaFlex e na aba Advanced:

Classes a serem importadas

Tendo importado as classes acima, vá até a aba Basic do componente tJavaFlex:

Esta aba será dividida basicamente em três partes: Start code, Main code e End code. Todo o código escrito dentro de Start code é executado uma única vez em um fluxo de dados: no início. Já o código escrito em Main code será executado linha a linha, permitindo que realizemos transformações ou meramente propaguemos dados obtidos. E por fim o código escrito em End code será executado uma única vez ao finalizar o fluxo de dados.

Esta abordagem nos permite definir no Start code o cabeçalho de um loop enquanto no Main code teremos basicamente o “corpo” do loop, onde estamos propagando o conteúdo das colunas obtidas para o fluxo “row3” que é aquele “levando” dados para o componente tMysqlOutput. Observe como no campo End code meramente fechamos o corpo do loop for com uma chave.

Além disso, no campo Start code criamos um objeto do tipo Table que recebe o resultado do método getTable, que por sua vez foi executado em um objeto do tipo Database obtido através do método Database.open(). Este objeto do tipo Table é o que nos permite executar um loop e obter os campos desejados de cada registro da tabela especificada, conforme você pode notar na declaração do loop for e no campo Main code.

Esta foi uma breve solução, você pode obter muito mais com a biblioteca Jackcess, existe uma boa documentação da API aqui.

Até a próxima.

Anúncios

Um comentário sobre “Arquivos mdb (MS Access) sem ODBC

  1. Excelente artigo! Utilizamos a sugestão para criar Jobs que Acessam web services com certificação digital para o Ministério do Planejamento e foi um sucesso. Agradecimentos a toda equipe pelos auxílios prestados a comunidade TALEND.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s