Мы переносим нашу кодовую базу из 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,но это не работает
Что мы можем сделать?
спасибо за вашу помощь