2011-02-16 13 views
7

मैं निम्नलिखित प्रश्न हैं का उपयोग करके संग्रहीत प्रक्रिया से वापसी मान प्राप्त करने के लिए:सी # कैसे ExecuteNonQuery

create proc [dbo].[DeleteParts] 
    @TransNo nvarchar (6), @fpart nvarchar(25) 
AS 
    DECLARE @Returns BIT 
    SET @Returns = 1 

    BEGIN 
     TRY 
      BEGIN TRANSACTION 

      DELETE FROM PARTABLE 
      WHERE TransNo = @TransNo and fpart = @fpart 

      COMMIT 
     END TRY 
     BEGIN CATCH 
      Print 'Delete failed'  
      SET @Returns = 0  
      -- Any Error Occurred during Transaction. Rollback  
      IF @@TRANCOUNT > 0  
       ROLLBACK -- Roll back 
     END CATCH 

     RETURN @Returns 

यह बिल्कुल ठीक संकलित करता है।

सी # में, मैं इस क्वेरी को निष्पादित करना चाहता हूं और वापसी मूल्य प्राप्त करना चाहता हूं।

मेरे कोड के रूप में नीचे है:

using(System.Data.SqlClient.SqlCommand deletecommand = this._connection.CreateCommand()) 
{ 
    deletecommand.CommandText = "DeleteParts"; 
    deletecommand.CommandType = System.Data.CommandType.StoredProcedure; 
    deletecommand.Parameters.AddWithValue("@TransNo", ItemSODBOM.SONO); 
    deletecommand.Parameters.AddWithValue("@fpart", ItemSODBOM.fbompart); 

    string ReturnValue = deletecommand.ExecuteNonQuery().ToString(); 
} 

यह मुझे किसी भी त्रुटि नहीं देता है, लेकिन इसके बजाय यह प्रभावित पंक्तियों की संख्या लौटा रहा है, मैं वापस जाने के लिए 1 या 0.

उदाहरण हैं: अगर हटाना ऑपरेशन सफलता फिर 1 लौटती है और यदि यह विफल हो जाती है तो 0

स्रोत कोड के साथ कोई भी सहायता की सराहना की जाएगी।

धन्यवाद,

प्रदीप

+1

RemoteSojourner नोटों के रूप में, आप * कुछ भी वापस नहीं कर रहे हैं –

+0

यदि आप कोड, एक्सएमएल या डेटा नमूने पोस्ट करते हैं, ** कृपया ** टेक्स्ट एडिटर में उन पंक्तियों को हाइलाइट करें और संपादक टूलबार पर "कोड नमूने" बटन ('{}') पर क्लिक करें अच्छी तरह से प्रारूप और वाक्यविन्यास इसे हाइलाइट करने के लिए! (और ** ** इसके बजाय "उद्धरण" तंत्र का उपयोग नहीं करते हैं - जो सिर्फ आपके कोड को गड़बड़ कर देता है !!) –

उत्तर

14

आप के साथ Direction सेट ParameterDirection.ReturnValue

लिए कुछ की तरह एक पैरामीटर की आवश्यकता होगी जो आप सेट नहीं कर सकते हैं। तो वास्तव में आप मूल्यों को वापस करने के लिए इसका उपयोग नहीं कर सकते हैं।

2

मैं नहीं दिख रहा है कि आप मूल्य लौट रहे हैं। संग्रहीत प्रो से किसी भी मूल्य को वापस करने के लिए कृपया रिटर्न स्टेटमेंट जोड़ें।

SqlParameter returnParameter = deleteCommand.Parameters.Add("RetVal", SqlDbType.Int); 
returnParameter.Direction = ParameterDirection.ReturnValue; 
... 
deleteCommand.ExecuteNonQuery(); 
... 
int returnValue = (int) returnParameter.Value; 

आप संग्रहित प्रक्रिया निश्चित रूप से इस वापसी मान देने के लिए की जरूरत है:

create proc [dbo].[DeleteParts]  
    @TransNo nvarchar (6), 
    @fpart nvarchar(25) 
