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

Sql server 如何使用Dapper检索存储过程返回值,sql-server,tsql,dapper,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 ELS

我有一个这样的存储过程:

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-11或RETURN@错误行返回的值?

我建议您使用SELECT从存储过程返回值。此外,还应在dapper调用中指定返回类型:

RETURN -11
变成

SELECT -11
而简洁的电话变成了:

var returnCode = cn.Query<int>(..
我已经实现了这个模式好几次,它的工作原理与预期一样。

我建议您使用SELECT从存储过程返回值。此外,还应在dapper调用中指定返回类型:

RETURN -11
变成

SELECT -11
而简洁的电话变成了:

var returnCode = cn.Query<int>(..
我已经实现了这个模式好几次,它的工作原理与预期的一样。

为了在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");
这不是我所希望的实现,但它是有效的。

要在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");

这不是我所希望的实现,但它可以工作。

不可能同时获得结果集和返回值,对吗?@MattW我尝试了这个解决方案,但它引发了一个异常,因为_参数中的参数比存储中的参数多。如何获得新的DynamicParameters{@ProductID=prodId,@Name=Name};有效的C语法?我刚刚得到一个错误“DynamicParameters不包含“ProductID”的定义。不可能同时获取结果集和返回值,对吗?@MattW我尝试了这个解决方案,但它引发了一个异常,因为_参数中的参数比存储中的参数多。如何创建新的DynamicParameters{@ProductID=prodId,@Name=Name};有效的C语法?我刚刚得到一个错误“DynamicParameters不包含“ProductID”的定义”。