2010-07-10 20 views
1

我正在通过ODBC连接从DB2数据库读取记录。数据被填充到ODBCDataReader中。当我正在通过我的foreach循环时,我遇到了试图解析多个不同日期时间字段的问题。阅读空数据和空日期值的C#ODBCDataReader

某些字段为空,有些字段的日期时间值为空(9999-12-31 24:00:00:00),有些字段的日期时间值有效(2010-07-09 20:43:32.037234)。

我试着做这样的事情赶上空日期时间错误:!

if (!dr[dbFieldName].Equals(DBNull.Value)) 
{ 
    if (dr.GetDate(dr.GetOrdinal(dbFieldName)).Equals(DateTime.Parse("9999-12-31 24:00:00.000000"))) 
    { 
    fieldValues[tag] = ""; 
    } 
    else 
    { 
    strValue = dr.GetDate(dr.GetOrdinal(dbFieldName)).ToString("s"); 
    fieldValues[tag] = strValue.Trim(); 
    } 
} 

对GetType()名称=“为DBNull”似乎捕捉空值工作。然而,下一个if语句会引发ArgumentOutOfRangeException错误。这似乎发生在具有9999-12-31 24:00:00.000000值的字段上。

有没有办法正确解析这个?看起来像我试图评估这些空日期时间字段抛出错误的任何方式。

+0

它看起来像我不能触摸没有ArgumentOutOfRangeException的dr [dbFieldName]字段被引发时,该字段包含时间值24:00:00.000000。 – 2010-07-10 05:12:01

+0

好吧,它看起来像我找到了解决方案。我不会选择数据库中的这些DateTime字段作为时间戳,而是选择它们作为字符串。然后我可以根据需要解析这些值,并将它们放入DateTime对象中。 – 2010-07-10 05:40:29

回答

0

除了杰罗德的评论。

DateTime.Parse("9999-12-31 23:59:00.000000") is valid 
DateTime.Parse("9999-12-31 24:00:00.000000") is invalid 

更新....

问题是24:00不被认为是在24小时时钟的有效时间(不论日期)。您可以通过使用

DateTime.ParseExact("9999-12-31 24:00:00.000000", "yyyy-MM-dd 24:mm:ss.ffffff", 
System.Globalization.CultureInfo.InvariantCulture); 

之后的DateTime.TryParse方法。如果TryParse成功,则您的日期有效。如果它返回false,则执行上述状态。

+0

现在的问题是,因为“9999-12-31 24:00:00.000000”作为DateTime值无效,显然是我的ODBCDataReader包含的内容,我将如何获取该值? – 2010-07-10 03:55:44

0

两个建议:

1)使用DBNull.Value对象检查null。
2)使用DateTime.MaxValue检查12/31/999 24:00:00。

希望这可以帮助您更接近地发现问题。

+0

用建议#1更新了我的代码。 DateTime.MaxValue是只读的,并且说Raj Kaimal指出上面23:59.00是最大值。 – 2010-07-10 03:54:21

0

将IF/ELSE包装在TRY/CATCH中。这不是一个好的形式,但抓住这个例外是值得的。

+0

这是我最初使用的路线,但是我的输出/调试窗口被充斥着有关被捕获错误的消息。如果可能,我想尝试找到不涉及此方法的解决方案。 – 2010-07-10 03:58:26