2012-09-09 12 views
7

वापस लौटें। जब मैं इसका परीक्षण करता हूं, तो हमेशा सही परिणाम प्राप्त करें।संग्रहित प्रक्रिया को कॉल करने के लिए Dapper.net का उपयोग करके, हमेशा मेरी पिछली प्रक्रिया में -1 वापस

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 संग्रहित प्रक्रिया से वापसी मूल्य नहीं उठा सकता है। लेकिन मैं वास्तव में नहीं जानता कि इसे कैसे ठीक किया जाए। कृपया मदद करे।

उत्तर

2

ऐसा लगता है कि Dapper.net निष्पादन विधि के लिए SqlCommand.ExecuteNonQuery का उपयोग करता है। यह प्रभावित पंक्तियों की संख्या को प्रभावित करता है, न कि रिटर्न स्टेटमेंट का मूल्य। क्या आप देख रहे हैं Query

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

है हालांकि मुझे नहीं लगता कि वापसी कथन या तो, इस स्थिति में आप सेट एक परिणाम देने के संग्रहीत प्रक्रिया में परिवर्तन करने की आवश्यकता होगी पर कब्जा है।

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 

या आप एक और डीबी एक्सेस विधि का उपयोग कर सकते हैं।

+0

धन्यवाद। लेकिन आपको अभी भी निष्पादन का उपयोग करना होगा, मुझे ऑनलाइन एक और नमूना मिला, और यह काम करता है। – qinking126

13

समाधान मिला, यहां मुझे मिला नमूना कोड है। और यह काम करता है।

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

तो कारण यह है कि() रिटर्न निष्पादित -1 है क्योंकि आपके sproc SET NOCOUNT ON; जो this question के अनुसार, "किसी भी DML के बाद संदेश" xx पंक्तियों प्रभावित "को दबा" है। चाहे आप इसे अक्षम करना चाहते हैं या नहीं, उस लिंक में एक और प्रश्न भी चर्चा की गई है।

मैं बस एक ही समस्या में आया, इसलिए मैंने सोचा कि मैं अपने 2 सेंट में फेंक दूंगा।

+0

इसे कभी नहीं पता था! +1 – nawfal

1

हाल ही में मुझे एक मूल्य को वापस करने के लिए एक मौजूदा प्रक्रिया को बदलना पड़ा, और मैं पैरामीटर को पारित करने के लिए एक अनाम प्रकार का उपयोग कर रहा था। इस संदर्भ में, वास्तव में अच्छी बात यह है कि DynamicParameters किसी अज्ञात प्रकार को इनपुट पैरामीटर के रूप में समर्थन करता है, जो इस परिवर्तन को कार्यान्वित करने में आसान बनाता है।

मैं निम्नलिखित था:

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

मैं सक्षम परिवर्तन किया गया है कि करने के लिए:

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