我使用DataReader读取了我的数据库。
并且某些行没有fdate值。
所以当我将null日期转换为DateTime时会出现Error。
如何检查字段是否为空?
AdsCommand cmd = conn.CreateCommand();
cmd.CommandText = "select name,fdate from abc";
AdsDataReader reader = cmd.ExecuteReader();
DateTime flsdate = (reader["fdate"].Equals(null))? Convert.ToDateTime(reader["fdate"]) : DateTime.Today;
我尝试使用Equals,但它不起作用。
任何人都知道如何检查null对象以避免转换错误?
谢谢!
答案 0 :(得分:11)
当大家指出如何解决问题时,我试图向您提供有关NULL和DBNull之间区别的信息。
null
和DBNull不同。
null
不是任何类型的实例。 DBNull是一个包含一个实例的单例类:DBNull.Value
。
null
表示无效的引用,其中DBNull.Value
表示数据库中不存在的值。
DBNull.Value
是数据库提供程序为表中的不存在值提供的内容。
使用此背景(reader["fdate"].Equals(null))
在此处使用不正确。您必须使用DBNull.Value
进行检查。如果它是DBNull
类型,或者它等于DBNull.Value
,那么请分配您喜欢的值。
答案 1 :(得分:5)
使用DbNull:
答案 2 :(得分:4)
在这种情况下,我喜欢使用引用类型(varchar的字符串)或Nullable包装的值类型(DateTime?)来表示可以为空的数据库列。这样,您就可以更准确地表示程序中的数据库架构。
这也允许您使用以下格式更清晰地编写转换逻辑:
DateTime? fdate = datareader["fdate"] as DateTime?;
如果datareader结果是DbNull并且fdate将设置为默认值(DateTime?),则该转换将失败,该值为null。此时,您可以通过检查可空类型是否具有值(fdate.HasValue)来获取实际所需值,如果不是,则使用您的默认值 - DateTime.Today。
答案 3 :(得分:2)
DateTime flsdate = reader["fdate"].Equals(DBNull.Value)
? Convert.ToDateTime(reader["fdate"])
: DateTime.Today;
但将日期默认为Today
似乎很危险。我会这样做:
DateTime? flsdate = reader["fdate"].Equals(DBNull.Value)
? Convert.ToDateTime(reader["fdate"])
: (DateTime?)null;
此外,如果fdate
列的基础tpe已经是DateTime,请不要使用System.Convert:
DateTime? flsdate = reader["fdate"].Equals(DBNull.Value)
? (DateTime?)reader["fdate"])
: null;
答案 4 :(得分:1)
尝试以下方法:
DateTime flsdate = reader["fdate"] != null && reader["fdate"] != System.DbNull.Value
? DateTime.ParseExact(reader["fdate"])
: DateTime.Today;
答案 5 :(得分:1)
DateTime flsdate = DateTime.Today;
if(reader["fdate"] != null)
flsdate = Convert.ToDateTime(reader["fdate"])