You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Web API读取SQL Server含NULL值数据时DBNull转字符串报错如何解决

问题修复方案

报错原因

SQL Server中的NULL值在.NET运行时中对应System.DBNull类型,和C#本身的null不是同一概念,直接将DBNull类型对象强制转换为string会触发类型转换异常。
你遇到的报错信息:

无法将类型为“System.DBNull”的对象强制转换为类型“System.String”

修复方法

有两种通用处理方案,可根据业务需求选择:

方案1:SQL NULL转换为空字符串

直接调用字段对象的ToString()方法即可,DBNull的ToString()实现默认返回空字符串,无需额外判空:

Customer ExampleCustomer = new()
{
    CustomerID = AGetCommandDataReader["CustomerID"].ToString(),
    CompanyName = AGetCommandDataReader["CompanyName"].ToString(),
    ContactName = AGetCommandDataReader["ContactName"].ToString(),
    ContactTitle = AGetCommandDataReader["ContactTitle"].ToString(),
    Address = AGetCommandDataReader["Address"].ToString(),
    City = AGetCommandDataReader["City"].ToString(),
    Region = AGetCommandDataReader["Region"].ToString(),
    PostalCode = AGetCommandDataReader["PostalCode"].ToString(),
    Country = AGetCommandDataReader["Country"].ToString(),
    Phone = AGetCommandDataReader["Phone"].ToString(),
    Fax = AGetCommandDataReader["Fax"].ToString()
};

方案2:SQL NULL转换为C# null

使用as运算符做类型转换,as转换失败时会直接返回null,符合将数据库NULL映射为C# NULL的需求:

Customer ExampleCustomer = new()
{
    CustomerID = AGetCommandDataReader["CustomerID"] as string,
    CompanyName = AGetCommandDataReader["CompanyName"] as string,
    ContactName = AGetCommandDataReader["ContactName"] as string,
    ContactTitle = AGetCommandDataReader["ContactTitle"] as string,
    Address = AGetCommandDataReader["Address"] as string,
    City = AGetCommandDataReader["City"] as string,
    Region = AGetCommandDataReader["Region"] as string,
    PostalCode = AGetCommandDataReader["PostalCode"] as string,
    Country = AGetCommandDataReader["Country"] as string,
    Phone = AGetCommandDataReader["Phone"] as string,
    Fax = AGetCommandDataReader["Fax"] as string
};

额外优化建议

建议使用using语句管理数据库连接、命令、DataReader对象,无需手动调用Close()方法,即使代码执行出现异常也会自动释放资源,避免资源泄漏:

List<Customer> ExampleCustomers = new();
using SqlCommand AGetCommand = new()
{
    Connection = DataSource,
    CommandType = CommandType.StoredProcedure,
    CommandText = "GetCustomers"
};
using SqlDataReader AGetCommandDataReader = AGetCommand.ExecuteReader();
if (AGetCommandDataReader.HasRows)
{
    while (AGetCommandDataReader.Read())
    {
        // 此处使用上述任意一种修复后的赋值逻辑即可
        Customer ExampleCustomer = new()
        {
            CustomerID = AGetCommandDataReader["CustomerID"] as string,
            // 剩余属性赋值省略
        };
        ExampleCustomers.Add(ExampleCustomer);
    }
}
return ExampleCustomers;

内容的提问来源于stack exchange,提问作者dhwng7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 14:24:00