2009-11-12 16 views
7

मैं एक सी # एप्लिकेशन बनाना चाहता हूं जिसमें दो फाइलों को दो अलग-अलग फ़ोल्डरों में कॉपी करें (पहले से ही पुरानी संस्करण फाइलें हैं) और एसक्यूएल स्क्रिप्ट भी चलाएं। पूरी प्रक्रिया के दौरान यदि कोई अपवाद उत्पन्न होता है तो मुझे सभी परिवर्तनों को रोलबैक करने की आवश्यकता होती है।रोलबैक सुविधा कैसे लागू करें?

एसक्यूएल स्क्रिप्ट के लिए, ट्रांसलेशन का उपयोग किया जा सकता है लेकिन रोलबैक के साथ प्रक्रिया की प्रतिलिपि बनाने वाली फ़ाइलों को कैसे कार्यान्वित किया जाता है?

+0

प्रयास करें, फ़ाइल-प्रणाली परिवर्तन भी एक सौदे में रखा जा सकता। विंडोज विस्टा एनटीएफएस से शुरू करने से यह क्षमता है। – Joey

उत्तर

2

आप इसे बदलने से पहले पुरानी फ़ाइल से एक प्रतिलिपि बना सकते हैं, और फिर यदि इस प्रतिलिपि से कोई अपवाद पुनर्स्थापित हो गया है।

0

क्या यह आपके उपयोग के मामले में फ़ाइलों को एक अस्थायी निर्देशिका में कॉपी करने के लिए फिट करेगा और फिर पूरी निर्देशिका को स्थानांतरित कर देगा? यदि ऐसा है, तो रोलबैक अस्थायी निर्देशिका को हटाने के रूप में सरल है।

+1

और यदि आप उस निर्देशिका का स्थानांतरण ऑपरेशन विफल हो जाते हैं तो आप क्या करते हैं? यह शायद ही कभी परमाणु ऑपरेशन है, इसलिए यह * असफल हो सकता है। – Joey

+0

चाल वास्तव में अधिकांश ओएस में एक नाम है। यह एक ही ऑपरेशन में होता है। ओएस परिवर्तन के दौरान निर्देशिका का प्रतिनिधित्व करने वाली फ़ाइल को लॉक करता है, इसलिए यह कार्य करता है जैसे कि यह परमाणु है। लिनक्स 'एमवी' कमांड के लिए इस प्राचीन मैन पेज में दी गई गारंटी देखें: http://www.linuxmanpages.com/man2/rename.2.php –

3

यदि संभव हो तो आप Transactional NTFS का लाभ उठा सकते हैं। यदि नहीं, तो आप अपने द्वारा किए गए संचालन की एक सूची रख सकते हैं और रोलबैक की आवश्यकता होने पर इसके विपरीत हो सकते हैं।

3

या आप एक सॉफ्टवेयर डेवलपर के रूप में विकसित हो सकते हैं और Command Pattern का उपयोग कर सकते हैं और बैच कॉमांड लागू कर सकते हैं। कमांड कार्यक्षमता पूर्ववत करना और इसे बुद्धिमान तरीके से encapsulate करना बहुत आसान बनाता है। बैच कॉमांड इसके बाद प्रत्येक कमांड पर अपनी सूची में पूर्ववत() को कॉल कर सकता है।

पैटर्न के लिए एक अच्छा प्राइमर के लिए, बाहर की जाँच Head First Design Patterns

0

मैं एक प्रत्यय और एक यादृच्छिक संख्या जोड़कर नई फ़ाइलों की प्रतिलिपि, इस प्रकार पहले से मौजूद फ़ाइल नाम के साथ संघर्ष करने के लिए से बचने।

नमूना ... पुरानी फ़ाइल = "myfile.txt", नई फ़ाइल = "myfile.txt.new.285387"।

फिर, जब कॉपी प्रक्रिया समाप्त हो जाती है, तो मैं ... - पुरानी फ़ाइल को "myfile.txt.old.3464353" के रूप में नामित करें। - नई फ़ाइल को "myfile.txt" के रूप में नामित करें - अंत में पुराना मिटा दिया जाएगा।

0

प्रणाली आप लक्षित के आधार पर इस कोड

public bool updateusertable(string UserName,string Password,string Datetime) 
      { 
       bool bResult = false;    
      SqlTransaction tx; 
       try 
       { 
        tx=conn.Begintransaction(); 
        SqlCommand Ocmd = new SqlCommand(); 
        Sqlconnect = Cconnect.OpenSqlConnection(); 
        Ocmd.Connection = Sqlconnect; 
        Ocmd.CommandType = CommandType.StoredProcedure; 
        Ocmd.CommandText = "SP_User_login_Update"; 
        Ocmd.Parameters.Add("@UserName", SqlDbType.VarChar, 100).Value = UserName; 
        Ocmd.Parameters.Add("@Password", SqlDbType.VarChar, 100).Value = Password; 
        Ocmd.Parameters.Add("@lastlogin", SqlDbType.VarChar, 100).Value = Datetime; 
        int i = Ocmd.ExecuteNonQuery(); 
        if (i <= 1) 
        { 
         bResult = true; 
         tx.Commit(); 
        }else 
        { 
         tx.Rollback(); 
        } 
       } 
       catch (Exception ex) 
       { 
        string msg = ex.Message.ToString(); 
        tx.Rollback(); 
       } 
       finally 
       { 

       } 
       return bResult; 
      } 
संबंधित मुद्दे