How to safely cast nullable result from sqlreader

2019-06-18 05:12发布

I have a table which contains null values and I need to get data from the table using SqlDataReader. I can't figure out how I can safely cast DBNull to int.

I'm doing it in this way at the moment:

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

but getting a Object cannot be cast from DBNull to other types. when PublicationYear is null.

How can I get the value safely?

Thanks.

9条回答
何必那么认真
2楼-- · 2019-06-18 05:31
int ord = reader.GetOrdinal("PublicationYear");
int y = reader.IsDBNull(ord) ? 0 : reader.GetInt32(ord);

Or, alternatively:

object obj = reader["PublicationYear"];
int y = Convert.IsDBNull(obj) ? 0 : (int)obj;
查看更多
看我几分像从前
3楼-- · 2019-06-18 05:38

DBNull is not the same as null. You should try something like this instead:

int y = (reader["PublicationYear"] != DBNull.Value) ? ...
查看更多
走好不送
4楼-- · 2019-06-18 05:42

as an alternative you can do the following. as you are converting DBNull to 0, alter the procedure that does the select. so that the select itself returns zero for a null value.

snippet to demonstrate the idea

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

advantage of this is that, no additional checking is needed in your code.

查看更多
姐就是有狂的资本
5楼-- · 2019-06-18 05:46

Change your test from (reader["PublicationYear"] != null) to (reader["PublicationYear"] != DBNull.Value).

查看更多
淡お忘
6楼-- · 2019-06-18 05:50

Change

reader["PublicationYear"] != null

to

reader["PublicationYear"] != DBNull.Value

查看更多
做自己的国王
7楼-- · 2019-06-18 05:55

You should explicitly check if the value returned is of type DBNull

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

In fact, you can do this comparison by value as well as type:

reader["PublicationYear"] != DBNull.Value

In short - you can expect DBNull to be returned for nulls from the database, rather than null itself.

查看更多
登录 后发表回答