Как безопасно привести нулевой результат из sqlreader в int?
У меня есть таблица, которая содержит нулевые значения, и мне нужно получить данные из таблицы с помощью 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 равен нулю.
Как я могу безопасно получить значение?
Спасибо.
9 ответов:
DBNullэто не то же самое, чтоnull. Вместо этого вы должны попробовать что-то вроде этого:int y = (reader["PublicationYear"] != DBNull.Value) ? ...
Необходимо явно проверить, имеет ли возвращаемое значение тип
DBNullwhile (reader.Read()) { int y = (!reader["PublicationYear"] is DBNull) ? Convert.ToInt32(reader["PublicationYear"]) : 0; ... }На самом деле, вы можете сделать это сравнение по значению, а также по типу:
Короче говоря, вы можете ожидать, чтоreader["PublicationYear"] != DBNull.ValueDBNullбудет возвращен для нулей из базы данных, а не сам null.
В качестве альтернативы вы можете сделать следующее. при преобразовании DBNull в 0 измените процедуру, которая выполняет выбор. так что select сам возвращает ноль для нулевого значения.
Фрагмент для демонстрации идеи
SELECT ... ,ISNULL (PublicationYear, 0) as PublicationYear ... FROM sometableПреимущество этого заключается в том, что в коде не требуется никакой дополнительной проверки.
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;