2009-02-23 4 views
6

में लेनदेन इस प्रश्न के अतिरिक्त: Preorder tree traversal copy folder मैं सोच रहा था कि लेनदेन बनाना संभव है जिसमें डेटाबेस में अलग-अलग कॉल शामिल हैं।सी #

पूर्व:

public bool CopyNode(int nodeId, int parentNode) 
    { 
     // Begin transaction. 
     try 
     { 
      Method1(nodeId); 
      Method2(nodeId, parentNode); 
      Method3(nodeId); 
     } 
     catch (System.Exception ex) 
     { 
      //rollback all the methods 
     } 
    } 

अगर यह संभव हो सकता है मैं नहीं जानता। हम डेटाबेस कॉल करने के लिए सबसनिक का उपयोग कर रहे हैं। यह वास्तव में महत्वपूर्ण है, न केवल पेड़ ट्रेवर्सल समस्या के लिए, लेकिन यह भी कुछ अन्य सामान हम करते हैं के लिए है।

मुख्य विचार हम अपने dabase uncomplete डेटा के साथ दूषित नहीं कर सकते हैं।

उत्तर

3

कि संभव है, यदि आप एक उदाहरण here

या शायद एक सौदे गुंजाइश पा सकते हैं ...

http://msdn.microsoft.com/en-us/library/ms172152.aspx

+1

ओह खेद है, तो, शायद एक सौदे दायरे में मदद मिलेगी, मैं इस के साथ काम नहीं है, लेकिन यहां कड़ी है: http://msdn.microsoft.com/en-us/library/ ms172152.aspx –

1

BeginTransaction बंद कहा जाता है एक ADO.NET संग्रह वस्तु। कमान वस्तु इस लेन-देन (SqlTransaction वस्तु) यह करने के लिए आवंटित की जरूरत है। कमिट और रोलबैक को केवल बाहरी विधि में ही बुलाया जाता है।

इस कोड को चेक आउट। यह SqlConnection और SqlTransaction ऑब्जेक्ट्स का पुन: उपयोग करके काम करता है। यह एक क्लासिक मास्टर> विवरण प्रकार का सेट अप है। मास्टर प्रकार ColumnHeaderSet जो

List<ColumnHeader>

की संपत्ति है, जो विवरण (संग्रह) होता है।

उम्मीद है कि इससे मदद मिलती है। -JM

public static int SaveColumnHeaderSet(ColumnHeaderSet set) 
     //save a ColumnHeaderSet 
     {  
     string sp = ColumnSP.usp_ColumnSet_C.ToString(); //name of sp we're using 
     SqlCommand cmd = null; 
     SqlTransaction trans = null; 
     SqlConnection conn = null; 

     try 
     { 
      conn = SavedRptDAL.GetSavedRptConn(); //get conn for the app's connString 
      cmd = new SqlCommand(sp, conn); 
      cmd.CommandType = CommandType.StoredProcedure; 
      conn.Open(); 
      trans = conn.BeginTransaction(); 
      cmd.Transaction = trans; // Includes this cmd as part of the trans 

      //parameters 
      cmd.Parameters.AddWithValue("@ColSetName", set.ColSetName); 
      cmd.Parameters.AddWithValue("@DefaultSet", 0); 
      cmd.Parameters.AddWithValue("@ID_Author", set.Author.UserID); 
      cmd.Parameters.AddWithValue("@IsAnonymous", set.IsAnonymous);   
      cmd.Parameters.AddWithValue("@ClientNum", set.Author.ClientNum); 
      cmd.Parameters.AddWithValue("@ShareLevel", set.ShareLevel); 
      cmd.Parameters.AddWithValue("@ID_Type", set.Type); 

      //add output parameter - to return new record identity 
      SqlParameter prm = new SqlParameter(); 
      prm.ParameterName = "@ID_ColSet"; 
      prm.SqlDbType = SqlDbType.Int; 
      prm.Direction = ParameterDirection.Output; 
      cmd.Parameters.Add(prm); 

      cmd.ExecuteNonQuery(); 
      int i = Int32.Parse(cmd.Parameters["@ID_ColSet"].Value.ToString()); 
      if (i == 0) throw new Exception("Failed to save ColumnHeaderSet"); 
      set.ColSetID = i; //update the object 

      //save the ColumnHeaderList (SetDetail) 
      if (ColumnHeader_Data.SaveColumnHeaderList(set, conn, trans)==false) throw new Exception("Failed to save ColumnHeaderList"); 
      trans.Commit(); 

      // return ID for new ColHdrSet 
      return i; 
     } 
     catch (Exception e){ 
      trans.Rollback(); 
      throw e; 
     } 
     finally{ 
      conn.Close(); 
     } 
     } 

public static bool SaveColumnHeaderList(ColumnHeaderSet set, SqlConnection conn, SqlTransaction trans) 
     //save a (custom)ColHeaderList for a Named ColumnHeaderSet 
     { 
     // we're going to accept a SqlTransaction to maintain transactional integrity 
     string sp = ColumnSP.usp_ColumnList_C.ToString(); //name of sp we're using 
     SqlCommand cmd = null; 
     try 
     { 
      cmd = new SqlCommand(sp, conn);  // re-using the same conection object 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Transaction = trans;   // includes the cmd in the transaction 

      //build params collection (input) 
      cmd.Parameters.Add("@ID_ColSet", SqlDbType.Int); 
      cmd.Parameters.Add("@ID_ColHeader", SqlDbType.Int); 
      cmd.Parameters.Add("@Selected", SqlDbType.Bit); 
      cmd.Parameters.Add("@Position", SqlDbType.Int); 

      //add output parameter - to return new record identity 
      //FYI - @return_value = @ID_SavedRpt 
      SqlParameter prm = new SqlParameter(); 
      prm.ParameterName = "@ID"; 
      prm.SqlDbType = SqlDbType.Int; 
      prm.Direction = ParameterDirection.Output; 
      cmd.Parameters.Add(prm); 

      //Loop 
      foreach (ColumnHeader item in set.ColHeaderList) 
      { 
       //set param values 
       cmd.Parameters["@ID_ColSet"].Value = set.ColSetID; 
       cmd.Parameters["@ID_ColHeader"].Value = item.ColHeaderID; 
       cmd.Parameters["@Selected"].Value = item.Selected; 
       cmd.Parameters["@Position"].Value = item.Position; 

       cmd.ExecuteNonQuery(); 
       int i = Int32.Parse(cmd.Parameters["@ID"].Value.ToString()); 
       if (i == 0) throw new Exception("Failed to save ColumnHeaderSet"); 
      } 
      return true; 
     } 
     catch (Exception e) 
     { 
      throw e;    
     } 

     }