SqlDataReader为int字段返回空白而不是null

dfm*_*tro 6 .net c# sql-server ado.net sqldatareader

我正在使用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"];
    }
}
Run Code Online (Sandbox Code Playgroud)

int从数据库读取NULL 字段时,该字段 reader["Column1Name"]为空,因此代码在运行时引发InvalidCastException。

我试过了

reader.GetInt32(reader.GetOrdinal("Column1Name"))
Run Code Online (Sandbox Code Playgroud)

但这会引发System.Data.SqlTypes.SqlNullValueException。

我也尝试过

reader.GetSqlInt32(reader.GetOrdinal("Column1Name"))
Run Code Online (Sandbox Code Playgroud)

返回null,但类型SqlInt32不是int?我想要的。

我最终做了

if (!reader.IsDBNull(reader.GetOrdinal("Column1Name"))) 
    int? var1 = (int?)reader["Column1Name"];
Run Code Online (Sandbox Code Playgroud)

哪个有效。

问题:

  1. 有没有比调用该IsDBNull方法更简单的方法?

  2. 为什么为什么reader["Column1Name"]返回nulldb 而不是db值为NULL且字段为a int

Mic*_*Liu 5

reader["Column1Name"]如果 db 值为 null 并且字段为 ,为什么返回空白而不是 null int

实际上,如果数据库值为 NULL,reader["Column1Name"]则返回DBNull.Value 。(在 Visual Studio 调试器中,该值显示为空,因为DBNull.ToString()返回空字符串。)不能DBNull.Value直接int?使用强制转换运算符进行强制转换。

难道就没有比调用IsDBNull方法更简单的方法了吗?

是的,使用as运算符而不是强制转换:

int? var1 = reader["Column1Name"] as int?;
Run Code Online (Sandbox Code Playgroud)

因为DBNull.Value不是int,所以as运算符返回null