当前位置: 首页 > 编程语言 > C#

如何从数据库中获取可以为空的DateTime分享

时间:2023-04-10 13:53:59 C#

C#学习教程:如何从数据库中获取可为空的日期时间如何在我的C#应用程序中将它们转换为可为null的DateTime对象?这是我认为的样子,但它不是:DateTime?dt=(DateTime?)sqldatareader[0];SQLnull与.NETnull不同;您必须与System.DBNull.Value进行比较:objectsqlDateTime=sqldatareader[0];约会时间?dt=(sqlDateTime==System.DBNull.Value)?(DateTime?)null:Convert.ToDateTime(sqlDateTime);在回答您的评论时,DataReader的Item属性的数据类型是基础数据库类型数据类型。对于非空SQLServer数据库,它可以是System.DBNull,对于空列可以是System.Data.Odbc.OdbcTypes.SmallDateTime,对于ODBC数据库可以是System.Data.Odbc.OdbcTypes.SmallDateTime,或者几乎任何东西。您唯一可以依赖的是它是对象类型。这就是为什么我建议使用Convert.ToDateTime()而不是强制转换为DateTime的原因。无法保证您可以将ODBC或任何日期列转换为.NETDateTime。我注意到您的评论指定了一个“sqldatareader”,并且SQLServerSystem.Data.SqlTypes.SqlDateTime确实可以强制转换为System.DateTime,但您最初的问题并没有告诉我们这一点。有关使用DataReader的更多信息,请参阅MSDN。我最近发现了这个技巧,很简单:DateTime?dt=sqldatareader[0]asDateTime?;您需要检查值“是DBNull”而不是null。我在我的博客上发布了一个小助手类:http://improve.dk/archive/2007/10/08/handling-dbnulls.aspx一旦你实现了这个类,你就可以像这样使用它:DateTime?dt=DBConvert。至(sqldatareader[0]);前阵子,我为DataRow写了一堆扩展方法来做这种向下转换……因为我不喜欢写重复的文件。用法很简单:foreach(DataRowdrinsomeDataTable){DateTime?dt=dr.CastAsDateTimeNullable("lastUpdated");intid=dr.CastAsInt("transactionID");//等}这是DateTime值部分。添加其他数据类型的实现应该非常简单。如果人们如此倾向于对DataReader做同样的事情,这并不困难。我试着想出泛型方法,但是泛型方法的局限性使得它很难或不可能做到并且仍然得到我想要的行为(例如,空值而不是默认值(T)-获取SQLNULL的默认值会区分0和null...困难)。publicstaticclassDataRowExtensions{#regiondowncasttoDateTimepublicstaticDateTimeCastAsDateTime(thisDataRowrow,intindex){returntoDateTime(row[index]);}publicstaticDateTimeCastAsDateTime(thisDataRowrow,stringcolumnName){returntoDateTime(row[columnName]);公共静态日期时间?CastAsDateTimeNullable(这个DataRowrow,intindex){returntoDateTimeNullable(row[index]);公共静态日期时间?CastAsDateTimeNullable(这个DataRowrow,stringcolumnName){returntoDateTimeNullable(row[columnName]);}#region转换助手privatestaticDateTimetoDateTime(objecto){DateTimevalue=(DateTime)o;返回值;私人静态日期时间?toDateTimeNullable(objecto){boolhasValue=!(oisDBNull);约会时间?value=(hasValue?(DateTime?)o:(DateTime?)null);返回值;}#endregion#endregion向下转换为DateTime//...省略其他实现..为简洁起见}Dat电子时代?dt=空;if(sqldatareader[0]!=System.DbNull.Value){dt=(DateTime)sqldatareader[0];只需使用:System.NullableyourVariableName;让自己轻松:)如何创建辅助方法privatestaticDateTime?MyDateConverter(对象o){返回(o==DBNull.Value||o==null)?(DateTime?)null:Convert.ToDateTime(o);获取DateTime共享的所有内容,可以为空。如果对你有用,需要了解更多C#学习教程,希望大家多加关注——MyDateConverter(sqldatareader[0])本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: