Преобразование Delphi Interbase Sql в Sql Server и Oracle - PullRequest
3 голосов
/ 07 октября 2010

У меня есть приложение Delphi, которое использует базу данных interbase / firebird. Для консультации и записи данных я использую Палитра компонентов InterBase (IBTable, IBQuery, IBDataset). я выполняет преобразование моей системы в SQL Server / Oracle, но у меня есть тысячи запросов, которые собираются во время выполнения с инструкциями SQL Специфика базы данных InterBase / Firebird. Кто-нибудь знает любой компонент или инструмент, который делает команды разбора 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');

будет

'ВЫБЕРИТЕ ТОП-10 CITYNAME FROM TBCITY'

И

Parser.ParseTo('ORACLE');

Будет

'ВЫБЕРИТЕ CITYNAME ИЗ TBCITY, ГДЕ ROWNUM <= 10' </p>

Ответы [ 3 ]

3 голосов
/ 07 октября 2010

1) AFAIK, библиотеки, подобные AnyDAC, имеют синтаксис SQL-абстракции . Может быть, вы можете использовать эту функцию в тексте команды SQL.

2) Если вы собираете SQL во время выполнения, то почему бы просто не написать такой код:

if Firebird then
  SQL.Add(...)
else if Oracle then
  SQL.Add(...)
...
2 голосов
/ 07 октября 2010

Мы реализовали это в AnyDAC. Вы можете использовать функцию выхода LIMIT:

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

AnyDAC автоматически переведет это в целевой синтаксис СУБД.

0 голосов
/ 07 октября 2010

Я использовал kbmMW из Components4Developers , и у него есть абстрактный набор запросов, которые предоставляют макросы и тому подобное для включения / упрощения / кросс-работы с базами данных, но в основном для использования клиентом / сервером. Devart также делает хороший набор кросс-компонентов базы данных - мы используем их SQL Server . Тем не менее, в каждом проекте, который я сделал, я заканчивал тем, что писал определенный набор сценариев SQL для каждой базы данных. Очевидно, что есть простые точки соприкосновения для простых вещей выбора, но наборы функций различных баз данных часто слишком различны, чтобы сделать его легко выполнимым.

Я получаю нечто похожее на ответ @ oodesigner, за исключением того, что мы используем $ ifdef и определяем мои строки SQL в отдельном модуле const.

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

Не знаю ничего, что могло бы автоматизировать или проанализировать это. И проблема в том, что вам все еще нужно пройти и проверять каждый запрос , потому что слишком легко ошибиться при конвертации.

...