[delphi-br] Carregamento dinâmico de consultas SQL

2010-06-02 Por tôpico Josimar Zimermann
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


Re: [delphi-br] Carregamento dinâmico de consultas SQL

2010-06-02 Por tôpico Dirlei
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