FireDAC «таблица или представление не существует» при вставке в ORACLE TABLE Delphi Belin 10.1 upd 2 - PullRequest
1 голос
/ 02 октября 2019

Мы переносим нашу кодовую базу из Delphi XE3 с FireDAC 8.0.5 в Delphi Berlin 10.1 Upd 2 с FireDAC 15.0.1 (сборка 86746). С MS Sql Server все работает гладко, но с ORACLE это была другая история.

Во всем исходном коде приложения мы используем множество TAdQuery с инструкциями sql, такими как

AdQuery1.Sql.Text := 'SELECT FIELD1, FIELD2 FROM TABLE1';

Чтобы вставить запись, мы используем методы Append или Insert, например:

AdQuery1.Insert; // или AdQuery1.Append;

Сразу после вызова метода Post внутренний компонентсоздает оператор INSERT sql, который выглядит следующим образом

INSERT INTO TABLE1 (FIELD1, FIELD2) VALUES(:FIELD1, :FIELD2)

Таким образом, запись вставляется успешно.

Теперь, используя TFdQuery в Delphi Berlin, компонент создает внутреннеоператор INSERT sql, такой как

INSERT INTO USERNAME.TABLE1 (FIELD1, FIELD2) VALUES(:FIELD1, :FIELD2)

Сбой с [FireDAC] [Phys] [Ora] ORA-00942: таблица или представление не существует

Это происходит потому, что в нашей базе данных Oracle TABLE1 создается в схеме с именем MAIN_SCHEMA, и мы получаем к ней доступ с помощью открытого синонима.

Пытаясь найти обходной путь, мы сравнили исходный код FireDAC, обнаружив, что

в Delphi XE3, блок uADDAptManager.pas , по его функции TADDAptTableAdapter. GetUpdateRowCommand , вызовы oConn.CreateCommandGenerator(oCmdGen, nil);

в Delphi Berlin, единица FireDAC.DApt.pas , по своей функции TFDDAptTableAdapter.GetUpdateRowCommand , звонки oConn.CreateCommandGenerator(oCmdGen, GetSelectCommand);

Всякий раз, когда второй параметр (называемый ACommand: IFDPhysCommand) равен , а не nil , возвращается имя таблицы, объединяющее имя пользователя (в функции с именем TFDPhysCommandGenerator.GetFrom ).

Если мы добавим 'MetaCurSchema=MAIN_SCHEMA' к параметрам TFdConnection, он будет работать с приложениями, которые не используют соединение в пуле, но у нас есть несколько процессов, которые используют соединение в пуле с теми же параметрами, даже параметром MetaCurSchema,но это не работает

Что мы можем сделать?

спасибо за вашу помощь

1 Ответ

4 голосов
/ 03 октября 2019

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

Итак, согласно документации:

Полные имена объектов

FireDACподдерживает полные имена объектов, в том числе имена каталогов и / или схем.

Когда для StoredProcName, TableName и т. д. указано короткое имя объекта, они будут расширены до полных имен объектов с использованием текущего каталога и/ или имена схем. Чтобы переопределить или избежать использования имен текущего каталога и / или схемы, используйте параметры определения соединения MetaCurCatalog и MetaCurSchema . Например:

[Oracle_Demo]
 DriverID=Ora  
 ...
 MetaCurCatalog=*
 MetaCurSchema=*

~ Источник: Имена объектов (FireDAC) - docWiki

MetaCurSchema

Указывает текущую схему для приложения. Если не указан, то его значение будет получено из СУБД. Когда приложение запрашивает метаданные и не указывает имя схемы, FireDAC будет неявно использовать текущую схему.
Если MetaCurSchema равно '*', то имена схем будут исключены из параметров метаданных.

~ Источник: Общие параметры подключения (FireDAC) - docWiki

Эта звездочка (*) должна помочь, давайтезнать, если это так.

...