2010-10-06 25 views
3

我有一個delphi應用程序,它使用數據庫 interbase/firebird。爲了諮詢和寫入數據,我使用了InterBase組件面板(IBTable,IBQuery,IBDataset) 。我是 執行我的系統到sqlserver/Oracle的轉換,但我有 成千上萬的查詢在運行時與SQL指令 特定的數據庫InterBase/Firebird。任何人都知道 任何組件或工具,使Parse命令Interbase - > SQL Server或Interbase->甲骨文?德爾福Interbase SQL轉換爲SQL Server和Oracle

我需要的是這樣的:

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; 
    ... 

的結果:

Parser.ParseTo('SQLSERVER'); 

'SELECT TOP 10 CITYNAME FROM TBCITY'

而且

Parser.ParseTo('ORACLE'); 

'SELECT CITYNAME FROM TBCITY WHERE ROWNUM < = 10'

回答

3

1)AFAIK,像AnyDAC庫,具有SQL abstraction syntax。也許你可以在你的SQL命令文本中使用這個功能。

2)如果你正在組裝您在運行SQL,那麼爲什麼不只是這樣的代碼是:

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

我用kbmMW從Components4Developers,它有一個抽象組提供宏和類似查詢以啓用/更容易/跨數據庫工作,但主要是客戶端/服務器使用。 Devart也做好了一套cross database components - 我們使用他們的SQL Server集合。但是,我已經完成的每個項目都最終爲每個數據庫編寫了一組特定的SQL腳本。顯然,對於簡單的選擇內容有一些共同點,但不同數據庫的功能集通常太不同,不便於操作。

我最終得到類似於@ oodesigner的響應,除了我們使用$ ifdef並在單獨的const單元中定義我的SQL字符串。

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

然後在主單元的簡單分配

SQL.Text := QUERY_ONE; 

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

不知道任何會自動或解析它。問題在於,您仍然需要檢查每個查詢,因爲轉換時很容易出錯。

2

我們已經在AnyDAC中實現了。您可以使用LIMIT轉義函數:

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

AnyDAC會自動將其轉換爲目標DBMS語法。