如何使用 Dapper 获取存储过程的 return 值?
How do I use Dapper to get the return value of stored proc?
我在 asp.net mvc 4 项目 .net f/w 4.6.1 中使用 Dapper 使用 sql server 2016 express
<packages>
<package id="Dapper" version="1.50.2" targetFramework="net461" />
</packages>
我有一个存储过程,它从 2 个应该是事务性的表中删除
ALTER PROCEDURE [dbo].[FeedbackDelete] @FeedbackID UNIQUEIDENTIFIER
AS
SET NOCOUNT OFF
SET XACT_ABORT ON
BEGIN TRANSACTION
DELETE
FROM dbo.Document
WHERE FeedbackId = @FeedbackID
IF(@@ERROR != 0)
BEGIN
ROLLBACK TRANSACTION
RETURN 1
END
DELETE
FROM [dbo].[Feedback]
WHERE [FeedbackID] = @FeedbackID
IF(@@ERROR != 0 OR @@ROWCOUNT != 1)
BEGIN
ROLLBACK TRANSACTION
RETURN 1
END
COMMIT TRANSACTION
RETURN 0
我的 repo 方法像这样使用 dapper
public Response DeleteFeedback(Guid feedbackId)
{
string storedProcName = "FeedbackDelete";
int returnValue = int.MinValue;
using (var con = Connection)
{
con.Open();
returnValue = con.Execute(storedProcName, new { feedbackId }, commandType: CommandType.StoredProcedure);
}
return Convert.ToInt32(returnValue) == 0 ? new Response(Code.Success, "Feedback successfully deleted") : new Response(Code.Failure, "There was an error deleting feedback");
}
我得到的 returnValue 每次都是 1,这是可以理解的,因为 returns 受影响的行数。
但是我想获取存储过程的 return 语句的值,以检查事务删除期间的错误(在我的例子中,成功为 0,任何错误为 1)
我该如何实现?
使用裸机 ado.net 我曾经这样做过并且很有效
var returnValue = db.ExecuteScalar(storedProcName, new object[] { feedbackId });
使用 dapper 我已经尝试过 con.ExecuteScalar 这不起作用,因为 dapper 元数据显示标量 // Returns: //第一个单元格被选中
任何帮助将不胜感激?
这是我需要使用 Dapper 执行的下一个过程
ALTER PROCEDURE [dbo].[FeedbackUpdate]
@DocumentData VARBINARY(MAX),
@DocumentName NVARCHAR(100),
@FeedbackID UNIQUEIDENTIFIER,
@FirstName NVARCHAR(100),
@LastName NVARCHAR(100),
@Notes NVARCHAR(MAX)
AS
SET NOCOUNT ON
SET XACT_ABORT ON
BEGIN TRAN
UPDATE [dbo].[Feedback]
SET [FirstName] = @FirstName, [LastName] = @LastName, [Notes] = @Notes
WHERE [FeedbackID] = @FeedbackID
IF(@@ERROR != 0 OR @@ROWCOUNT != 1)
BEGIN
ROLLBACK TRAN
RETURN 1
END
IF DATALENGTH(@DocumentData) > 1
BEGIN
DELETE
FROM [dbo].[Document]
WHERE FeedbackId = @FeedbackId
IF(@@ERROR != 0)
BEGIN
ROLLBACK TRAN
RETURN 1
END
INSERT [dbo].[Document] (DocumentData,DocumentName,DocumentId,FeedbackId)
VALUES(@DocumentData,@DocumentName,NEWID(),@FeedbackID)
IF(@@ERROR != 0 OR @@ROWCOUNT != 1)
BEGIN
ROLLBACK TRAN
RETURN 1
END
END
COMMIT TRAN
RETURN 0
您必须使用 Direction.ReturnValue
为您的存储过程定义一个 SqlParameter
您可以使用方向声明动态参数:ReturnValue
您也可以使用 "select" 而不是 "return" 并使用 Query<T>
扩展名。
create procedure sp_foo
as
begin
return 99
end
[Test]
public void TestStoredProcedure()
{
using (var conn = new SqlConnection(@"Data Source=.\sqlexpress;Integrated Security=true; Initial Catalog=foo"))
{
var p = new DynamicParameters();
p.Add("@foo", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);
conn.Execute("sp_foo", p, commandType: CommandType.StoredProcedure);
var b = p.Get<int>("@foo");
Assert.That(b, Is.EqualTo(99));
}
}
csharp/server边
var result = conn.QuerySingle<int>(
"sp_test",
new
{
param1 = "something"
},
commandType: CommandType.StoredProcedure
);
和存储过程
create procedure sp_test(varchar(255) param1)
as
begin
if param1 = "bla bla" then -- or some other validation against param1
select -1;
end if;
-- do something
select 1; -- if reached this point everything is fine
end
批准的解决方案对我使用 mysql 5.7.1 无效。所以我只是在这里发布我的解决方案。该示例的结果将为 1,如果 param1 更改为 something
,则结果将为 -1
我在 asp.net mvc 4 项目 .net f/w 4.6.1 中使用 Dapper 使用 sql server 2016 express
<packages>
<package id="Dapper" version="1.50.2" targetFramework="net461" />
</packages>
我有一个存储过程,它从 2 个应该是事务性的表中删除
ALTER PROCEDURE [dbo].[FeedbackDelete] @FeedbackID UNIQUEIDENTIFIER
AS
SET NOCOUNT OFF
SET XACT_ABORT ON
BEGIN TRANSACTION
DELETE
FROM dbo.Document
WHERE FeedbackId = @FeedbackID
IF(@@ERROR != 0)
BEGIN
ROLLBACK TRANSACTION
RETURN 1
END
DELETE
FROM [dbo].[Feedback]
WHERE [FeedbackID] = @FeedbackID
IF(@@ERROR != 0 OR @@ROWCOUNT != 1)
BEGIN
ROLLBACK TRANSACTION
RETURN 1
END
COMMIT TRANSACTION
RETURN 0
我的 repo 方法像这样使用 dapper
public Response DeleteFeedback(Guid feedbackId)
{
string storedProcName = "FeedbackDelete";
int returnValue = int.MinValue;
using (var con = Connection)
{
con.Open();
returnValue = con.Execute(storedProcName, new { feedbackId }, commandType: CommandType.StoredProcedure);
}
return Convert.ToInt32(returnValue) == 0 ? new Response(Code.Success, "Feedback successfully deleted") : new Response(Code.Failure, "There was an error deleting feedback");
}
我得到的 returnValue 每次都是 1,这是可以理解的,因为 returns 受影响的行数。
但是我想获取存储过程的 return 语句的值,以检查事务删除期间的错误(在我的例子中,成功为 0,任何错误为 1)
我该如何实现?
使用裸机 ado.net 我曾经这样做过并且很有效
var returnValue = db.ExecuteScalar(storedProcName, new object[] { feedbackId });
使用 dapper 我已经尝试过 con.ExecuteScalar 这不起作用,因为 dapper 元数据显示标量 // Returns: //第一个单元格被选中
任何帮助将不胜感激?
这是我需要使用 Dapper 执行的下一个过程
ALTER PROCEDURE [dbo].[FeedbackUpdate]
@DocumentData VARBINARY(MAX),
@DocumentName NVARCHAR(100),
@FeedbackID UNIQUEIDENTIFIER,
@FirstName NVARCHAR(100),
@LastName NVARCHAR(100),
@Notes NVARCHAR(MAX)
AS
SET NOCOUNT ON
SET XACT_ABORT ON
BEGIN TRAN
UPDATE [dbo].[Feedback]
SET [FirstName] = @FirstName, [LastName] = @LastName, [Notes] = @Notes
WHERE [FeedbackID] = @FeedbackID
IF(@@ERROR != 0 OR @@ROWCOUNT != 1)
BEGIN
ROLLBACK TRAN
RETURN 1
END
IF DATALENGTH(@DocumentData) > 1
BEGIN
DELETE
FROM [dbo].[Document]
WHERE FeedbackId = @FeedbackId
IF(@@ERROR != 0)
BEGIN
ROLLBACK TRAN
RETURN 1
END
INSERT [dbo].[Document] (DocumentData,DocumentName,DocumentId,FeedbackId)
VALUES(@DocumentData,@DocumentName,NEWID(),@FeedbackID)
IF(@@ERROR != 0 OR @@ROWCOUNT != 1)
BEGIN
ROLLBACK TRAN
RETURN 1
END
END
COMMIT TRAN
RETURN 0
您必须使用 Direction.ReturnValue
您可以使用方向声明动态参数:ReturnValue
您也可以使用 "select" 而不是 "return" 并使用 Query<T>
扩展名。
create procedure sp_foo
as
begin
return 99
end
[Test]
public void TestStoredProcedure()
{
using (var conn = new SqlConnection(@"Data Source=.\sqlexpress;Integrated Security=true; Initial Catalog=foo"))
{
var p = new DynamicParameters();
p.Add("@foo", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);
conn.Execute("sp_foo", p, commandType: CommandType.StoredProcedure);
var b = p.Get<int>("@foo");
Assert.That(b, Is.EqualTo(99));
}
}
csharp/server边
var result = conn.QuerySingle<int>(
"sp_test",
new
{
param1 = "something"
},
commandType: CommandType.StoredProcedure
);
和存储过程
create procedure sp_test(varchar(255) param1)
as
begin
if param1 = "bla bla" then -- or some other validation against param1
select -1;
end if;
-- do something
select 1; -- if reached this point everything is fine
end
批准的解决方案对我使用 mysql 5.7.1 无效。所以我只是在这里发布我的解决方案。该示例的结果将为 1,如果 param1 更改为 something