C# 尝试使用.NET 5.0 web app执行存储过程时出现转换错误

C# 尝试使用.NET 5.0 web app执行存储过程时出现转换错误,c#,sql-server,stored-procedures,asp.net-core-5.0,entity-framework-core-5.0,C#,Sql Server,Stored Procedures,Asp.net Core 5.0,Entity Framework Core 5.0,我正在使用实体框架编写一个.NET5.0Web应用程序。我有一个SQL Server存储过程,我需要调用它来从一些复杂的计算中检索一些数据。我以前使用Microsoft Access从和ODBC连接运行存储过程 我已经用FromSqlRaw和FromSqlInterpolated尝试了web应用程序调用,有参数和无参数。最后,我决定看看是否可以使用硬编码的值,然后再考虑以后是否包含参数 我经常犯的错误是 InvalidCastException:无法将“System.Int16”类型的对象强制转

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

我已经用
FromSqlRaw
FromSqlInterpolated
尝试了web应用程序调用,有参数和无参数。最后,我决定看看是否可以使用硬编码的值,然后再考虑以后是否包含参数

我经常犯的错误是

InvalidCastException:无法将“System.Int16”类型的对象强制转换为“System.Int32”类型

我不确定这是否是阻止它工作的错误,但这是我尝试过的不同配置中的共同点。我最初的想法是,
ShiftID
参数有问题,但我尝试过的方法都不管用

我不确定需要显示什么来尝试解决这个问题,所以这里是我主要处理的事情

下面是从SQLServerManagementStudio运行存储过程调用时的调用

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
以下是预期结果

下面是我可以用来返回相同结果的Access PasstThrough查询

EXECUTE dbo.bds_TargetMetrics_Results_Get_S
    @p_ShiftDate = '',
    @p_ShiftID = '',
    @p_MachineIDs = '29',
    @p_TargetMetricIDs = '9',
    @p_TargetMetricGroupIDs = '1,2,3'
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,2,3'").ToListAsync();
下面是我试图在web应用程序中使用的代码。我创建了一个带有存储过程返回字段的
TargetMetricMonitors
类,我正试图用过程结果填充该存储过程

EXECUTE dbo.bds_TargetMetrics_Results_Get_S
    @p_ShiftDate = '',
    @p_ShiftID = '',
    @p_MachineIDs = '29',
    @p_TargetMetricIDs = '9',
    @p_TargetMetricGroupIDs = '1,2,3'
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,2,3'").ToListAsync();

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

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

显示您的列类型定义和TargetMetricMonitors的对象映射-在某些地方,它有一个短的或Int16,并且需要一个int@Nikki9696你完全正确。我必须仔细研究这个过程,以找到正确的字段类型,但其中一个是
smallint
,因此我更改了该字段的模型,它可以正常工作。谢谢你的主意!