Контейнер док-станции ядра asp.net с использованием Oracle Managed Driver Core. выбрасывает ORA-00604 и ORA-01882 при открытии соединения
Я получаю приведенное ниже исключение при попытке подключиться к базе данных Oracle с помощью управляемого доступа к данным Oracle для ядра dotnet ( https://www.nuget.org/packages/Oracle.ManagedDataAccess.Core/) из контейнера докера. Я не получаю исключение за пределами докера
Действия по воспроизведению:
- Open VS 2017
- Файл> Создать> Проект...
- Visual C#>.Net Core> Веб-приложение ASP.Net Core
- Нажмите Ok
- Выберите "Веб-приложение (модель-представление-контроллер)"
- снимите флажок "Включенная поддержка Docker"
- снимите флажок "Настроить для HTTPS"
- Нажмите Ok
- В консоли диспетчера пакетов выполните
Install-Package Oracle.ManagedDataAccess.Core -Source nuget.org -Version 2.18.3
- Вставьте код в метод HomeController.Index
- Установить точку останова на линии
con.Open();
- Нажмите кнопку "Отладка IIS Express"
- Не возникает исключение при попытке открыть соединение.
- Прекратить отладку
- Щелкните правой кнопкой мыши веб-проект в обозревателе решений> Добавить> Поддержка Docker.
- Выберите переключатель "Linux" и нажмите "ОК".
- Щелкните правой кнопкой мыши веб-проект в обозревателе решений> Добавить> Поддержка контейнера Orchestrator.
- В раскрывающемся списке выберите "Docker Compose" и нажмите "ОК" (в зависимости от установленной версии Visual Studio 2017 это может отличаться)
- Нажмите Да, если появятся какие-либо всплывающие окна с просьбой перезаписать файлы
- Нажмите кнопку "Отладка" Создать "".
- Исключение будет выдано при попытке открыть соединение
Код:
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.
}
Исключение:
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()
3 ответа
Я только что пришел к решению в аналогичном контексте (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);
Эта ошибка устранена в последней
Oracle.ManagedDataAccess.Core
нужет пакет.
Оставляю команду на добавление переменной TZ в контейнер:
docker run -e TZ=Америка/Монтевидео -d -p 7991:80 --name name imagename
также добавьте переменную в launchSettings проекта:
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"TZ": "America/Montevideo"
}
}
Я надеюсь, что это сработает для вас