我正在创建一个使用Oracle数据库的C#MVC项目。在尝试连接到数据库时,我收到以下错误:
ORA-00604:递归SQL级别1发生错误 ORA-01882:未找到时区区域。
当我尝试通过SQL开发人员连接时,它工作正常。有什么办法可以解决这个问题吗?
注意:我正在使用IIS express进行测试
答案 0 :(得分:2)
实际上,这个错误是因为您使用的Oracle驱动程序和Oracle版本的DB的某些问题。
注意:请检查它们并为您的应用程序使用更新的Oracle版本。
答案 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”。
我认为您的数据库无法识别您计算机的当前本地时区。可能有三种可能的解决方案:
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)