繁体   English   中英

Delphi Interbase Sql转换为Sql Server和Oracle

[英]Delphi Interbase Sql Conversion to Sql Server and Oracle

我有一个使用数据库interbase / firebird的delphi应用程序。 为了查阅和写入数据,我使用了InterBase组件面板(IBTable,IBQuery,IBDataset)。 我正在执行我的系统到sqlserver / Oracle的转换,但是我有数千个查询在运行时使用数据库InterBase / Firebird的SQL指令特定组装。 任何人都知道任何组件或工具使Parse命令Interbase - > SQL Server或Interbase-> 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');

将会

'选择TBCITY的10大城市名称'

Parser.ParseTo('ORACLE');

将会

'从TBCITY中选择城市名称,其中ROWNUM <= 10'

1)AFAIK,像AnyDAC这样的库,具有SQL抽象语法 可能是您可以在SQL命令文本中使用此功能。

2)如果您在运行时组装SQL,那么为什么不只是这样编写代码:

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

我们已经在AnyDAC中实现了这一点。 您可以使用LIMIT转义功能:

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

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

我使用了来自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]);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM