2010-10-06 28 views
3

J'ai une application Delphi qui utilise la base de données interbase/firebird. Pour consulter et écrire des données, j'utilise la palette de composants InterBase (IBTable, IBQuery, IBDataset). Je suis effectuant la conversion de mon système à sqlserver/Oracle mais j'ai des milliers de requêtes qui sont assemblées à l'exécution avec SQL Instructions Spécifique de la base de données InterBase/Firebird. Quelqu'un sait tout composant ou outil qui fait des commandes d'analyse Interbase -> SQL Server ou Interbase-> Oracle?Delphi Interbase Sql Conversion en Sql Server et Oracle

ce que je besoin de ses quelque chose comme:

Var 
    Parser: TParser; 
    OutputSql: String; 
Begin 
    Parser := TParser.Create(); 
    Parser.Text := 'SELECT FIRST 10 CITYNAME FROM TBCITY'; 

    if Firebird then 
     OutPutSql := Parser.ParseTo('SQLSERVER'); 

    if Oracle then 
     OutPutSql := Parser.ParseTo('ORACLE'); 

    ComponentAccess.Sql.Text := OutPutSql; 
    ... 

Le résultat de:

Parser.ParseTo('SQLSERVER'); 

Sera

'SELECT TOP 10 CITYNAME DE TBCITY'

Et

Parser.ParseTo('ORACLE'); 

Will Be

'SELECT CITYNAME DE TBCITY OU ROWNUM < = 10'

Répondre

3

1) AFAIK, les bibliothèques comme AnyDAC, ont SQL abstraction syntax. Peut être que vous pouvez utiliser cette fonctionnalité dans votre texte de commande SQL.

2) Si vous assemblez votre SQL lors de l'exécution, alors pourquoi ne pas simplement le code comme ça:

if Firebird then 
    SQL.Add(...) 
else if Oracle then 
    SQL.Add(...) 
... 
0

Je l'ai utilisé kbmMW de Components4Developers et il a un ensemble Abstraite de requêtes qui fournissent des macros et similaires pour activer/faciliter/croiser le travail de base de données mais c'est principalement pour l'utilisation client/serveur. Devart également faire un bon ensemble de cross database components - nous utilisons leur SQL Server ensemble. Cependant, chaque projet que j'ai fait m'a permis d'écrire un ensemble spécifique de scripts SQL pour chaque base de données. De toute évidence, il existe un certain nombre de points communs pour les éléments de sélection simples, mais les ensembles de fonctionnalités des différentes bases de données sont souvent trop différents pour être facilement exploitables.

Je me retrouve avec quelque chose de similaire à la réponse de @ oodesigner, sauf que nous utilisons $ ifdef et que nous définissons mes chaînes SQL dans une unité const distincte.

{$ifdef USE_MSSQL} 
    QUERY_ONE = 'select blah blah blah...'; 
{$else} 
    QUERY_ONE = 'select nah nah nah...'; 
{$endif} 

Ensuite, dans l'unité principale une simple affectation

SQL.Text := QUERY_ONE; 

ou

SQL.Text := Format(QUERY_TWO, [some_very_carefully_quoted_stuff_or_use_params]); 

Je ne sais pas de tout ce qui permettrait d'automatiser ou l'analyser. Et le problème avec cela est que vous devez encore passer et vérifier chaque requête car il est trop facile de se tromper lors de la conversion.

2

Nous l'avons implémenté dans AnyDAC.Vous pouvez utiliser la fonction d'échappement LIMIT:

ADQuery1.Sql.Text := 'SELECT {LIMIT(10)} CITYNAME FROM TBCITY'; 

AnyDAC le convertira automatiquement en syntaxe de SGBD cible.