web-dev-qa-db-ja.com

Dapperを使用してストアドプロシージャの戻り値を取得するにはどうすればよいですか?

SQL Server 2016 Expressを使用してasp.net mvc 4プロジェクト.net f/w 4.6.1でDapperを使用しています

<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

私のレポメソッドはこのようにダッパーを使用しています

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は、dapperが影響を受けた行数を返すため、理解できるたびに1になります。

ただし、ストアドプロシージャのreturnステートメントの値にアクセスして、トランザクションの削除中にエラーがないか確認したいと思います(この場合、成功の場合は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
8
Hamza Ahmed Zia

方向付きの動的パラメータを宣言できます: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));
    }
}
17
Void Ray

Direction.ReturnValueを使用して、ストアドプロシージャのSqlParameterを定義する必要があります

0
NIts577