10

これが私のストアドプロシージャです。テストすると、常に正しい結果が返されます。

ALTER PROCEDURE [dbo].[AddSmoothieIngredients]
    -- Add the parameters for the stored procedure here
    @Query NVARCHAR(4000) ,
    @SmoothieId INT ,
    @CreatedDate DATETIME ,
    @Status INT ,
    @UserId INT
AS 
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
        SET NOCOUNT ON;

        BEGIN TRY
            BEGIN TRAN

            IF @SmoothieId > 0 
                BEGIN
                    DELETE  FROM dbo.SmoothieIngredients
                    WHERE   SmoothieId = @SmoothieId;

                    EXECUTE (@Query);
                END
            ELSE 
                BEGIN

                    IF @UserId = 0 
                        SET @UserId = NULL;

                    INSERT  INTO dbo.Smoothie
                            ( Name, CreatedDate, Status, UserId )
                    VALUES  ( N'', @CreatedDate, @Status, @UserId );

                    SET @SmoothieId = SCOPE_IDENTITY();

                    SET @Query = REPLACE(@Query, 'sId', @SmoothieId);
                    EXECUTE (@Query);

                END 


            COMMIT TRAN

            RETURN @SmoothieId

        END TRY

        BEGIN CATCH
            ROLLBACK
        END CATCH

    END

ただし、dapper.net を使用してこのストアド プロシージャを呼び出すと、常に -1 が返されます。

        using (var conn = OpenConnection())
        {
            var parameter = new { Query = query, SmoothieId = smoothieId, CreatedDate = createdDate, Status = status, UserId = userId  };
            return conn.Execute("AddSmoothieIngredients", parameter, commandType: CommandType.StoredProcedure);
        }

おそらく、dapper.net はストアド プロシージャからの戻り値を取得できません。しかし、私はそれを修正する方法を本当に知りません。助けてください。

4

4 に答える 4

21

したがって、Execute() が -1 を返す理由は、この質問SET NOCOUNT ON;によると、sproc が「DML の後に "xx 行の影響を受ける" メッセージを抑制する」ためです。それを無効にするかどうかは、そのリンクでも説明されている別の質問です。

私はちょうど同じ問題に遭遇したので、私は2セントを投入すると思った.

于 2014-02-04T04:58:37.143 に答える
2

Dapper.net は Execute メソッドに SqlCommand.ExecuteNonQuery を使用しているようです。これは、return ステートメントの値ではなく、影響を受けた行の数を返します。あなたが探しているのはQuery

return connection.Query<int>("AddSmoothieIngredients", parameter, commandType: CommandType.StoredProcedure).First();

それが return ステートメントもキャプチャするとは思いませんが、その場合、結果セットを返すようにストアド プロシージャを変更する必要があります。

ALTER PROCEDURE [dbo].[AddSmoothieIngredients]
    -- Add the parameters for the stored procedure here
    @Query NVARCHAR(4000) ,
    @SmoothieId INT ,
    @CreatedDate DATETIME ,
    @Status INT ,
    @UserId INT
AS 
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
    SET NOCOUNT ON;

    BEGIN TRY
        BEGIN TRAN

        IF @SmoothieId > 0 
            BEGIN
                DELETE  FROM dbo.SmoothieIngredients
                WHERE   SmoothieId = @SmoothieId;

                EXECUTE (@Query);
            END
        ELSE 
            BEGIN

                IF @UserId = 0 
                    SET @UserId = NULL;

                INSERT  INTO dbo.Smoothie
                        ( Name, CreatedDate, Status, UserId )
                VALUES  ( N'', @CreatedDate, @Status, @UserId );

                SET @SmoothieId = SCOPE_IDENTITY();

                SET @Query = REPLACE(@Query, 'sId', @SmoothieId);
                EXECUTE (@Query);

            END 


        COMMIT TRAN

        SELECT @SmoothieId
        RETURN
    END TRY

    BEGIN CATCH
        ROLLBACK
    END CATCH

END

または、別の DB アクセス方法を使用することもできます。

于 2012-09-09T23:37:34.480 に答える