oracle 未找到时区区域

46scxncf  于 2022-11-03  发布在  Oracle
关注(0)|答案(6)|浏览(182)

我正在创建一个使用Oracle数据库的C# MVC项目。在尝试连接到数据库时,出现以下错误:
ORA-00604:递归SQL级别1出错
ORA-01882:未找到时区区域。

当我尝试通过SQL Developer连接时,它工作正常。有什么方法可以解决这个问题吗?
注意:我正在使用IIS Express进行测试

piztneat

piztneat1#

我在Pivotal Cloud Foundry上使用.NET Core的ODP.NET时也遇到了同样的问题,核心问题是缺少时区信息。
通过为我的示例设置“TZ”环境变量添加了一个时区。这为我解决了这个问题。

pgx2nnw8

pgx2nnw82#

实际上,这个错误是因为您使用的应用程序Oracle驱动程序和Oracle版本的DB的一些问题。

**注意:**请选中这两个选项,并为您得应用程序使用更新得Oracle版本.

ORA-01882: timezone region not found

r7knjye2

r7knjye23#

使用控制器的.Net Core 3.1 API也有同样的问题。
在调试时出现错误,通过在\Properties\launchSettings.json上添加TZ解决了该错误:

"Docker": {
...
   "environmentVariables": {
        "TZ": "WET"
      }
}
7uzetpgm

7uzetpgm4#

此代码不提供答案,但它可能有助于找到您的问题。此代码太大,无法进行注解。
请执行这个程序。输出是什么?它在哪里失败?

static void Main(string[] args)
  {
     Console.WriteLine("OracleGlobalization.TimeZone = {0}", Oracle.DataAccess.Client.OracleGlobalization.GetClientInfo().TimeZone);
     Console.WriteLine(String.Empty);

     Console.WriteLine("TimeZone.CurrentTimeZone.StandardName = {0}", TimeZone.CurrentTimeZone.StandardName);
     Console.WriteLine("TimeZone.CurrentTimeZone.DaylightName = {0}", TimeZone.CurrentTimeZone.DaylightName);
     Console.WriteLine(String.Empty);

     Console.WriteLine("TimeZoneInfo.Local.DisplayName = {0}", TimeZoneInfo.Local.DisplayName);
     Console.WriteLine("TimeZoneInfo.Local.Id = {0}", TimeZoneInfo.Local.Id);
     Console.WriteLine("TimeZoneInfo.Local.StandardName = {0}", TimeZoneInfo.Local.StandardName);
     Console.WriteLine("TimeZoneInfo.Local.DaylightName = {0}", TimeZoneInfo.Local.DaylightName);
     Console.WriteLine(String.Empty);

     var str = new Oracle.DataAccess.Client.OracleConnectionStringBuilder();
     str.UserID = "<username>";
     str.Password = "<password>";
     str.DataSource = "<database name>";
     using ( var con = new Oracle.DataAccess.Client.OracleConnection(str.ConnectionString) ) {
        con.Open();
        Console.WriteLine("Oracle.DataAccess: OracleConnection -> SessionInfo.TimeZone = {0}", con.GetSessionInfo().TimeZone);
        Console.WriteLine("Oracle.DataAccess: Version = {0}", FileVersionInfo.GetVersionInfo(con.GetType().Assembly.Location).FileVersion.ToString());

        var tz = new Oracle.DataAccess.Client.OracleCommand("SELECT SESSIONTIMEZONE FROM dual", con).ExecuteScalar();
        Console.WriteLine("Oracle.DataAccess: SESSIONTIMEZONE = {0}", tz.ToString());
        con.Close();
     }
     Console.WriteLine(String.Empty);

     var strm = new Oracle.ManagedDataAccess.Client.OracleConnectionStringBuilder();
     str.UserID = "<username>";
     str.Password = "<password>";
     str.DataSource = "<database name>";
     using ( var con = new Oracle.ManagedDataAccess.Client.OracleConnection(str.ConnectionString) ) {
        con.Open();
        Console.WriteLine("Oracle.ManagedDataAccess: OracleConnection -> SessionInfo.TimeZone = {0}", con.GetSessionInfo().TimeZone);
        Console.WriteLine("Oracle.ManagedDataAccess: Version = {0}", FileVersionInfo.GetVersionInfo(con.GetType().Assembly.Location).FileVersion.ToString());

        var tz = new Oracle.ManagedDataAccess.Client.OracleCommand("SELECT SESSIONTIMEZONE FROM dual", con).ExecuteScalar();
        Console.WriteLine("Oracle.ManagedDataAccess: SESSIONTIMEZONE = {0}", tz.ToString());
        con.Close();
     }
  }

