2012-09-09 22 views
7

đây là quy trình được lưu trữ của tôi. khi tôi kiểm tra nó, luôn luôn có được kết quả chính xác trở lại.Sử dụng Dapper.net để gọi thủ tục lưu sẵn, luôn trả lại -1 trở lại

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 

Tuy nhiên Khi tôi gọi thủ tục được lưu trữ này bằng dapper.net, luôn trả về -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); 
     } 

Có thể, dapper.net không thể nhận giá trị trả lại từ quy trình được lưu trữ. nhưng tôi thực sự không biết cách sửa nó. Hãy giúp tôi.

Trả lời

2

Dường như Dapper.net sử dụng SqlCommand.ExecuteNonQuery cho phương thức Thi hành. Điều này trả về số hàng bị ảnh hưởng, chứ không phải giá trị của câu lệnh trả về. Những gì bạn đang tìm kiếm là Query

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

Mặc dù tôi không nghĩ rằng sẽ nắm bắt được tuyên bố trở lại, hoặc, trong trường hợp này bạn sẽ cần phải thay đổi các thủ tục lưu trữ để trả về một kết quả thiết lập.

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 

Hoặc bạn có thể sử dụng phương pháp truy cập DB khác.

+0

nhờ. nhưng bạn vẫn phải sử dụng thực thi, tôi tìm thấy một mẫu khác trực tuyến và nó hoạt động. – qinking126

13

Tìm thấy giải pháp, đây là mã mẫu tôi tìm thấy trực tuyến. Và nó hoạt động.

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"); 
14

Vì vậy, lý do mà Execute() trả về -1 là vì sproc của bạn có SET NOCOUNT ON; mà "ức chế 'hàng xx bị ảnh hưởng' tin nhắn sau khi bất kỳ DML" theo this question. Cho dù bạn muốn tắt hay không thì cũng có một câu hỏi khác được thảo luận trong liên kết đó.

Tôi chỉ gặp vấn đề tương tự nên tôi nghĩ mình sẽ ném 2 xu của mình.

+0

Không bao giờ biết điều này! +1 – nawfal

1

Gần đây tôi đã phải thay đổi quy trình hiện có để trả về giá trị bổ sung và tôi đã sử dụng loại ẩn danh để chuyển các tham số. Trong bối cảnh này, điều thực sự tốt đẹp là DynamicParameters hỗ trợ kiểu ẩn danh làm tham số đầu vào, điều này làm cho thay đổi này dễ thực hiện.

tôi đã có sau:

cnn.Execute("spMagicProc", new { a = 11, x = 13, y = 14, z = "something" }, 
    commandType: commandType.StoredProcedure); 

Tôi đã thay đổi có thể đến:

var p = new DynamicParameters(new { a = 11, x = 13, y = 14, z = "something" }); 
p.Add("@rval", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue); 

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

int rval = p.Get<int>("@rval");