Olá Josimar,

Já fiz algo parecido, mas sem criar novos componentes. A intenção era
fazer os sistemas poderem suportar novos bancos de dados sem
intervenções significativas no código. 

O que fiz foi deixar de usar componentes específicos de acesso a dados
(DBX, ADO etc) na maior parte do programa e utilizar apenas Datasets de
memória (TjvMemoryData do Jedi). 

Os componentes específicos de acesso a dados (1 de conexão e 1 de query)
ficam num TDataModule que implementa uma interface (IDatabaseManager)
que contem as operações típicas de um database. A interface pode ser
vista a seguir:

http://pastebin.com/dFFeTsnj (essa URL vai expirar em 1 mês)

Numa unit compartilhada por todo o programa, declaro uma variável global
do tipo dessa interface:

var
  databaseMgr: IDatabaseManager = nil;

Num local apropriado, inicializo a variável com o Datamodule específico
para determinado Database. (Este é o único ponto do programa que deve
fazer referência ao datamodule específico.) Ex:

  dmDatabase := TdmDataBaseSqlite.create(nil);
  dataBaseMgr := dmDataBaseSqlite;

Para cada novo banco de dados que for preciso suportar, um novo
Datamodule que implemente IDatabaseManager será criado. A seleção do
Datamodule que será incluído na compilação pode ser feita com Defines ou
criando-se um DPR para cada banco de dados.

O uso, por exemplo para popular o MemoryData de um formulário é feito
assim:

  databaseMgr.openDatasetQuery(memoryDataCliente,
    'SELECT * FROM Cliente WHERE idCliente='+inttostr(idCliente));

Outros exemplos:

  databaseMgr.startTransaction;
  try
    databaseMgr.ExecSql('update Tabela set campo=campo+1');
    databaseMgr.commitTransaction;
  except
    databaseMgr.rollbackTransaction;
    raise;
  end;

  {...}

  barraFerramentas.visible := databaseMgr.getQueryValue('select
mostrarBarraFerramentas from Configuracoes')='1';

É preferível não usar dialetos específicos de SQL para facilitar a
transição entre bancos de dados. Mas se algo específico é necessário,
pode ser colocado em Views ou StoredProcedures.

A idéia no meu caso não foi desenvolver uma infraestrutura preparada
para qualquer problema futuro, mas criar o mínimo necessário para
atingir os objetivos imediatos e evoluir a estrutura conforme a
necessidade. 

Espero ter te ajudado a planejar a sua solução. 

Um abraço,
Dirlei Dionísio

Novo artigo: Quando utilizar soluções de contorno
http://MaisQueBomCodigo.blogspot.com


Em Qua, 2010-06-02 às 09:11 -0300, Josimar Zimermann escreveu:
>   
> Bom dia programadores!
> 
> Aqui na empresa estamos iniciando o desenvolvimento de uma nova 
> tecnologia interna utilizando os componentes de conexão ZEOS.
> 
> O nosso objetivo é criar uma suíte de componentes baseados no ZEOS
> que 
> carregarão dinamicamente as consultas/comandos SQL de acordo com o
> banco 
> de dados do cliente (ORACLE, MySQL, PostgreSQL).
> 
> Ainda estamos pensando onde vamos armazenar as consultas/comandos SQL 
> para depois carregá-las dinamicamente.
> 
> A minha questão: alguém tem alguma experiência com esta espécie de 
> projeto (conexão com diferentes bancos de dados e carregamento
> dinâmico 
> de SQL) ?
> O que os senhores sugerem? Tem alguma experiência com esta espécie de 
> projeto ?
> 
> Qualquer sugestão ou informação será bem-vinda!
> 
> Obrigado!
> 
> Josimar Zimermann



Responder a