Как безопасно привести обнуляемый результат из sqlreader в int? - PullRequest
7 голосов
/ 21 февраля 2012

У меня есть таблица, которая содержит нулевые значения, и мне нужно получить данные из таблицы с помощью SqlDataReader.Я не могу понять, как я могу безопасно привести DBNull к int.

Сейчас я делаю это следующим образом:

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

, но получаю Object cannot be cast from DBNull to other types., когда PublicationYearимеет значение null.

Как безопасно получить значение?

Спасибо.

Ответы [ 9 ]

12 голосов
/ 21 февраля 2012

Вы должны сравнить reader["PublicationYear"] с DBNull.Value, а не null.

4 голосов
/ 21 февраля 2012

DBNull не совпадает с null.Вместо этого вы должны попробовать что-то вроде этого:

int y = (reader["PublicationYear"] != DBNull.Value) ? ...
2 голосов
/ 21 февраля 2012

в качестве альтернативы вы можете сделать следующее.когда вы конвертируете DBNull в 0, измените процедуру выбора.так что сам выбор возвращает ноль для нулевого значения. Фрагмент

, чтобы продемонстрировать идею

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

Преимущество этого в том, что никакой дополнительной проверки в вашем коде не требуется.

2 голосов
/ 21 февраля 2012

Вы должны явно проверить, имеет ли возвращаемое значение тип DBNull

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

На самом деле вы можете сделать это сравнение по значению, а также по типу:

reader["PublicationYear"] != DBNull.Value

Вкратце - вы можете ожидать, что DBNull будет возвращено для нулей из базы данных, а не для самого нуля.

2 голосов
/ 21 февраля 2012

Изменение

reader["PublicationYear"] != null

до

reader["PublicationYear"] != DBNull.Value

2 голосов
/ 21 февраля 2012
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;
1 голос
/ 21 февраля 2012

Нулевые значения базы данных должны сравниваться с DBNull.Value

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

1 голос
/ 21 февраля 2012

Измените свой тест с (reader["PublicationYear"] != null) на (reader["PublicationYear"] != DBNull.Value).

1 голос
/ 21 февраля 2012

Это ошибка: (reader["PublicationYear"] != null) Вы должны проверить DBNull.Value ....

...