3

我有一个使用数据库 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 中选择 TOP 10 城市名'

Parser.ParseTo('ORACLE');

将会

'从 ROWNUM <= 10 的 TBCITY 中选择城市名'

4

3 回答 3

3

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

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

if Firebird then
  SQL.Add(...)
else if Oracle then
  SQL.Add(...)
...
于 2010-10-07T04:45:03.183 回答
2

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

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

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

于 2010-10-07T18:50:07.013 回答
0

我使用了来自Components4Developers的 kbmMW ,它有一组抽象的查询,提供宏等来启用/更容易/跨数据库工作,但它主要用于客户端/服务器使用。Devart还做了一套很好的跨数据库组件——我们使用他们的SQL Server集。但是,我完成的每个项目最终都为每个数据库编写了一组特定的 SQL 脚本。显然,简单的选择内容有一些共同点,但不同数据库的功能集通常差异太大,无法轻松使用。

除了我们使用 $ifdef 并在单独的 const 单元中定义我的 SQL 字符串之外,我最终得到了类似于 @oodesigner 的响应。

{$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]);

不知道任何可以自动化或解析它的东西。这样做的问题是您仍然必须检查每个查询,因为转换时很容易出错。

于 2010-10-07T08:36:58.353 回答