微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试使用 .NET 5.0 Web 应用程序执行存储过程时出现转换错误

如何解决尝试使用 .NET 5.0 Web 应用程序执行存储过程时出现转换错误

我正在使用实体框架编写 .NET 5.0 Web 应用程序。我有一个 sql Server 存储过程,我需要调用它来从一些复杂的计算中检索一些数据。我以前使用过 Microsoft Access 来运行来自 ODBC 连接的存储过程。

我已经尝试过使用 FromsqlRawFromsqlInterpolated 进行网络应用调用,有无参数。我最终决定看看我是否可以使其与硬编码值一起工作,然后再考虑稍后包含参数。

我不断收到的错误

InvalidCastException: 无法将“system.int16”类型的对象转换为“system.int32”类型

我不确定这是否是使其无法工作的错误,但这是我尝试过的不同配置中的共同点。我最初的想法是 ShiftID 参数有问题,但我尝试过的任何方法都没有奏效。

我不确定需要显示什么来尝试解决此问题,因此以下是我主要处理的内容

这是我从 sql Server Management Studio 运行时调用的存储过程

USE [DATABASE]
GO

DECLARE @return_value int

EXEC    @return_value = [dbo].[bds_TargetMetrics_Results_Get_S]
        @p_ShiftDate = NULL,@p_ShiftID = NULL,@p_MachineIDs = N'29',@p_TargetMetricIDs = N'9',@p_TargetMetricGroupIDs = N'1,2,3'

SELECT  'Return Value' = @return_value

这是预期的结果

Expected results from stored procedure

这是我可以用来返回相同结果的 Access Passthrough 查询

EXECUTE dbo.bds_TargetMetrics_Results_Get_S
    @p_ShiftDate = '',@p_ShiftID = '',@p_MachineIDs = '29',@p_TargetMetricIDs = '9',@p_TargetMetricGroupIDs = '1,3'

这是我尝试在网络应用程序中使用的代码。我创建了一个 TargetMetricMonitors 类,其中包含存储过程的返回字段,我试图用过程结果填充该字段。

TargetMetricMonitors = await _context.TargetMetricMonitors.FromsqlRaw(
    "EXECUTE dbo.bds_TargetMetrics_Results_Get_S " 
    + "@p_ShiftDate = ''," 
    + "@p_ShiftID = ''," 
    + "@p_MachineIDs = '29'," 
    + "@p_TargetMetricIDs = '9'," 
    + "@p_TargetMetricGroupIDs = '1,3'").ToListAsync();

解决方法

这是通过 Nikki9626 在评论中提供的想法解决的。我通过存储过程查看所有临时表的字段类型。我发现了一个 smallint

Field that was smallint

我改变了我的模型 public int TargetMetricStatus { get; set; }public Int16 TargetMetricStatus { get; set; } 并且页面正常工作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。