C#Object null检查

时间:2012-04-19 19:42:05

标签: c# asp.net .net sql datareader

我使用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对象以避免转换错误?

谢谢!

6 个答案:

答案 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)

答案 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"])