Я использую SqlDataReader для извлечения данных из базы данных SQL Server 2012:
SqlConnection connection = (SqlConnection)_db.Database.GetDbConnection();
await connection.OpenAsync();
SqlCommand command = new SqlCommand("dbo.[sp_MyStoredPrc] @InputId=1", connection);
var reader = await command.ExecuteReaderAsync();
if (reader.HasRows)
{
while (reader.Read())
{
int? var1 = (int?)reader["Column1Name"];
}
}
При чтении поля NULL int
из базы данных reader["Column1Name"]
пусто, поэтому код генерирует исключение InvalidCastException во время выполнения.
я пытался
reader.GetInt32(reader.GetOrdinal("Column1Name"))
но это вызывает исключение System.Data.SqlTypes.SqlNullValueException.
Я тоже пробовал
reader.GetSqlInt32(reader.GetOrdinal("Column1Name"))
который возвращает null, но тип SqlInt32
, а не int?
, как я хочу.
Я закончил делать
if (!reader.IsDBNull(reader.GetOrdinal("Column1Name")))
int? var1 = (int?)reader["Column1Name"];
который работает.
Вопросы:
Нет ли более простого способа, чем вызвать метод
IsDBNull
?Почему
reader["Column1Name"]
возвращает пустое значение вместоnull
, если значение db равно NULL, а поле -int
?
List<dynamic>
. Таким же образом можно сохранить результаты вList<Dictionary<string, object>>
. В результате можно читать данные и нет проблем с чтениемnull
, потому что вы читаете данные по порядковому номеру. - person Oleg   schedule 21.01.2016