.net Oracle.ManagedDataAccess错误读取DST日期

.net Oracle.ManagedDataAccess错误读取DST日期,.net,oracle,date,dst,.net,Oracle,Date,Dst,我正在编写一个运行在Oracle 11.2.0.2.0数据库之上的.Net应用程序,该数据库将日期存储在“带有本地时区的时间戳(6)”类型的列中。如果列中存储有日期且该日期在DST范围内,则在使用Oracle.ManagedDataAccess库时读取的日期不正确。它似乎总是正确地写入/更新日期。此外,在使用Oracle.DataAccess库时,它始终正确处理日期 在我的示例中,我使用的时区为“美国/纽约”,日期/时间为2014年1月8日12:00:00。以下是错误读取日期的代码片段: IDb

我正在编写一个运行在Oracle 11.2.0.2.0数据库之上的.Net应用程序,该数据库将日期存储在“带有本地时区的时间戳(6)”类型的列中。如果列中存储有日期且该日期在DST范围内,则在使用Oracle.ManagedDataAccess库时读取的日期不正确。它似乎总是正确地写入/更新日期。此外,在使用Oracle.DataAccess库时,它始终正确处理日期

在我的示例中,我使用的时区为“美国/纽约”,日期/时间为2014年1月8日12:00:00。以下是错误读取日期的代码片段:

IDbConnection cxn = new Oracle.ManagedDataAccess.Client.OracleConnection(ConnStr);
// Using the following library works correctly: 
// IDbConnection cxn = new Oracle.DataAccess.Client.OracleConnection(ConnStr);
cxn.Open();

var cmd = cxn.CreateCommand();
cmd.CommandText = "alter session set time_zone='America/New_York'";
cmd.ExecuteNonQuery();
cmd.CommandText = "SELECT TEST_DATE FROM TEST_TABLE WHERE ROWNUM=1";
return (DateTime)cmd.ExecuteScalar();

当使用值08/01/2014 12:00:00更新该列时,该列将被读取为08/01/2014 11:00:00。如果我使用的日期不在DST范围内(例如12/01/2014 12:00:00),它将正确读取日期。有什么想法吗?我一直在到处搜索,但没有找到关于这个问题的任何文档。我可能不得不切换回Oracle.DataAccess,但希望避免它。提前谢谢

Oracle.ManagedDataAccess仍然很新,因此您也总是会遇到“最新”的bug

还有其他方法可以定义当前会话时区,可能是以下工作之一

  • 使用OracleGlobalization类:

    this.Connection = new OracleConnection();
    this.Connection.ConnectionString = ...
    this.Connection.Open();
    OracleGlobalization info = this.Connection.GetSessionInfo();
    info.TimeZone = "America/New_York";
    this.Connection.SetSessionInfo(info);
    
    非常仔细地测试一下,我在
    OracleGlobalization
    方面的经验非常糟糕。还测试
    this.Connection.OpenWithNewPassword(…)
    ,不仅
    这个.Connection.Open()。当我使用
    OpenWithNewPassword
    时,我的应用程序在没有任何错误的情况下崩溃(即使在Visual Studio中调试时也是如此!)

  • ORA_SDTZ
    设置为系统中的环境变量

  • 在注册表中设置时区,它是HKEY\U LOCAL\U MACHINE\SOFTWARE\ORACLE\KEY{your\U ORACLE\U HOME\U NAME}\ORA\U SDTZ的字符串值,例如

    对于x64(64位)应用程序

    Windows Registry Editor Version 5.00
    
    [HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient11g_home1]
    "ORA_SDTZ"="America/New_York"
    
    Windows Registry Editor Version 5.00
    
    [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_OraClient11g_home1]
    "ORA_SDTZ"="America/New_York"
    
    对于x86(32位)应用程序

    Windows Registry Editor Version 5.00
    
    [HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient11g_home1]
    "ORA_SDTZ"="America/New_York"
    
    Windows Registry Editor Version 5.00
    
    [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_OraClient11g_home1]
    "ORA_SDTZ"="America/New_York"
    
    注意,ODP.NET托管驱动程序不读取任何注册表值,因此这更像是其他驱动程序的信息


我遇到了同样的问题。第一个想法(OracleGlobalization)不起作用,因为错误已经在.Open()上抛出。Env变量似乎没有效果。在我的例子中,注册表项也不是一个选项,因为我在Linux中运行.NET内核。还有其他想法吗?谢谢