Oracle DataReader 在 GetDateTime 上出错

Posted

技术标签:

【中文标题】Oracle DataReader 在 GetDateTime 上出错【英文标题】:Oracle DataReader Erroring on GetDateTime 【发布时间】:2017-07-25 21:28:22 【问题描述】:

当我尝试读取特定日期列时,我有一个特定的数据行抛出此错误 - “年、月和日参数描述了无法表示的日期时间”。

我正在提取数百行数据,除了这一行之外,它们都可以工作。除了这个日期时间列之外,我可以从这个有问题的行中提取其他列。我正在使用 oracle 数据阅读器从数据库中获取日期时间,我可以使用 Visual Studio 中的监视工具检查我将要读取的行。监视工具中的一切看起来都很好 - 它可以看到我的列我试图以日期时间的形式读入并具有它的所有属性。

      while (reader.Read())
                
                    var temp = new FCCondition();
                    temp.CaseID = reader.GetString(0);                      
                    temp.Statute = reader.GetString(1);
                    if (!reader.IsDBNull(2))
                        temp.DueDate = reader.GetDateTime(2);
                    if (!reader.IsDBNull(3))
                        temp.HoursAssigned = reader.GetInt32(3);
                    if (!reader.IsDBNull(4))
                        temp.HoursCompleted = reader.GetInt32(4);
                    temp.JWConditionID = reader.GetString(5);
                    if (!reader.IsDBNull(6))                      
                            temp.StartDate = reader.GetDateTime(6);                                                                          
                    if (!reader.IsDBNull(7))
                        temp.StatusDate = reader.GetDateTime(7);
                    if (temp.DueDate <= temp.StartDate)
                        temp.DueDate = temp.StartDate.AddMonths(18);                        
                    FCConditionsList.Add(temp);
                
            

引发错误的是在读取 StartDate (reader.GetDateTime(6)) 时。我已经尝试将它存储在一个 var 中并将它与 reader.GetOracleDate 和 reader.GetValue 一起使用,它们仍然会抛出相同的错误。

我尝试读取的日期时间值为:6/7/2017 5:16:41 PM 我在该列中包含了手表工具在尝试读取之前状态的屏幕截图

【问题讨论】:

我认为第 6 列和第 7 列可能会颠倒过来。错误应该发生在 DueDate,因为它为空。 @jdweng 如果是这样的话,它应该跳过那行代码,因为我有 DBNull 检查,对吧? 当您接近创建Minimal, Complete, and Verifiable example 时,您会发现为什么您发布的代码会引发异常。您可以从基于“select sysdate from dual”创建阅读器的函数开始,也可以开始在现有函数中删减代码。 Net 不允许 DateTime 为空。相反,默认的 1/1/01 用于 Net 中的 DateTime。我不确定 Oracle 是如何工作的。 你确定,绝对确定是这条线吗?我知道甲骨文对数字很有趣。我有点惊讶您没有收到 (3) 和 (4) 的错误,它显示为十进制,但您似乎可以使用 GetInt32 读取。如果您不介意我问,这些字段的 Oracle 数据类型是什么(我在 Oracle 中总是将 NUMBER(9,0) 用于 .Net 整数)。 【参考方案1】:

我怀疑GetDateTime 调用没有期待 AM/PM 符号?因此,它可能无法将其识别为有效的日期/时间。试试这个:

if (!reader.IsDBNull(6)) 
  var temporaryDate = reader.GetValue(6).ToString();

  DateTime outDate;
  if (DateTime.TryParseExact(temporaryDate, "M/dd/yyyy h:mm:ss tt", null, DateTimeStyles.None, out outDate))
  
    temp.StartDate = outDate;
  

编辑:我今天自己也遇到了同样的问题,并以不同的方式解决了它......我正在使用 Oracle 数据访问托管客户端

if (!reader.IsDBNull(6)) 
  var tempDate = reader.GetOracleDate(6);
  temp.StartDate = new DateTime(tempDate.Year, tempDate.Month, tempDate.Day, tempDate.Hour, tempDate.Minute, tempDate.Second);

【讨论】:

但它处理 GetDateTime(2) 并且有 AM?两者也都显示为对象 Sysem.DateTime。所以我认为它与 AM/PM 没有任何关系? 只是一种预感,GetDateTime(2) 返回了不同格式的日期,易于理解 12/31 - 但任何人都可以猜测 6/7 的日期...

以上是关于Oracle DataReader 在 GetDateTime 上出错的主要内容,如果未能解决你的问题,请参考以下文章

即使在 VB.NET 中使用 ORDER BY 子句,Oracle DataReader 也会被排序

检索大型记录集时 DataReader 挂起

如何使用 DataReader 读取数据库记录并将其添加到 DataTable

保留来自 dataReader c# 的 int 变量值

循环 Oracle 数据读取器返回不一致的结果

在 DataReader 中查看更新