调用存储过程遇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
相关产品推荐
相关产品推荐

