如何使用 Dapper 检索存储过程的返回值
Posted
技术标签:
【中文标题】如何使用 Dapper 检索存储过程的返回值【英文标题】:How to retrieve stored procedure return value with Dapper 【发布时间】:2017-05-18 10:55:31 【问题描述】:我有一个这种形式的存储过程:
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 @@ERROR
行返回的值?
【问题讨论】:
【参考方案1】:为了在 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 我尝试了这个解决方案,但它引发了异常,因为 _params 中的参数比存储中的参数多new DynamicParameters @ProductID = prodId, @Name = name ;
的有效 C# 语法如何?我只是得到一个错误'DynamicParameters 不包含'ProductID'的定义'。【参考方案2】:
我建议您使用SELECT
从您的存储过程中返回值。您还应该在 dapper 调用中指定返回类型:
RETURN -11
变成
SELECT -11
而简洁的调用变成:
var returnCode = cn.Query<int>(..
我已经多次实现了这种模式,它按预期工作。
【讨论】:
以上是关于如何使用 Dapper 检索存储过程的返回值的主要内容,如果未能解决你的问题,请参考以下文章
将 Dapper 与返回游标的 Oracle 存储过程一起使用
从 SQL 中的存储过程返回值 true 或 false,并在带有 dapper 的 asp core3 中使用它