【问题标题】:Executing IDbConnection.Query gives exception: Conversion failed when converting the nvarchar value 'Memory to data type int'执行 IDbConnection.Query 时出现异常:将 nvarchar 值“内存转换为数据类型 int”时转换失败
【发布时间】:2018-08-25 05:49:46
【问题描述】:

我最近在 Azure 上为我的 Web 应用程序创建了一个存储过程。我使用 ASP.net core 2.0 来制作它。在存储过程中,我想获取特定的 PC 组件类型,例如:“主板”。之后我想将该类型返回给我的应用程序。

这是我的存储过程

CREATE PROCEDURE GetCurrentType 
@BuildID INT = 1, 
@t NVARCHAR(128) OUTPUT,
@Index INT OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    SELECT @Index = COUNT(*) 
    FROM Partslist 
    WHERE buildId = @BuildID;

    SELECT @t = _Type 
    FROM ComponentTypes 
    WHERE PriorityID = @Index;

    RETURN @t
END

存储过程计算用户选择的所有已选择的部分。使用该数字,它会在 ComponentTypes 表中查找下一个类型以供用户选择。将返回此类型。 BuildID 现在需要为 1,但稍后我会将其更改为实际参数。

C# 代码:

IEnumerable<string> test = db.Query<string>
(
      "GetCurrentType",
      new {BuildID = 1, t = "", Index = 0}, 
      commandType: CommandType.StoredProcedure
);

这应该获取类型并将其设置在测试 IEnumerable 中。但是当我运行它时,它会出现以下错误:

System.Data.SqlClient.SqlException: '将 nvarchar 值 'Memory' 转换为数据类型 int 时转换失败。'

我也尝试使用 DynamicParameters 但这只是给了我同样的错误。真正奇怪的是我的数据库中没有内存表或列。

【问题讨论】:

    标签: c# sql tsql asp.net-core-2.0 dapper


    【解决方案1】:
    @t NVARCHAR(128) OUTPUT,
    

    RETURN @t
    

    RETURN 值始终是数字;来自RETURN

    语法

    RETURN [ integer_expression ]

    参数

    整数表达式

    是返回的整数值。存储过程可以将整数值返回给调用过程或应用程序。

    返回类型

    可选择返回 int

    基本上:不要RETURN 这个。要么SELECT 它,要么使用OUTPUT 参数。

    我的建议是SELECT

    【讨论】:

    • 你能举例说明我应该如何使用 OUTPUT 参数吗?
    • @spoilerddo 使用SELECT @t 会容易得多,这是唯一 匹配Query&lt;string&gt; 的东西(Query 总是映射到SELECT
    猜你喜欢
    • 2018-07-01
    • 2020-04-17
    • 2011-08-29
    • 2015-06-20
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多