2013-01-17 39 views
6

मैं ADO.NET में मैन्युअल रूप से एक लेनदेन कोडिंग कर रहा हूं। उदाहरण जो मैं काम कर रहा हूं SqlCommand का पुन: उपयोग करता है जो एक अच्छा विचार प्रतीत होता है।क्या मुझे पैरामीटर्स को कॉल करना चाहिए। एक एसकएल कॉमांड को एक ट्रांसलेशन के साथ पुन: उपयोग करते समय साफ़ करें?

हालांकि, मैंने अपने आदेश में पैरामीटर जोड़े हैं।

मेरा प्रश्न है: निम्नलिखित कोड में, command.Parameters.Clear() सही है? या मैं यह गलत कर रहा हूँ?

using (var connection = new SqlConnection(EomAppCommon.EomAppSettings.ConnStr)) 
{ 
    connection.Open(); 
    SqlTransaction transaction = connection.BeginTransaction(); 
    SqlCommand command = connection.CreateCommand(); 
    command.Transaction = transaction; 
    try 
    { 
     foreach (var itemIDs in this.SelectedItemIds) 
     { 
      command.CommandText = "UPDATE Item SET payment_method_id = @batchID WHERE id in (@itemIDs)"; 
      // IS THE FOLLOWING CORRECT? 
      command.Parameters.Clear(); 

      command.Parameters.Add(new SqlParameter("@batchID", batchID)); 
      command.Parameters.Add(new SqlParameter("@itemIDs", itemIDs)); 
      command.ExecuteNonQuery(); 
     } 
     transaction.Commit(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show("Failed to update payment batches, rolling back." + ex.Message); 
     try 
     { 
      transaction.Rollback(); 
     } 
     catch (Exception exRollback) 
     { 
      if (!(exRollback is InvalidOperationException)) // connection closed or transaction already rolled back on the server. 
      { 
       MessageBox.Show("Failed to roll back. " + exRollback.Message); 
      } 
     } 
    } 
} 
+0

क्यों लूप के अंदर कमांड नहीं बनाते? या एक SQL कथन बनाएं जो एक ही समय में सभी अपडेट कर सकता है, और लूप से पूरी तरह से बच सकता है? –

उत्तर

6

चूंकि आप बार-बार वही क्वेरी निष्पादित कर रहे हैं, इसलिए उन्हें साफ़ करने के लिए अनावश्यक है - आप लूप के बाहर पैरामीटर जोड़ सकते हैं और बस उन्हें अंदर भर सकते हैं।

try 
{ 
    command.CommandText = "UPDATE Item SET payment_method_id = @batchID WHERE id in (@itemIDs)"; 
    command.Parameters.Add(new SqlParameter("@batchID", 0)); 
    command.Parameters.Add(new SqlParameter("@itemIDs", "")); 

    foreach (var itemIDs in this.SelectedItemIds) 
    { 
     command.Parameters["@batchID"].Value = batchID; 
     command.Parameters["@itemIDs"].Value = itemIDs; 
     command.ExecuteNonQuery(); 
    } 
    transaction.Commit(); 
} 

नोट - you can't use parameters with IN as you've got here - यह काम नहीं करेगा।

+0

के बाहर लाइन को स्थानांतरित करने के बारे में टिप के लिए धन्यवाद हाँ, मैंने अभी पाया है कि आईएन क्लॉज के बारे में, लिंक के लिए धन्यवाद –

1

इस हालत आपको इसकी आवश्यकता के रूप में आप नए मानकों मूल्यों को निर्धारित की जरूरत है, इसलिए इसकी सही।

वैसे, भी ले जाने के पाश की

command.CommandText = ".." 

बाहर के रूप में यह कभी नहीं बदल गया है।

+0

लूप –