Fórum Aplicação em qualquer banco de dados. #266444

27/01/2005

0

Olá amigos :D ,

Estou projetando um sistema que deverá rodar tanto em SQL Server quanto em Oracle. Por isso, estou tentando fazer de uma forma que acesse também Firebird, entre outros...
Pensei em separar os fontes para cada um dos bancos. Mas acredito que essa não seria a solução mais inteligente [rs].
A parte de acesso aos dados não é tão dofícil, mas sim as consultas, updates, etc...
Deveria usar ODBC? Ou qual componente de acesso acham melhor?
Ex:

:arrow: [b:b33564a6cd]OUTER JOIN[/b:b33564a6cd]
========
SQL Server : CAMPO1 =* CAMPO2
Oracle : CAMPO1 =+ CAMPO2

:arrow: [b:b33564a6cd]NULOS[/b:b33564a6cd]
=====
SQL SERVER : IsNUll( CAMPO1, ´xxx´)
ORACLE : Nvl( CAMPO1, ´xxx´ )

Já passaram por isso?
Poderiam me dar uma ajuda / opnião sobre o assunto.

Abraços.

Valeu!


Hebrao

Hebrao

Responder

Posts

27/01/2005

Gandalf.nho

Acho que a melhor sugestão seria usar DBExpress


Responder

Gostei + 0

27/01/2005

Hebrao

Uh... ok.
E como faço com a diferença de sintaxe entre um banco de dados e outro, como por exemplo o IsNull x NVL?

[]´s

Heber


Responder

Gostei + 0

28/01/2005

Isabelct

Eu já trabalhei em um projeto aonde o sistema tinha que rodar tanto em Oracle quanto em SQL Server, e a saída encontrada para a diferença de sintaxe foi verificar em runtime qual era o banco de dados atual (através de um parâmetro, por exemplo) e conforme o banco, atribuir o comando corresponente.

Algo bem no tipo

 if BancoDeDados = bdOracle then
  { comandos para Oracle }
else if BancoDeDados = bdSQLServer then
  { comandos para SQL Server }
else
  { outros comandos }


Acho que não tem como fugir muito disso...


Responder

Gostei + 0

28/01/2005

Marcio.theis

Um dos nossos sistemas da empresa trabalha com 5 bancos de dados diferentes, sendo que para isto uilizamos componentes da paleta ADO e para definir qual banco de dados a acessar utilizamos o UDL. Os comando de SQL utilizados no sistema são verificados em cada banco de dados, e caso precise de algo mais específico, ai sim é criado um controle com if´s para definir qual a forma de comando a executar. Mas acredito que você consiga fazer isto de forma mais fácil programando em camadas, podendo utilizar algo parecido como MVC para o Java, onde que você teria uma camada de Modelo do banco de dados, uma de Controle de tipos de campos, etc... e uma View mas esta seria igual para todos, e ainda uma camada de Ragras, podendo ter as Regras Gerais e Regras Específicas, esta para cada banco de dados, pois ai vc poderia fazer todos com unit´s separadas, tendo por exemplo um .pas para cada banco e caso seu cliente quer em Oracle, colocaria somente as unit´s do Oracle e compilaria..... Uma idéia que eu dou, mas tb existem outras ainda.


Responder

Gostei + 0

28/01/2005

Bon Jovi

Em alguns casos, de funções simples como esse ISNULL, vc pode simplesmente criar uma função sua no banco, que tenha o mesmo nome e parâmetros em todos os bancos usados, onde executará a função específica do banco. Ou seja, vc cria uma função chamada ISNULL (ou outro nome qualquer q ache melhor) dentro do Oracle que repasse os parâmetros pro NVL ser usado dentro da mesma. Enfim, no seu caso terá a função com nome ISNULL nos dois bancos.

Pra outros casos que não dá pra seguir esse caminho, faço métodos no Delphi, em uma classe que centraliza tratamentos de multidatabase, sem precisar redundar querys ou procedimentos para cada banco na camada de regras de negócio.

Sobre joins especiais, não aconselho usar * do SQL Server e nem (+) do Oracle, e sim LEFT JOIN, RIGHT JOIN, etc, que é do padrão ANSI. SQL Server 2000 e Oracle 9 suportam esse padrão. Caso tenha q usar obrigatoriamente o Oracle 8, a saída então é entrar na 2º solução que falei, criando um método no Delphi passando o nome do campo1 e campo2 no parâmetro e retornando a string montada com o operador correspondente ao banco.


Responder

Gostei + 0

29/01/2005

Denis

Concordo plenamente com o que o Bon Jovi disse.

Use o SQL Ansi e não terá problemas.

Eu tenho um sistema que roda em MySql, em SqlServer e tbm em Interbase. Todas as rotinas funcionam perfeitamente. E eu ainda uso BDE com os componentes normais de acesso a dados como query, database , etc...

Dica. Seja simples e não invente muito.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar