SqlDataReader returns int 字段为空白而不是 null

SqlDataReader returns blank instead of null for an int field

我正在使用 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"))

其中 return 为空,但类型是 SqlInt32 而不是我想要的 int?

我最后做了

if (!reader.IsDBNull(reader.GetOrdinal("Column1Name"))) 
    int? var1 = (int?)reader["Column1Name"];

有效。

问题:

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

  2. 如果数据库值为 NULL 且字段为 int,为什么 reader["Column1Name"] return 为空而不是 null

C# 无法将字符串转换为 int?使用(整数?)。最安全的方法是使用条件运算符检查是否为空,然后手动将值设置为空。

//Get the column index to prevent calling GetOrdinal twice
int COLUMNNAME1 = reader.GetOrdinal("ColumnName1");

while (reader.Read())
{
    int? var1 = reader.IsDBNull(COLUMNNAME1) ? null : reader.GetInt32(COLUMNNAME1);
}

同样,如果您有非空数据类型,您可以检查它们是否为空并将它们设置为默认值。

int STRINGCOLUMN = reader.GetOrdinal("StringColumn");
int INTCOLUMN = reader.GetOrdinal("IntColumn");
int DATECOLUMN = reader.GetOrdinal("DateColumn");
int BOOLCOLUMN = reader.GetOrdinal("BoolColumn");

while (reader.Read())
{
    string var1 = reader.IsDBNull(STRINGCOLUMN) ? "" : reader.GetString(STRINGCOLUMN);
    int var2 = reader.IsDBNull(INTCOLUMN) ? 0 : reader.GetInt32(INTCOLUMN);
    DateTime var3 = reader.IsDBNull(DATECOLUMN) ? DateTime.MinValue : reader.GetDateTime(DATECOLUMN);
    bool var4 = reader.IsDBNull(BOOLCOLUMN) ? false : reader.GetBoolean(BOOLCOLUMN);
}

Why does reader["Column1Name"] return blank instead of null if the db value is null and the field is an int?

实际上,reader["Column1Name"] returns DBNull.Value if the database value is NULL. (In the Visual Studio debugger, the value appears to be blank because DBNull.ToString() returns 是一个空字符串。)您不能使用强制转换将 DBNull.Value 直接转换为 int?运算符。

Isn't there a simpler way then calling the IsDBNull method?

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

int? var1 = reader["Column1Name"] as int?;

因为 DBNull.Value 不是 intas 运算符 returns null.