2013-02-25 55 views
17

यह मानते हुए कि हम एक संग्रहीत प्रक्रिया है कि कुछ इस तरह करता है के बाद ExecuteNonQuery का मूल्य:वापसी रोलबैक

BEGIN TRANSACTION 
    UPDATE sometable SET aField = 0 WHERE anotherField = 1;  
    UPDATE sometable SET aField = 1 WHERE anotherField = 2; 
ROLLBACK TRANSACTION; 

और सी # से हम कुछ इस तरह है:

using (var connection = new SqlConnection("connection string")) 
{ 
    connection.Open(); 
    var cmd = connection.CreateCommand(); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.CommandText = "my_procedure"; 
    var res = cmd.ExecuteNonQuery();     
} 

मैं क्यों नहीं कर रहा हूँ res == -1 हो रही है? मुझे अभी भी प्रभावित पंक्तियों की संख्या मिल रही है। प्रलेखन राज्यों "If a rollback occurs, the return value is also -1"

मैं यहाँ क्या याद कर रहा हूँ कब?

+2

रेस का मूल्य क्या है? "1 पंक्ति (यों) प्रभावित" इस मामले में – Peter

+0

@peer यह प्रभावित पंक्तियों – coffeeyesplease

+0

दिलचस्प बात यह है कि अगर तुम सिर्फ SSMS में इस कोड को चलाने की संख्या 2., आप मिलेगा या इसी तरह की। (या 2, या जो कुछ भी है - लेकिन नहीं 0 भले ही यह वापस लुढ़का है।) समारोह rowcount संदेशों संक्षेप है की तरह – Rawling

उत्तर

1

ऐसा लगता है कि ExecuteNonQuery के रिटर्न मान भले ही प्रलेखन स्पष्ट रूप से कहा गया है कि करता है एक रोलबैक से अप्रभावित है। यहां कुछ संभावित कामकाज हैं।

1) का प्रयोग करें ExecuteScalar

सपा:

DECLARE @RowCount INT 
DECLARE @Error INT 

BEGIN TRAN 

UPDATE Table1 SET Value1 = NULL 

SELECT @RowCount = @@ROWCOUNT, @Error = @@ERROR 

IF @Error <> 0 BEGIN 
    ROLLBACK TRAN 
    SELECT -1 
END ELSE BEGIN 
    COMMIT TRAN 
    SELECT @RowCount 
END 

सी #

using (SqlConnection dbConnection = new SqlConnection("Data Source=.;Initial Catalog=Database1;Integrated Security=True;MultipleActiveResultSets=True")) 
{ 
    dbConnection.Open(); 

    using (SqlCommand command = dbConnection.CreateCommand()) 
    { 
     command.CommandText = "QuickTest"; 
     command.CommandType = CommandType.StoredProcedure; 

     rowsAffected = command.ExecuteScalar(); 
    } 
} 

2) एक वापसी/आउटपुट पैरामीटर का उपयोग

सपा: घोषित @RowCount INT घोषणा @Error INT

BEGIN TRAN 

UPDATE Table1 SET Value1 = NULL 

SELECT @RowCount = @@ROWCOUNT, @Error = @@ERROR 

IF @Error <> 0 BEGIN 
    ROLLBACK TRAN 
    RETURN -1 
END ELSE BEGIN 
    COMMIT TRAN 
    RETURN @RowCount 
END 

सी #

using (SqlConnection dbConnection = new SqlConnection("Data Source=.;Initial Catalog=Database1;Integrated Security=True;MultipleActiveResultSets=True")) 
{ 
    dbConnection.Open(); 

    using (SqlCommand command = dbConnection.CreateCommand()) 
    { 
     command.Parameters.Add(new SqlParameter() {Direction = ParameterDirection.ReturnValue }); 
     command.CommandText = "QuickTest"; 
     command.CommandType = CommandType.StoredProcedure; 

     command.ExecuteNonQuery(); 
     rowsAffected = command.Parameters[0].Value; 
    } 
} 

3) रोलबैक/ले जाएँ कोड में तर्क प्रतिबद्ध

थी एस आपको यह निर्धारित करने की क्षमता देगा कि क्या रोलबैक हुआ और आवश्यक होने पर -1 का मान आउटपुट करें। लेनदेन विवरण को स्पोक से हटा देना होगा।

सपा:

UPDATE Table1 SET Value1 = NULL 

सी #:

using (SqlConnection dbConnection = new SqlConnection("Data Source=.;Initial Catalog=Database1;Integrated Security=True;MultipleActiveResultSets=True")) 
{ 
    dbConnection.Open(); 

    using (SqlTransaction tran = dbConnection.BeginTransaction()) 
    { 
     using (SqlCommand command = dbConnection.CreateCommand()) 
     { 
      command.Transaction = tran; 

      try 
      { 
       command.Parameters.Add(new SqlParameter() {Direction = ParameterDirection.ReturnValue }); 
       command.CommandText = "QuickTest"; 
       command.CommandType = CommandType.StoredProcedure; 

       rowsAffected = command.ExecuteNonQuery(); 
      } 

      catch (Exception) 
      { 
       rowsAffected = -1; 
       throw; 
      } 

      tran.Commit(); 
     } 
    } 
} 

जैसा कि पहले बताया गया है, @@ ROWCOUNT मूल्य और ExecuteNonQuery परिणाम दोनों चलाता से प्रभावित हैं।

+0

ध्यान देने योग्य एक बात यह है कि यदि कोई ट्रिगर होता है - तो उन पंक्तियों को जोड़ा जाएगा - इसलिए ओपी को उन लोगों के लिए भी देखना होगा। –

+0

हाय। धन्यवाद लेकिन यह वह नहीं है जिसे मैं ढूंढ रहा हूं। जब क्वेरी ठीक हो जाती है तो मैं प्रभावित पंक्तियों की संख्या चाहता हूं। जैसा कि मैं चाहता हूं -1 अगर नहीं। कोई COUNT सेट करके मैं हमेशा ExecuteNonQuery – coffeeyesplease

+0

के परिणामस्वरूप -1 प्राप्त करूंगा और यह दस्तावेज कहता है। यह कहता है "अद्यतन, INSERT, और हटाए गए बयानों के लिए, वापसी मूल्य कमांड से प्रभावित पंक्तियों की संख्या है। जब एक ट्रिगर डालने या अद्यतन होने पर एक ट्रिगर मौजूद होता है, तो वापसी मूल्य में दोनों डालने से प्रभावित पंक्तियों की संख्या शामिल होती है या ऑपरेशन और ट्रिगर या ट्रिगर्स से प्रभावित पंक्तियों की संख्या अपडेट करें। अन्य सभी प्रकार के बयानों के लिए, वापसी मूल्य -1 है। यदि रोलबैक होता है, तो वापसी मूल्य भी -1 होता है। " – coffeeyesplease