未找到时区区域

时间:2017-11-24 08:22:02

标签: c# asp.net-mvc database oracle

我正在创建一个使用Oracle数据库的C#MVC项目。在尝试连接到数据库时,我收到以下错误:

  

ORA-00604:递归SQL级别1发生错误   ORA-01882:未找到时区区域。

enter image description here

当我尝试通过SQL开发人员连接时,它工作正常。有什么办法可以解决这个问题吗?

注意:我正在使用IIS express进行测试

5 个答案:

答案 0 :(得分:2)

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

注意:请检查它们并为您的应用程序使用更新的Oracle版本。

ORA-01882: timezone region not found

答案 1 :(得分:1)

此代码未提供答案,但可能有助于找到您的问题。 代码太大而无法发表评论。

请执行此程序。什么是输出?它在哪里失败了?

  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的文字:

  

斯里兰卡

     

来自Paul Eggert(2013-02-21):   米尔恩说:“马德拉斯从1898年5月1日开始使用时间。在这之前,科伦坡   平均时间,5小时。 4米。 21.9s。 F.,被使用了。“但是5:04:21.9有很大不同   来自科伦坡的经络5:19:24,所以现在忽略米尔恩并坚持下去   Shanks和Pottenger。

     

来自Paul Eggert(1996-09-03):   “斯里兰卡将时钟提前一小时以避免停电”   (http://www.virtual-pc.com/lankaweb/news/items/240596-2.html,1996-05-24,   自1999-08-17起不再可用)   据报道,“该国的标准时间将提前一小时   周五午夜(格林尼治标准时间1830)“鉴于当前的电力危机”。“

     

来自斯里兰卡媒体大臣达马西里·塞纳纳亚克(1996-10-24)的报道   由Shamindra在每日新闻 - 热门新闻组    (1996年10月26日):   由1996年10月26日上午12时30分起生效   斯里兰卡将比格林威治标准时间早六(06)小时。

     

来自JesperNørgaardWelen(2006-04-14),引用斯里兰卡新闻在线   http://news.sinhalaya.com/wmview.php?ArtID=11002(2006-04-13):   2006年4月15日0030时(2006年4月14日午夜+30分钟)   目前,2006年4月14日(2006年4月14日午夜)成为2400小时。

     来自路透社的Peter Apps和Ranga Sirila(2006-04-12):   http://today.reuters.co.uk/news/newsArticle.aspx?type=scienceNews&storyID=2006-04-12T172228Z_01_COL295762_RTRIDST_0_SCIENCE-SRILANKA-TIME-DC.XML   [泰米尔猛虎组织]从未接受原始的1996年时间变化而且简单   保持他们的时钟比格林威治标准高出五个半小时   时间(GMT),与邻国印度一致。   来自Paul Eggert(2006-04-18):   居住在泰米尔人控制地区的人可以使用[TZ ='Asia / Kolkata'],   该区域自1970年截止日期以来已同意泰米尔地区。

     

来自Sadika Sumanapala(2016-10-19):   根据{{​​3}}(由测量单位维护,   标准与斯里兰卡服务部)斯里兰卡的缩写   标准时间是SLST。

     

来自Paul Eggert(2016-10-18):   “SLST”似乎是合理的近期,很少在外面使用   区域书呆子来源。我查了谷歌新闻,发现了三个用途   它在2月份的印度国际商业时报和   今年3月讨论板球比赛时,但没什么   从那时起(虽然有很多板球)并没有任何内容   其他英语新闻来源。我们旧的缩写“LKT”是   更糟。现在,让我们使用数字缩写;我们可以   如果它接通,则切换到“SLST”。

我认为您的数据库无法识别您计算机的当前本地时区。可能有三种可能的解决方案:

  • 将您的计算机区域设置更改为更稳定的设置,例如印度
  • 使用最新版本的时区文件更新数据库,请参阅http://www.sltime.org
  • 如果您使用ODP.NET非托管驱动程序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托管驱动程序不会读取此注册表值。

答案 2 :(得分:0)

我在Pivotal Cloud Foundry上使用ODP.NET for .NET Core时遇到了同样的问题。核心问题是缺少时区信息。

通过为我的实例设置“ TZ”环境变量来添加时区。这为我解决了这个问题。

答案 3 :(得分:0)

带有控制器的.Net Core 3.1 API中存在相同的问题。

在调试时出现错误,并解决了此问题,并在\ Properties \ launchSettings.json上添加了TZ:

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

答案 4 :(得分:-1)

根据thisthis

C:\Program Files\datamodeler 3\datamodeler\bin\datamodeler.conf添加

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