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

标签 c# .net 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"];
    }
}

读取 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"];

有效。

问题:

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

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

最佳答案

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

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

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

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

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

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

关于c# - SqlDataReader 为 int 字段返回空白而不是 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34929972/

相关文章:

.net - LINQ查询帮助: searching for data in a Many to Many using Entity Framework

c# - 从文本文件导入 SQL Server 数据库,我应该选择什么解决方案?

c# - 使用必应 map API 的应用程序

c# - 为 LDAP 查询转义字符串中的非特殊字符

c# - 2D WPF 游戏,我有哪些选择?

asp.net - SQL Server 连接字符串问题

javascript - 使用 Javascript 转换 JSON 日期

c# - 将 blazor 项目正确发布/部署到 github 页面

c# - 使用 Azure 管理 API 列出容器组失败并出现 System.Net.Sockets.SocketException

c# - Windows 7 中的特殊文件夹引发异常