Преобразование Delphi Interbase Sql в Sql Server и Oracle

у меня есть приложение delphi, которое использует базу данных interbase / firebird. Для просмотра и записи данных я использую палитру компонентов InterBase (IBTable, IBQuery, IBDataset). Я выполняю преобразование своей системы в sqlserver / 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 НАЗВАНИЙ ГОРОДА ИЗ TBCITY'

А также

Parser.ParseTo('ORACLE');

Будет

'ВЫБРАТЬ НАЗВАНИЕ ГОРОДА ИЗ TBCITY, ГДЕ СТРОКА ‹= 10'


person Mauro Reis    schedule 06.10.2010    source источник


Ответы (3)


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

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

if Firebird then
  SQL.Add(...)
else if Oracle then
  SQL.Add(...)
...
person oodesigner    schedule 07.10.2010

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

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

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

person da-soft    schedule 07.10.2010

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

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

{$ifdef USE_MSSQL}
  QUERY_ONE = 'select blah blah blah...';
{$else}
  QUERY_ONE = 'select nah nah nah...';
{$endif}

Затем в основном блоке простое задание

SQL.Text := QUERY_ONE;

or

SQL.Text := Format(QUERY_TWO, [some_very_carefully_quoted_stuff_or_use_params]);

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

person shunty    schedule 07.10.2010