【问题标题】:Timezone region not found未找到时区区域
【发布时间】:2018-05-08 05:18:05
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我看到的大多数解决方案都与 JAVA 相关,而不是 C# :(
  • 请将异常添加为文本而非图像。
  • 你可以直接输入...
  • 它可以帮助搜索此错误文本的其他人找到您的答案。顺便说一句:只需在错误消息框上按Ctrl+C 即可将文本放到剪贴板上。
  • 谢谢@Uwe ..这是一个很好的提示:)

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


【解决方案1】:

在带有控制器的 .Net Core 3.1 API 中遇到了同样的问题。

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

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

【讨论】:

    【解决方案2】:

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

    请执行这个程序。输出是什么?哪里失败了?

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

    斯里兰卡

    来自保罗·埃格特(2013-02-21): 米尔恩说“马德拉斯的平均时间从 1898 年 5 月 1 日开始使用。在此之前科伦坡 平均时间,5 小时。 4米。 21.9 秒。 F., 被使用了。”但是 5:04:21.9 差别很大 来自科伦坡的子午线 5:19:24,所以现在忽略 Milne 并坚持 香克斯和波滕格。

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

    引自斯里兰卡媒体部长 Dharmasiri Senanayake (1996-10-24) 通过 Shamindra 在每日新闻 - 热门新闻部分 (1996-10-26): 自 1996 年 10 月 26 日凌晨 12 时 30 分起生效 斯里兰卡将比格林威治标准时间早六 (06) 小时。

    来自 Jesper Nørgaard Welen (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): 根据http://www.sltime.org(由测量单位维护, Standards & Services Department, Sri Lanka) 斯里兰卡的缩写 标准时间是 SLST。

    来自保罗·埃格特(2016-10-18): “SLST”似乎是相当近的,并且很少在外部时间使用 区域书呆子来源。我搜索了谷歌新闻,发现了三种用途 它在二月份的印度国际商业时报和 今年 3 月讨论板球比赛时间时,但没有 从那以后(尽管有很多板球比赛)并且什么都没有 其他英语新闻来源。我们的旧缩写“LKT”是 更糟糕。现在,让我们使用数字缩写;我们可以 如果它赶上,切换到“SLST”。

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

    • 将您的计算机区域设置更改为更稳定的设置,例如印度
    • 用最新版本的时区文件更新数据库,见Upgrading the Time Zone File and Timestamp with Time Zone Data
    • 如果您使用 ODP.NET 非托管驱动程序Oracle.DataAccess.dll(很遗憾您没有告诉我们),您可以将ORA_SDTZ 环境变量或注册表项HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_&lt;Oracle home name&gt;\ORA_SDTZ / HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_&lt;Oracle home name&gt;\ORA_SDTZ 设置为所需的时区值。请注意,ODP.NET 托管驱动程序不会读取此注册表值。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 这对我的团队有用。将环境变量添加到我们的容器中,现在我们可以连接到 Oracle,TY!我相信这是从 .Net 程序中解决此问题的最佳正确答案。
      • @JoshuaGunder 可以将docker statement 分享到 dockerfile 以运行它吗?谢谢
      【解决方案4】:

      实际上,此错误是由于您使用的应用程序 Oracle 驱动程序和数据库的 Oracle 版本存在问题。

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

      ORA-01882: timezone region not found

      【讨论】:

        【解决方案5】:

        根据thisthis

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

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

        【讨论】:

        • 我已经尝试过您回答中提到的那些解决方案。但我的电脑中没有这样的文件夹。感谢您的回答
        • TO 说,它在 SQL-Developer 中工作,任何让 SQL-Developer 工作的提示都是无用的。
        • 我最初是为 Oracle 回答的。然后通过忘记它适用于 SQL 来为 SQL 编辑它。现在已编辑答案
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-07
        • 2019-11-26
        • 2012-07-25
        • 2020-10-12
        • 1970-01-01
        • 2011-02-01
        • 2021-01-21
        相关资源
        最近更新 更多