AS  
DECLARE @Returns BIT  
SET @Returns = 1  
... 
RETURN @Returns 
+0

यह उस प्रोसे से चूक गया था, अब इसे – Pradeep

0

आमतौर पर परिणाम एक पंक्ति के रूप में वापस किया जाता है, जैसे सामान्य चयन क्वेरी होगी। आप इसे पाठक या एडाप्टर का उपयोग कर प्राप्त कर सकते हैं।

1

ExecuteNonQuery प्रभावित पंक्तियों की संख्या वापस कर देगा लेकिन डेटा नहीं (यही कारण है कि यह एक गैर-क्वेरी है)। तो यह कुछ भी वापस नहीं लाएगा।

यह पढ़ने के लिए उपयोगी हो सकता है:

http://www.dreamincode.net/forums/topic/76434-executenonquery-with-output-parameters/

आप एक अलग तंत्र का उपयोग करने के बाहर अपना डेटा प्राप्त करने की आवश्यकता होगी - एक आउटपुट पैरामीटर के साथ कैसे करें के बारे ExecuteReader?

0

आप, इस

@IDout     [int] output 

तरह संग्रहित प्रक्रियाओं में उत्पादन प्रकार निर्दिष्ट करना होगा तो इस पैरामीटर

SPParamReturnCollection sp = new SPParamReturnCollection(); 
     sp.Add(new SPParams { Name = "IDout", ParamDirection = ParameterDirection.Output, Type = SqlDbType.Int }); 
0
IF EXISTS(SELECT TransNo FROM [PARTABLE] WHERE TransNo = @TransNo and fpart = @fpart 
     BEGIN      
      DELETE FROM PARTABLE 
         WHERE TransNo = @TransNo and fpart = @fpart 

      SELECT @TransNo AS RETURNVAL 
     END 
     ELSE 
     BEGIN 
      SELECT 0 AS RETURNVAL 
     END 
0

एक चर "@Returns" जादुई यह मूल्य है वापस नहीं करता है नामकरण जोड़ने आपको वास्तव में मूल्य वापस करना होगा।

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

प्रक्रिया के लिए एक return बयान जोड़ें:

create proc [dbo].[DeleteParts] 
    @TransNo nvarchar (6), @fpart nvarchar(25) 
AS 
    DECLARE @Returns INT 
    SET @Returns = 1 

    BEGIN 
    TRY 
     BEGIN TRANSACTION 

     DELETE FROM PARTABLE 
     WHERE TransNo = @TransNo and fpart = @fpart 

     COMMIT 
    END TRY 
    BEGIN CATCH 
     Print 'Delete failed'  
     SET @Returns = 0  
     -- Any Error Occurred during Transaction. Rollback  
     IF @@TRANCOUNT > 0  
      ROLLBACK 
    END CATCH 

RETURN @Returns 

दिशा ReturnValue साथ एक पैरामीटर जोड़ें वापसी मान प्राप्त करने के लिए:

int returnValue; 
using(System.Data.SqlClient.SqlCommand deletecommand = this._connection.CreateCommand()) 
{ 
    deletecommand.CommandText = "DeleteParts"; 
    deletecommand.CommandType = System.Data.CommandType.StoredProcedure; 
    deletecommand.Parameters.AddWithValue("@TransNo", ItemSODBOM.SONO); 
    deletecommand.Parameters.AddWithValue("@fpart", ItemSODBOM.fbompart); 
    var returnParameter = deletecommand.Parameters.Add("@ret", SqlDbType.Int); 
    returnParameter.Direction = ParameterDirection.ReturnValue; 

    deletecommand.ExecuteNonQuery(); 
    returnValue = (int)returnParameter.Value; 
} 
+0

जोड़ा गया है जो के पोस्ट – Pradeep

+0

@ प्रदीप: हाँ से कुछ अलग नहीं है , जो पोस्ट में सबकुछ इस पोस्ट में भी है, लेकिन इसका मतलब यह नहीं है कि इस पोस्ट में सबकुछ जो की पोस्ट में है। – Guffa

संबंधित मुद्दे