更新

根据您的个人资料,您的总部位于斯里兰卡。斯里兰卡的时区似乎相当“不稳定”,请参阅IANA TimeZone Database中的文本:
斯里兰卡Name
保罗·埃格特(2013年2月21日):米尔恩说:“马德拉斯的平均时间是从1898年5月1日开始使用的。在此之前,科隆博的平均时间是5 h. 4 m. 21.9s. F.。”但是5:04:21.9与科伦坡的子午线5:19:24有很大的不同,所以现在忽略米尔恩,坚持使用Shanks和Pottenger。
保罗·埃格特(1996年9月3日):《斯里兰卡将时钟提前一小时以避免停电》(http://www.virtual-pc.com/lankaweb/news/items/240596-2.html,1996-05-24,1999-08-17不再提供)报道说,“鉴于目前的电力危机,斯里兰卡的标准时间将在星期五午夜(格林尼治标准时间1830)提前一小时。”
Shamindra在《每日新闻-热点新闻》栏目(1996-10 - 26)中引用了斯里兰卡媒体部长Dharmasiri Senanayake(1996-10 - 24)的话:从1996年10月26日上午12时30分起,斯里兰卡将比格林尼治标准时间提前六(6)小时。
Jesper Nørgaard Welen(2006-04-14)引用斯里兰卡在线新闻http://news.sinhalaya.com/wmview.php?ArtID=11002(2006-04-13):00时30分(2006年4月14日午夜+30分钟),变为2006年4月14日24时(2006年4月14日午夜)。
摘自路透社记者彼得·阿普斯和兰加·西里拉(2006-04-12):[泰米尔猛虎组织]从未接受1996年的时间调整,只是将他们的时钟设置为比格林威治标准时间(GMT)早五个半小时,与邻国印度保持一致。
保罗·埃格特(2006年4月18日):生活在泰米尔控制地区的人可以使用[TZ ='亚洲/加尔各答'],因为自1970年我们的截止日期以来,该地区与泰米尔地区达成了协议。
(2016-10-19)中国农业大学根据http://www.sltime.org(由斯里兰卡标准与服务部测量单位维护),斯里兰卡标准时间的缩写为SLST。
来自保罗·埃格特(2016-10-18):“SLST”似乎是一个相当新的、很少被使用的时区以外的书呆子来源。我搜索了谷歌新闻,发现今年2月和3月在印度的《国际商业时报》(International Business Times of India)上讨论板球比赛时间时有三次使用它,但从那以后就没有了(尽管有很多板球比赛),在其他英语新闻来源中也没有。我们的旧缩写“LKT”更糟糕。就目前而言,让我们使用数字缩写;如果流行的话我们可以换成SLST
我假设您的数据库无法识别您计算机的当前本地时区。可能有三种可能的解决方案:

  • 将您的计算机区域设置更改为更稳定的设置,例如印度
  • 使用最新版本的时区文件更新数据库,请参阅使用时区数据升级时区文件和时间戳
  • 如果您使用ODP.NET Unmanaged驱动程序Oracle.DataAccess.dll(很遗憾您没有告诉我们),您可以将ORA_SDTZ环境变量或注册表项HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_<Oracle home name>\ORA_SDTZ/HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_<Oracle home name>\ORA_SDTZ设置为所需的时区值。注意,ODP.NET Managed驱动程序不会读取此注册表值。
ozxc1zmp

ozxc1zmp5#

根据this直接从一个Oracle雇员,设置UseHourOffsetForUnsupportedTimezone属性为真的连接,然后再打开它。

con.UseHourOffsetForUnsupportedTimezone = true;
con.Open();

这对我很有用,因为我无法控制OracleDB服务器,而且在我的跨平台应用程序中,环境变量的用法在Linux发行版中并不一致。我在所有发行版上运行了Weinfried的代码片段进行测试,在我的情况下,OracleDB没有时区差异(都是UTC,没有DST),但在同一个plank上仍然失败。

ohfgkhjo

ohfgkhjo6#

根据thisthis
C:\Program Files\datamodeler 3\datamodeler\bin\datamodeler.conf中添加

AddVMOption -Duser.timezone="+02:00"

相关问题