【问题标题】:C# Object null checkC# 对象空检查
【发布时间】:2012-05-01 09:50:15
【问题描述】:

我使用 DataReader 读取我的数据库。

并且某些行没有 fdate 值。

所以当我将空日期转换为 DateTime 时,就会发生错误。

如何检查该字段是否为空?

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,但它不起作用。

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

谢谢!

【问题讨论】:

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


【解决方案1】:
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;

【讨论】:

    【解决方案2】:

    尝试以下方法:

    DateTime flsdate = reader["fdate"] != null && reader["fdate"] != System.DbNull.Value
        ? DateTime.ParseExact(reader["fdate"]) 
        : DateTime.Today;
    

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

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

        • null 和 DBNull 不同。

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

        • null 表示无效引用,而DBNull.Value 表示 DB 中不存在的值。

        • DBNull.Value 是数据库提供程序为表中不存在的值提供的内容。

        在这种背景下,(reader["fdate"].Equals(null)) 在这里使用是不正确的。您必须使用DBNull.Value 进行检查。如果它是DBNull 类型,或者等于DBNull.Value,则分配您喜欢的任何值。

        【讨论】:

        • +1 用于实际解释某些事情。我冒昧地对其进行了一些编辑;请回滚您不同意的任何更改。
        • @phoog 感谢您的改进。
        【解决方案5】:
        DateTime flsdate = DateTime.Today;
        if(reader["fdate"] != null)
            flsdate = Convert.ToDateTime(reader["fdate"])
        

        【讨论】:

          【解决方案6】:

          在这种情况下,我喜欢用引用类型(varchar 的字符串)或 Nullable 包装值类型(DateTime?)来表示可为空的数据库列。这样您就可以更准确地表示程序中的数据库模式。

          这也允许您使用以下格式更清晰地编写转换逻辑:

          DateTime? fdate = datareader["fdate"] as DateTime?;
          

          如果数据读取器结果为 DbNull 并且 fdate 将设置为默认值(DateTime?),则此转换将失败,即为空。此时,您可以通过检查可空类型是否有值 (fdate.HasValue) 来获得您真正想要的值,如果没有,则使用您的默认值 - DateTime.Today。

          【讨论】:

            猜你喜欢
            • 2011-01-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-01-05
            • 2011-10-25
            • 2014-03-01
            • 1970-01-01
            • 2018-12-21
            相关资源
            最近更新 更多