C# 对象空检查
本文关键字:检查 对象 | 更新日期: 2023-09-27 18:31:37
我用DataReader读取我的数据库。
并且某些行没有日期值。
所以当我将空日期转换为日期时间时,就会发生错误。
如何检查字段是否为空?
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;
我尝试使用平等,但它不起作用。
有人知道如何检查空对象以避免转换错误吗?
谢谢!
当每个人都向您指出如何解决问题时,我试图为您提供有关 NULL 和 DBNull 之间区别的信息。
-
null
和DBNull是不同的。 -
null
不是任何类型的实例。DBNull 是一个单例类,有一个实例:DBNull.Value
。 -
null
表示无效引用,其中 asDBNull.Value
表示 DB 中不存在的值。 -
DBNull.Value
是数据库提供程序为表中不存在的值提供的内容。
有了这个背景(reader["fdate"].Equals(null))
在这里使用是不正确的。你必须用DBNull.Value
检查它。如果它是类型 DBNull
,或者如果它等于 DBNull.Value
,则分配您喜欢的值。
使用 DbNull:
http://forums.asp.net/t/1383849.aspx/1
在这种情况下,我喜欢用引用类型(varchar 的字符串)或 Nullable 包装值类型(日期时间?)表示可为空的数据库列。 这样,您可以更准确地表示程序中的数据库架构。
这也允许您使用以下格式更简洁地编写转换逻辑:
DateTime? fdate = datareader["fdate"] as DateTime?;
如果数据读取器结果为 DbNull,并且 fdate 将设置为 default(日期时间?),则此强制转换将失败,即 null。 此时,您可以通过检查可为 null 的类型是否具有值 (fdate.HasValue),如果没有,则使用默认值 - DateTime.Today。
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;
尝试以下操作:
DateTime flsdate = reader["fdate"] != null && reader["fdate"] != System.DbNull.Value
? DateTime.ParseExact(reader["fdate"])
: DateTime.Today;
DateTime flsdate = DateTime.Today;
if(reader["fdate"] != null)
flsdate = Convert.ToDateTime(reader["fdate"])