如何使用Dapper检索存储过程返回值

时间:2017-05-18 10:55:32

标签: sql-server tsql dapper

我有这种形式的存储过程:

CREATE PROCEDURE AddProduct
    (@ProductID varchar(10),
     @Name  nvarchar(150)
    )
AS
    SET NOCOUNT ON;

    IF EXISTS (SELECT TOP 1 ProductID FROM Products 
               WHERE ProductID = @ProductID)
        RETURN -11
    ELSE
    BEGIN
        INSERT INTO Products ([AgentID], [Name])
        VALUES (@AgentID, @Name)

        RETURN @@ERROR
    END

我有这个C#来调用存储过程,但我似乎无法从中获得正确的值:

var returnCode = cn.Query(
    sql: "AddProduct",
    param: new { @ProductID = prodId, @Name = name },
    commandType: CommandType.StoredProcedure);

如何确保returnCode变量包含RETURN -11RETURN @@ERROR行返回的值?

2 个答案:

答案 0 :(得分:2)

为了在SQL中使用RETURN语句,C#变为......

var _params = new DynamicParameters{ @ProductID = prodId, @Name = name };
_params.Add(
    name: "@RetVal",
    dbType: DbType.Int32,
    direction: ParameterDirection.ReturnValue
    );
var returnCode = cn.Execute(
    sql: "AddProduct",
    param: _params,
    commandType: CommandType.StoredProcedure);
return _params.Get<int>("@RetVal");

这不是我希望的实现,但它确实有效。

答案 1 :(得分:1)

我建议您使用SELECT返回存储过程中的值。您还应该在短小精悍的调用上指定返回类型:

RETURN -11

变为

SELECT -11

和短小精悍的电话变成:

var returnCode = cn.Query<int>(..

我已多次实现此模式,并且按预期工作。