Контейнер док-станции ядра asp.net с использованием Oracle Managed Driver Core.выбрасывает ORA-00604 и ORA-01882 при открытии соединения - PullRequest
0 голосов
/ 28 ноября 2018

Я получаю приведенное ниже исключение при попытке подключиться к базе данных Oracle с использованием Oracle Managed Data Access для ядра dotnet (https://www.nuget.org/packages/Oracle.ManagedDataAccess.Core/) изнутри контейнера Docker. Я не получаю исключение за пределами Docker

Шаги для воспроизведения:

  1. Открыть VS 2017
  2. Файл> Создать> Проект ...
  3. Visual C #> .Net Core> ASP.NetБазовое веб-приложение
  4. Нажмите «ОК»
  5. Выберите «Веб-приложение (Model-View-Controller)» *
  6. снимите флажок «Включена поддержка Docker»
  7. снимите флажок «Настроитьдля HTTPS '
  8. Нажмите Ok
  9. В консоли диспетчера пакетов выполните Install-Package Oracle.ManagedDataAccess.Core -Source nuget.org -Version 2.18.3
  10. Вставьте код в метод HomeController.Index
  11. Установите точку останова на линии con.Open();
  12. Нажмите кнопку «Отладка IIS Express»
  13. При попытке открыть соединение не возникает исключение.
  14. Остановите отладку
  15. Щелкните правой кнопкой мыши веб-проект вОбозреватель решений> Добавить> Поддержка Docker
  16. Выберите радио "Linux", нои нажмите кнопку OK
  17. Щелкните правой кнопкой мыши веб-проект в обозревателе решений> Добавить> Поддержка оркестра контейнеров
  18. В раскрывающемся списке выберите «Создать докер» и нажмите кнопку «ОК» (в зависимости от версии Visual Studio 2017установлено, это может отличаться)
  19. Нажмите Да, если появятся какие-либо всплывающие окна с просьбой перезаписать файлы
  20. Нажмите кнопку «Отладка« Создать »»
  21. При попытке открыть будет выдано исключениесоединение

Код:

var strm = new Oracle.ManagedDataAccess.Client.OracleConnectionStringBuilder();
strm.UserID = "<username>";
strm.Password = "<password>";
strm.DataSource = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=<db_host>)(PORT = 1521))) (CONNECT_DATA=(SERVICE_NAME=<service_name>)))";
using (var con = new Oracle.ManagedDataAccess.Client.OracleConnection(strm.ConnectionString))
{
     con.Open(); // Exception thrown here.
}

Исключение:

Exception in VS

Oracle.ManagedDataAccess.Client.OracleException
  HResult=0x80004005
  Message=ORA-00604: error occurred at recursive SQL level 1
ORA-01882: timezone region not found
  Source=Oracle Data Provider for .NET, Managed Driver
  StackTrace:
   at OracleInternal.ConnectionPool.PoolManager`3.Get(ConnectionString csWithDiffOrNewPwd, Boolean bGetForApp, OracleConnection connRefForCriteria, String affinityInstanceName, Boolean bForceMatch)
   at OracleInternal.ConnectionPool.OraclePoolManager.Get(ConnectionString csWithNewPassword, Boolean bGetForApp, OracleConnection connRefForCriteria, String affinityInstanceName, Boolean bForceMatch)
   at OracleInternal.ConnectionPool.OracleConnectionDispenser`3.Get(ConnectionString cs, PM conPM, ConnectionString pmCS, SecureString securedPassword, SecureString securedProxyPassword, OracleConnection connRefForCriteria)
   at Oracle.ManagedDataAccess.Client.OracleConnection.Open()
   at WebApplication8.Controllers.HomeController.Index() in C:\Users\me\source\repos\WebApplication8\WebApplication8\Controllers\HomeController.cs:line 22
   at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters)
   at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.SyncActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeActionMethodAsync>d__12.MoveNext()

Обновление:

Я проводил дополнительное тестирование на основе ответа @silent ниже и выяснил кое-что интересное.Если я откатился до версии 2.12.0-бета3 ядра ODP.Net (https://www.nuget.org/packages/Oracle.ManagedDataAccess.Core) и удалил переменную среды TZ = America / Denver), я смогу открыть соединение без ошибок.Похоже, что-то было введено в 2.18.3 , что вызывает требование к переменной среды TZ при открытии соединения внутри док-контейнера.

1 Ответ

0 голосов
/ 28 ноября 2018

Я только что пришел к решению в аналогичном контексте (Oracle DB 11.2.0.4.0 и пакет NuGet Oracle.ManagedDataAccess.Core 2.18.3):

Добавьте переменную среды с именем TZ к вашемуКонтейнер и установите значение вашего часового пояса, например, CET

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

this.Connection = new OracleConnection();
this.Connection.ConnectionString = ...
this.Connection.Open();
OracleGlobalization info = this.Connection.GetSessionInfo();
info.TimeZone = "America/New_York";
this.Connection.SetSessionInfo(info);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...