मैंने थोड़ा सी # विधि "विरासत" प्राप्त की है जो डेटाबेस (SQL सर्वर 2005) में सहेजे जाने वाले आइटम्स की एक सूची पर ADO.NET SqlCommand ऑब्जेक्ट और लूप बनाता है।एडीओ.NET रिफैक्टरिंग - एसक्यूएलट्रांसक्शन बनाम ट्रांज़ेक्शनस्कोप
अभी, पारंपरिक SqlConnection/SqlCommand दृष्टिकोण का उपयोग किया जाता है, और यह सुनिश्चित करने के लिए कि सब कुछ काम करता है, दो चरणों (पुरानी प्रविष्टियों को हटाएं, फिर नए डालें) को ADO.NET SqlTransaction में लपेटा जाता है।
using (SqlConnection _con = new SqlConnection(_connectionString))
{
using (SqlTransaction _tran = _con.BeginTransaction())
{
try
{
SqlCommand _deleteOld = new SqlCommand(......., _con);
_deleteOld.Transaction = _tran;
_deleteOld.Parameters.AddWithValue("@ID", 5);
_con.Open();
_deleteOld.ExecuteNonQuery();
SqlCommand _insertCmd = new SqlCommand(......, _con);
_insertCmd.Transaction = _tran;
// add parameters to _insertCmd
foreach (Item item in listOfItem)
{
_insertCmd.ExecuteNonQuery();
}
_tran.Commit();
_con.Close();
}
catch (Exception ex)
{
// log exception
_tran.Rollback();
throw;
}
}
}
अब, मैं हाल ही में नेट TransactionScope वर्ग बारे में बहुत कुछ पढ़ रहा है, और मैं सोच रहा था, क्या पसंद किया दृष्टिकोण यहाँ है? क्या मुझे
using (TransactionScope _scope = new TransactionScope())
{
using (SqlConnection _con = new SqlConnection(_connectionString))
{
....
}
_scope.Complete();
}
का उपयोग करने के लिए स्विच करके कुछ भी (पठनीयता, गति, विश्वसनीयता) प्राप्त होगा, और आप क्यों पसंद करेंगे?
मार्क
ठीक है, धन्यवाद जॉन - और हाँ, आप सही हैं - इस उदाहरण में() ब्लॉक (अभी तक!) का उपयोग करने में SqlCommand नहीं है - यह प्रगति पर है :-) –
पुन: SQLCommand उपयोग के अंदर, क्या कोई है कचरा संग्रह के अलावा अन्य कारण, उदाहरण के लिए: SQLConnection के लिए निपटान() बंद करें() विधि को कॉल करता है, इसलिए किसी भी SQLCommand विधियों को अस्वीकार() को कॉल करता है? –
यदि कोई वर्ग 'आईडीस्पोजेबल' लागू करता है, और यदि आप इस कक्षा का उदाहरण बनाते हैं, तो आपको उस पर निपटान करना चाहिए। ऐसा करने का सबसे आसान तरीका 'उपयोग' ब्लॉक के साथ है। मुझे हमेशा एक को लागू करने की आदत में जाना सर्वोत्तम होता है। –