Delphi Interbase Sql 转换为 Sql Server 和 Oracle

3

我有一个使用数据库Interbase/Firebird的Delphi应用程序。为了查询和写入数据,我使用InterBase组件面板(IBTable、IBQuery、IBDataset)。我正在将我的系统转换为SQL Server/Oracle,但是我有成千上万个查询,这些查询在运行时与特定于InterBase/Firebird数据库的SQL指令一起组装。是否有任何组件或工具可以将Interbase命令解析为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个回答

3

1)据我所知,像AnyDAC这样的库有SQL抽象语法。也许您可以在SQL命令文本中使用此功能。

2)如果您是在运行时组装SQL,则为什么不直接编写如下代码:

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

2
我们已经在 AnyDAC 中实现了这个功能。您可以使用 LIMIT 转义函数:
ADQuery1.Sql.Text := 'SELECT {LIMIT(10)} CITYNAME FROM TBCITY';

AnyDAC会自动将其转换为目标DBMS语法。

0

我曾使用过Components4Developers的kbmMW,它具有一组抽象化的查询提供宏等功能以实现更容易/轻松/的跨数据库工作,但主要用于客户端/服务器端使用。Devart也提供了一套很好的跨数据库组件,我们使用他们的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]);

不知道有什么可以自动化或解析它的东西。而且问题在于你仍然需要逐个检查每个查询,因为在转换时很容易出错。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接