尝试使用 .NET 5.0 Web 应用程序执行存储过程时出现转换错误
Getting a conversion error when trying to execute a stored procedue with .NET 5.0 web app
我正在使用 Entity Framework 编写 .NET 5.0 网络应用程序。我有一个 SQL 服务器存储过程,我需要调用它来从一些复杂的计算中检索一些数据。我以前使用 Microsoft Access 运行 来自 ODBC 连接的存储过程。
我已经尝试使用 FromSqlRaw
和 FromSqlInterpolated
调用带有和不带参数的网络应用程序。我最终只是决定看看我是否可以让它与硬编码值一起使用,然后再考虑稍后包含参数。
我不断收到的错误是
InvalidCastException: Unable to cast object of type 'System.Int16' to type '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
这是预期的结果
这是我可以用来 return 相同结果的 Access Passthrough 查询。
EXECUTE dbo.bds_TargetMetrics_Results_Get_S
@p_ShiftDate = '',
@p_ShiftID = '',
@p_MachineIDs = '29',
@p_TargetMetricIDs = '9',
@p_TargetMetricGroupIDs = '1,2,3'
这是我尝试在网络应用程序中使用的代码。我使用存储过程中的 return 字段创建了一个 TargetMetricMonitors
class,我试图用过程结果填充它。
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; }
到
public Int16 TargetMetricStatus { get; set; }
并且页面有效。
我正在使用 Entity Framework 编写 .NET 5.0 网络应用程序。我有一个 SQL 服务器存储过程,我需要调用它来从一些复杂的计算中检索一些数据。我以前使用 Microsoft Access 运行 来自 ODBC 连接的存储过程。
我已经尝试使用 FromSqlRaw
和 FromSqlInterpolated
调用带有和不带参数的网络应用程序。我最终只是决定看看我是否可以让它与硬编码值一起使用,然后再考虑稍后包含参数。
我不断收到的错误是
InvalidCastException: Unable to cast object of type 'System.Int16' to type '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
这是预期的结果
这是我可以用来 return 相同结果的 Access Passthrough 查询。
EXECUTE dbo.bds_TargetMetrics_Results_Get_S
@p_ShiftDate = '',
@p_ShiftID = '',
@p_MachineIDs = '29',
@p_TargetMetricIDs = '9',
@p_TargetMetricGroupIDs = '1,2,3'
这是我尝试在网络应用程序中使用的代码。我使用存储过程中的 return 字段创建了一个 TargetMetricMonitors
class,我试图用过程结果填充它。
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; }
到
public Int16 TargetMetricStatus { get; set; }
并且页面有效。