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

调用存储过程遇System.Double空值转换异常,求解决方案

解决System.InvalidOperationException: Double类型转换失败(实例化值为null)的问题

这个错误的核心原因很明确:你的NewDeclarationItemReport实体类中存在非可空的double类型属性,但存储过程返回的结果集里,对应列的值是NULL——C#的值类型(比如double)无法容纳null,所以触发了转换失败。

下面是两种直接有效的解决思路:

思路1:修改实体类属性为可空类型

找到NewDeclarationItemReport中对应存储过程返回的数值列(可能是重量、数量这类字段),把原本的非可空double改成可空的double?(等价于Nullable<double>)。

示例:

// 原非可空属性
public double NetWeight { get; set; }

// 修改为可空属性
public double? NetWeight { get; set; }

这样C#就能正确接收存储过程返回的NULL值,不会触发转换异常。

思路2:修改存储过程,确保返回值不为NULL

如果因为业务限制不能修改实体类,可以在存储过程的查询语句中,用ISNULL()函数给可能返回NULL的数值列设置默认值,确保返回的是一个有效的double值(比如0.0)。

示例(假设存储过程返回的NetWeight列可能为NULL):

ALTER PROCEDURE [dbo].[GetDeclarationItemReportData] 
( 
    @StartDate datetime2, 
    @EndDate datetime2, 
    @IsWorkOrder int, 
    @ReceiverId uniqueidentifier, 
    @DeclarationId uniqueidentifier, 
    @DeclarationItemId uniqueidentifier, 
    @VoyageId uniqueidentifier, 
    @WarehouseId uniqueidentifier, 
    @OperationType int, 
    @PortId uniqueidentifier, 
    @MaterialId uniqueidentifier 
)
AS
BEGIN
    -- 修改查询语句,用ISNULL处理可能的NULL值
    SELECT ISNULL(NetWeight, 0.0) AS NetWeight, 
           -- 其他需要处理的数值列同理
           OtherColumn1,
           OtherColumn2
    FROM YourTargetTable
    -- 原有的过滤条件...
END

额外检查点

  • 不光是double类型,还要确认实体类中其他值类型(比如int、decimal)对应的存储过程返回列是否可能为NULL,如果是,同样需要改成可空类型或者在存储过程中处理NULL值。
  • 确保存储过程返回的所有列名、类型和NewDeclarationItemReport的属性完全匹配,避免因字段不对应导致的隐性转换问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 22:07:34