3

データベースinterbase/firebirdを使用するdelphiアプリケーションがあります。データを調べて書き込むには、InterBaseコンポーネントパレット(IBTable、IBQuery、IBDataset)を使用します。システムをsqlserver/Oracleに変換していますが、データベースInterBase/Firebirdに固有のSQL命令を使用して実行時にアセンブルされる数千のクエリがあります。解析コマンドをInterbase->SQLServerまたは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');

になります

'SELECT CITYNAME FROM TBCITY WHERE ROWNUM <= 10'

4

3 に答える 3

3

1) 私の知る限り、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を使用しました。これには、/ easy /クロスデータベース作業を可能にするマクロなどを提供する抽象化されたクエリのセットがありますが、これは主にクライアント/サーバーで使用するためのものです。Devartは、クロスデータベースコンポーネントの優れたセットも実行します。SQLServerセットを使用します。ただし、私が行った各プロジェクトでは、データベースごとに特定の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 に答える