8

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

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

谢谢!

4

6 回答 6

11

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

  • null和 DBNull 不同。

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

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

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

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

于 2012-04-19T19:45:35.750 回答
5

使用 DbNull:

http://forums.asp.net/t/1383849.aspx/1

于 2012-04-19T19:44:02.207 回答
4

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

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

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

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

于 2012-04-19T19:54:32.183 回答
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;

此外,如果列的底层 tpefdate已经是 DateTime,则不要使用 System.Convert:

DateTime? flsdate = reader["fdate"].Equals(DBNull.Value)
    ? (DateTime?)reader["fdate"])
    : null;
于 2012-04-19T19:43:27.403 回答
1

尝试以下操作:

DateTime flsdate = reader["fdate"] != null && reader["fdate"] != System.DbNull.Value
    ? DateTime.ParseExact(reader["fdate"]) 
    : DateTime.Today;
于 2012-04-19T19:43:31.523 回答
1
DateTime flsdate = DateTime.Today;
if(reader["fdate"] != null)
    flsdate = Convert.ToDateTime(reader["fdate"])
于 2012-04-19T19:45:55.000 回答