【发布时间】:2016-01-21 17:08:32
【问题描述】:
我正在使用 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方法更简单的方法吗?如果 db 值为 NULL 且字段为
int,为什么reader["Column1Name"]返回空白而不是null?
【问题讨论】:
-
我不确定但尝试使用 Convert.ToInt32(reader["Column1Name"]);
-
我得到一个异常,因为 Reader["Column1Name"] 是空白的
-
您确定 db 值为空吗?它可以为空,但并不意味着它为空。否则没有比检查空值更简单的方法来处理它。
-
我确定它为 null 我可以执行 SQL 分析器跟踪以查看 ti 返回 null。另外 reader.GetSqlInt32(reader.GetOrdinal("Column1Name")) 返回 null
-
感谢您的澄清。另外,Column1Name 和 ColumnName1 是不同的字段吗?
标签: c# .net sql-server ado.net sqldatareader