Mat*_*t M 6 c# oracle docker .net-core
当尝试从Docker容器内部使用针对dotnet核心的Oracle托管数据访问(https://www.nuget.org/packages/Oracle.ManagedDataAccess.Core/)连接到oracle数据库时,收到以下异常。我没有在Docker之外收到异常
重现步骤:
Install-Package Oracle.ManagedDataAccess.Core -Source nuget.org -Version 2.18.3con.Open();码:
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.
}
Run Code Online (Sandbox Code Playgroud)
例外:
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()
Run Code Online (Sandbox Code Playgroud)
我根据下面的@silent答案进行了一些其他测试,发现了一些有趣的东西。如果我回滚到ODP.Net核心的2.12.0-beta3版本(https://www.nuget.org/packages/Oracle.ManagedDataAccess.Core)并删除了TZ = America / Denver环境变量,打开连接没有错误。似乎2.18.3 中引入了一些内容,导致在docker容器内打开连接时导致对TZ环境变量的需求。
我只是在类似的背景下(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);
Run Code Online (Sandbox Code Playgroud)