C# 尝试使用.NET 5.0 web app执行存储过程时出现转换错误
我正在使用实体框架编写一个.NET5.0Web应用程序。我有一个SQL Server存储过程,我需要调用它来从一些复杂的计算中检索一些数据。我以前使用Microsoft Access从和ODBC连接运行存储过程 我已经用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”类型的对象强制转
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
,因此我更改了该字段的模型,它可以正常工作。谢谢你的主意!