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