关于 c#:Timezone region not found | 珊瑚贝

Timezone region not found


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

ORA-00604: error occurred at recursive SQL level 1
ORA-01882: timezone region not found.

enter

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

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

  • 我看到的大多数解决方案都与 JAVA 而不是 C# 相关 :(
  • 请将例外添加为文本而不是图像。
  • 这不是我在调试时遇到的错误。当我尝试使用凭据生成连接时会发生这种情况。因此我没有任何堆栈跟踪要分享..这就是我得到的
  • 你可以直接输入…
  • 它有什么用? …如果您能专注于这个问题,我将不胜感激。谢谢
  • 它可以帮助搜索此错误文本的其他人找到您的答案。顺便说一句:只需在错误消息框上按 Ctrl C 即可将文本放到剪贴板上。
  • 谢谢@Uwe ..这是一个很好的提示:)
  • 您使用哪个驱动程序/提供商?您的驱动程序和数据库的版本是什么?
  • “ODAC”的意思是”Oracle 数据访问组件”,只是一组下载。您使用哪个提供商?有哪些版本? (数据库和提供者)
  • 我的糟糕,它的 ODP.NET
  • 为什么你不能回答我的问题?你喜欢为你解决任何问题吗?再次:哪个提供商?有哪些版本?向我们展示您用于连接的代码。
  • 您的数据库中的时区文件是什么?检查 SELECT * FROM V$TIMEZONE_FILE;
  • @Wernfried,没有任何代码,我只是想将 oracle DB 与 MVC 应用程序连接起来。为此,我使用了视觉工作室的功能。我的项目中没有专门安装任何数据访问驱动程序。我只是使用 ODP.net,它使我能够通过连接字符串直接与 DB 连接。对于您的最后一个问题.. 我没有足够的权限在数据库中运行查询。我想这会对你有所帮助
  • 版本和时区文件呢?如果您不知道,请询问您的 DBA。


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

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

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


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

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

ORA-01882: 未找到时区


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

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

1
2
3
4
5
6
“Docker”: {

  “environmentVariables”: {
       “TZ”:“WET”
      }
}

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
  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 时区数据库中的文本:

Sri Lanka

From Paul Eggert (2013-02-21):
Milne says”Madras mean time use from May 1, 1898. Prior to this Colombo
mean time, 5h. 4m. 21.9s. F., was used.” But 5:04:21.9 differs considerably
from Colombo’s meridian 5:19:24, so for now ignore Milne and stick with
Shanks and Pottenger.

From Paul Eggert (1996-09-03):
“Sri Lanka advances clock by an hour to avoid blackout”
(http://www.virtual-pc.com/lankaweb/news/items/240596-2.html, 1996-05-24,
no longer available as of 1999-08-17)
reported”the country’s standard time will be put forward by one hour at
midnight Friday (1830 GMT) ‘in the light of the present power crisis’.”

From Dharmasiri Senanayake, Sri Lanka Media Minister (1996-10-24), as quoted
by Shamindra in Daily News – Hot News Section
(1996-10-26):
With effect from 12.30 a.m. on 26th October 1996
Sri Lanka will be six (06) hours ahead of GMT.

From Jesper N??rgaard Welen (2006-04-14), quoting Sri Lanka News Online
http://news.sinhalaya.com/wmview.php?ArtID=11002 (2006-04-13):
0030 hrs on April 15, 2006 (midnight of April 14, 2006 +30 minutes)
at present, become 2400 hours of April 14, 2006 (midnight of April 14, 2006).

From Peter Apps and Ranga Sirila of Reuters (2006-04-12) in:
http://today.reuters.co.uk/news/newsArticle.aspx?type=scienceNews&storyID=2006-04-12T172228Z_01_COL295762_RTRIDST_0_SCIENCE-SRILANKA-TIME-DC.XML
[The Tamil Tigers] never accepted the original 1996 time change and simply
kept their clocks set five and a half hours ahead of Greenwich Mean
Time (GMT), in line with neighbor India.


From Paul Eggert (2006-04-18):
People who live in regions under Tamil control can use [TZ=’Asia/Kolkata’],
as that zone has agreed with the Tamil areas since our cutoff date of 1970.

From Sadika Sumanapala (2016-10-19):
According to http://www.sltime.org (maintained by Measurement Units,
Standards & Services Department, Sri Lanka) abbreviation for Sri Lanka
standard time is SLST.

From Paul Eggert (2016-10-18):
“SLST” seems to be reasonably recent and rarely-used outside time
zone nerd sources. I searched Google News and found three uses of
it in the International Business Times of India in February and
March of this year when discussing cricket match times, but nothing
since then (though there has been a lot of cricket) and nothing in
other English-language news sources. Our old abbreviation”LKT” is
even worse. For now, let’s use a numeric abbreviation; we can
switch to”SLST” if it catches on.

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

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

根据这个和这个:

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

1
AddVMOption Duser.timezone=“+02:00”
  • 我已经尝试过您回答中提到的那些解决方案。但我的电脑中没有这样的文件夹。谢谢你的回答
  • TO 说,它在 SQL-Developer 中工作,任何使 SQL-Developer 工作的提示都是无用的。
  • 我最初是为 Oracle 回答的。然后通过忘记它适用于 SQL 来为 SQL 编辑它。答案已编辑


来源:https://www.codenong.com/47469074/

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?