如何安全地将可空结果从sqlreader转换为int?

时间:2012-02-21 12:35:23

标签: c# asp.net null sqldatareader dbnull

我有一个包含空值的表,我需要使用SqlDataReader从表中获取数据。我无法弄清楚如何安全地将DBNull强制转换为int。

我现在正以这种方式这样做:

...
reader = command.ExecuteReader();
while (reader.Read()) {
     int y = (reader["PublicationYear"] != null) ? Convert.ToInt32(reader["PublicationYear"]) : 0;
     ...
}
...

但在PublicationYear为null时获得Object cannot be cast from DBNull to other types.

如何安全地获取价值?

感谢。

9 个答案:

答案 0 :(得分:12)

您应该将reader["PublicationYear"]DBNull.Value进行比较,而不是null

答案 1 :(得分:4)

DBNullnull不同。你应该尝试这样的事情:

int y = (reader["PublicationYear"] != DBNull.Value) ? ...

答案 2 :(得分:2)

int ord = reader.GetOrdinal("PublicationYear");
int y = reader.IsDBNull(ord) ? 0 : reader.GetInt32(ord);

或者,或者:

object obj = reader["PublicationYear"];
int y = Convert.IsDBNull(obj) ? 0 : (int)obj;

答案 3 :(得分:2)

更改

reader["PublicationYear"] != null

reader["PublicationYear"] != DBNull.Value

答案 4 :(得分:2)

您应该明确检查返回的值是否为DBNull

类型
while (reader.Read()) {
     int y = (!reader["PublicationYear"] is DBNull) ? Convert.ToInt32(reader["PublicationYear"]) : 0;
     ...
}

事实上,您可以按值进行比较,也可以输入:

reader["PublicationYear"] != DBNull.Value

简而言之 - 您可以期望从数据库返回空值DBNull,而不是返回null。

答案 5 :(得分:2)

作为替代方案,您可以执行以下操作。 当您将DBNull转换为0时,请更改执行select的过程。因此,select值本身为null值返回零。

摘要演示了这个想法

    SELECT ...
           ,ISNULL (PublicationYear, 0) as PublicationYear
           ...
    FROM sometable

这样做的好处是,代码中不需要进行额外的检查。

答案 6 :(得分:1)

这就是错误:(reader["PublicationYear"] != null) 你应该测试DBNull.Value ....

答案 7 :(得分:1)

将您的考试从(reader["PublicationYear"] != null)更改为(reader["PublicationYear"] != DBNull.Value)

答案 8 :(得分:1)

应将数据库空值与DBNull.Value

进行比较

reader = command.ExecuteReader(); while (reader.Read()) { int y = (reader["PublicationYear"] != DBNull.Value) ? Convert.ToInt32(reader["PublicationYear"]) : 0; ... }