Dapper를 사용하여 저장된 proc의 반환 값을 얻으려면 어떻게해야합니까?

asp.net-mvc c# dapper data-access-layer sql-server

문제

나는 asp.net MVC 4 프로젝트에서 닷퍼를 사용하고 있습니다. 닷넷 f를 / 4.6.1 SQL 서버를 사용하여 2016 특급

<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가 영향을받는 행의 수를 반환하기 때문에 이해할 수 있습니다.

그러나 트랜잭션 삭제 중 오류를 확인하기 위해 내 저장된 proc의 반환 문 값을 얻고 싶습니다 (내 경우 0 성공 및 모든 오류 1)

이것을 어떻게 성취합니까?

베어 메탈 ado.net과 나는 이것을 해왔고 효과가 있었다.

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

내가 위대한 메타 데이터가 스칼라를 드러내 기 때문에 작동하지 않는 con.ExecuteScalar를 시도했습니다. // 반환 값 : // 선택한 첫 번째 셀

어떤 도움을 주시면 감사하겠습니다.

다음은 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 "return"대신 "select"를 사용하고 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를 정의해야합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow