Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Dapper.net to call stored procedure, always return -1 back

here's my stored procedure. when I test it, always get correct result back.

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

However When I call this stored procedure using dapper.net, always return -1 back.

        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);
        }

Probably, dapper.net cannot pick up the return value from the stored procedure. but I really dont know how to fix it. please help.

like image 578
qinking126 Avatar asked Sep 09 '12 22:09

qinking126


People also ask

How do you call a stored procedure from Dapper?

We can execute this stored procedure using Dapper with the following piece of C# code: using var con = new SqlConnection("<Your connectionstring>"); con. Open(); var sql = "EXEC GetEntity @Id"; var values = new { Id = 0 }; var getEntityResult = con. Query(sql, values).

What is dynamic parameters in Dapper?

The DynamicParameters type provides an Add method, enabling you to pass explicit parameters, specifying the datatype, direction and size: var parameters = new DynamicParameters(); var customerId = "ALFKI"; parameters. Add("@CustomerId", customerId, DbType.

Can we call stored procedure from Entity Framework?

You can also use stored procedure for add, update or delete operation when you call DBContext. SaveChanges method. So instead of creating SQL query, Entity Framework will use stored procedure for these operations.


2 Answers

Found the solution, here's the sample code I found online. and it works.

var p = new DynamicParameters();
p.Add("@a", 11);
p.Add("@b", dbType: DbType.Int32, direction: ParameterDirection.Output);
p.Add("@c", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);

cnn.Execute("spMagicProc", p, commandType: commandType.StoredProcedure); 

int b = p.Get<int>("@b");
int c = p.Get<int>("@c"); 
like image 110
qinking126 Avatar answered Oct 14 '22 06:10

qinking126


So the reason that Execute() returns -1 is because your sproc has SET NOCOUNT ON; which "suppresses the "xx rows affected" message after any DML" according to this question. Whether you want to disable that or not is another question also discussed in that link.

I just came across the same problem so I thought I'd throw in my 2 cents.

like image 29
joakes Avatar answered Oct 14 '22 08:10

joakes