我正在使用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"];
}
}
当从数据库读取一个空的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
方法更简单的方法吗?如果数据库值为NULL且字段为
int
类型,为什么reader["Column1Name"]
返回空白而不是null
?
List<dynamic>
中。同样的方式可以将结果保存在List<Dictionary<string, object>>
中。作为结果,可以读取数据,而且读取时不会有读取null
的问题,因为您是通过序号读取数据。 - Oleg