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;

我尝试使用平等,但它不起作用。

有人知道如何检查空对象以避免转换错误吗?

谢谢!

C# 对象空检查

当每个人都向您指出如何解决问题时,我试图为您提供有关 NULL 和 DBNull 之间区别的信息。

  • null和DBNull是不同的。

  • null不是任何类型的实例。DBNull 是一个单例类,有一个实例:DBNull.Value

  • null表示无效引用,其中 as DBNull.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"])