从DataRow(C#)检索DateTime值

如何从行中获取C#中的DateTime值,当前代码给出了错误,任何帮助都表示赞赏,数据来自进度数据库:

 foreach (DataRow r in ds.Tables[0].Rows) { string prodCode = r["PRD-CDE"].ToString(); statCode = r["STAT"].ToString(); DateTime firstIssueDate = (DateTime)(r["FISS"]); DateTime endIssueDate = (DateTime)(r["EISS"]); if(endIssueDate > DateTime.Now) { /*do some thing...*/} else {/*user invalid...*/} } 

获取日期转换和解析有两种方法,谢谢大家的帮助

最终工作代码片段:

 foreach (DataRow r in ds.Tables[0].Rows) { string prodCode = r["PRD-CDE"].ToString(),statCode = r["STAT"].ToString(); // r.("FISS"); if (r["FISS"] != DBNull.Value) { DateTime firstIssueDate = Convert.ToDateTime(r["FISS"]); if (r["EISS"] != DBNull.Value) { DateTime endIssueDate = DateTime.Parse(r["EISS"].ToString()); if (endIssueDate > DateTime.Now) { 

这只是猜测,但如果数据库中的相应类型是DateTime,您可以检查该列是否可以为空?

如果是这样,你可能想检查r["column"] == DBNull.Value然后将它传递给可以为空的DateTime? 领域。

甚至更容易:

 row.Field("column") 

如果它不是那么是,Convert.ToDateTime()或其他东西应该这样做。

编辑:

我在那里看到你的最终代码,但你有没有机会这样做:

 DateTime? firstIssueDate = r.Field("fiss"); DateTime? endIssueDate = r.Field("eiss"); if (firstIssueDate.HasValue && endIssueDate.HasValue) { firstIssueDate.Value // blah blah endIssueDate.Value // blah blah } 

如果行返回该索引的字符串,我建议使用DateTime.Parse()。

  string prodCode = r["PRD-CDE"].ToString(),statCode = r["STAT"].ToString(); DateTime firstIssueDate = DateTime.Parse(r["FISS"].ToString()); DateTime endIssueDate = DateTime.Parse(r["EISS"].ToString()); 

您也可以根据需要使用TryParse

如果要使用默认值(例如DateTime.MinValue)而不是null(DateTime?)或DBNull,则可以执行以下操作:

 var firstIssueDate = r["FISS"] as DateTime? ?? DateTime.MinValue; var endIssueDate = r["EISS"] as DateTime? ?? DateTime.MinValue; 
 foreach (DataRow r in ds.Tables[0].Rows) { string prodCode = r["PRD-CDE"].ToString(); string statCode = r["STAT"].ToString(); DateTime firstIssueDate = DateTime.Parse((r["FISS"]).ToString()); DateTime endIssueDate = DateTime.Parse((r["EISS"]).ToString()); if(endIssueDate > DateTime.Now) { /*do some thing...*/} else {/*user invalid...*/} } 

这应该编译并可能适合您。 虽然它肯定没有执行任何错误检查,你应该为生产代码。 另请查看DateTime.TryParse,您可以考虑添加IFormatProvider以确保按预期解析格式。

首先,执行r [“FISS”]。GetType()并将其打印到控制台(或暂停并在调试器中查看)。 如果它说它是一个字符串,那么上述大多数建议都会有所帮助。 如果它说了别的话,请回来更新你的问题。

作为旁边的答案,您还可以使用静态函数Convert.ToDateTime

DateTime.Parse(r [“FISS”]。ToString())是要走的路,但它会抛出“字符串未被识别为有效的DateTime”错误。 你能在r [“FISS”]栏中显示实际的字符串,这可能是国际化问题….

如果您具有需要转换为.NET DateTime类型的特殊格式(不是任何标准.NET DateTime格式)的DateTime字符串,则可以使用DateTime.ParseExact()方法。

有关详细信息(包括示例),请参阅MSDN文档 。

如果要解析多种格式,请尝试DateTime.ParseExact Method(String,String [],IFormatProvider,DateTimeStyles)