簡體   English   中英

如何使用 Dapper 獲取存儲過程的返回值?

[英]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,這是可以理解的,因為 dapper 返回受影響的行數。

但是,我想獲取存儲過程的返回語句的值,以檢查事務刪除期間的錯誤(在我的情況下,成功為 0,任何錯誤為 1)

我如何實現這一目標?

使用裸機 ado.net 我曾經這樣做過,並且奏效了

var returnValue = db.ExecuteScalar(storedProcName, new object[] { feedbackId });

使用 dapper 我已經嘗試過 con.ExecuteScalar 它不起作用,因為 dapper 元數據顯示該標量 // 返回: //選中的第一個單元格

任何幫助將不勝感激?

這是我需要使用 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

您可以使用方向聲明動態參數: 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));
    }
}

您必須使用Direction.ReturnValue為您的存儲過程定義一個 SqlParameter

csharp/服務器端

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的例子,和-1,如果參數1改為something

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM