2012-01-12 21 views
6

Aşağıdaki kodu çalıştırmayı denediğimde bu hata iletisini alıyorum.ExecuteNonQuery, bir işlemin olmasını gerektiren komutu gerektirir

ExecuteNonQuery requires the command to have a transaction when the connection assigned to the command is in a pending local transaction 

Sorunun nerede olduğunu bilen biri var mı? Sorunun kökü, saklı bir prosedürü yürütmeye çalıştığım kısım. far.you SqlTransaction ilgili her şeyi silebilir böylece bağlantı dizesi işlem popüler değil kullanılarak

using (SqlConnection conn = new SqlConnection(connStr)) 
      { 
       conn.Open(); 

       SqlCommand command = conn.CreateCommand(); 
       SqlTransaction transaction; 

       // Start a local transaction. 
       transaction = conn.BeginTransaction("createOrder"); 

       // Must assign both transaction object and connection 
       // to Command object for a pending local transaction 
       command.Connection = conn; 
       command.Transaction = transaction; 

       try 
       { 
        command.CommandText = "INSERT INTO rand_resupply_order (study_id, centre_id, date_created, created_by) " + 
         "VALUES (@study_id, @centre_id, @date_created, @created_by) SET @order_id = SCOPE_IDENTITY()"; 

        command.Parameters.Add("@study_id", SqlDbType.Int).Value = study_id; 
        command.Parameters.Add("@centre_id", SqlDbType.Int).Value = centre_id; 
        command.Parameters.Add("@date_created", SqlDbType.DateTime).Value = DateTime.Now; 
        command.Parameters.Add("@created_by", SqlDbType.VarChar).Value = username; 

        SqlParameter order_id = new SqlParameter("@order_id", SqlDbType.Int); 
        //study_name.Value = 
        order_id.Direction = ParameterDirection.Output; 
        command.Parameters.Add(order_id); 

        command.ExecuteNonQuery(); 
        command.Parameters.Clear(); 

        //loop resupply list 
        for (int i = 0; i < resupplyList.Count(); i++) 
        { 
         try 
         { 
          SqlCommand cmd = new SqlCommand("CreateOrder", conn); 
          cmd.CommandType = CommandType.StoredProcedure; 

          cmd.Parameters.Add("@study_id", SqlDbType.Int).Value = study_id; 
          cmd.Parameters.Add("@centre_id", SqlDbType.Int).Value = centre_id; 
          cmd.Parameters.Add("@created_by", SqlDbType.VarChar).Value = username; 
          cmd.Parameters.Add("@quantity", SqlDbType.VarChar).Value = resupplyList[i].Quantity; 
          cmd.Parameters.Add("@centre_id", SqlDbType.Int).Value = centre_id; 
          cmd.Parameters.Add("@depot_id", SqlDbType.VarChar).Value = depot_id; 
          cmd.Parameters.Add("@treatment_code", SqlDbType.Int).Value = centre_id; 
          cmd.Parameters.Add("@order_id", SqlDbType.Int).Value = (int)order_id.Value; 
          cmd.ExecuteNonQuery(); 
         } 
         catch (SqlException ex) 
         { 
          transaction.Rollback(); 
          ExceptionUtility.LogException(ex, "error"); 
          throw ex; 
         } 
         catch (Exception ex) 
         { 
          transaction.Rollback(); 
          ExceptionUtility.LogException(ex, "error"); 
          throw ex; 
         } 
         finally 
         { 
          conn.Close(); 
          conn.Dispose(); 
         } 

        } 

        return (int)order_id.Value; 

       } 
       catch (Exception ex) 
       { 
        transaction.Rollback(); 
        ExceptionUtility.LogException(ex, "error"); 
        throw ex; 
       } 
       finally 
       { 
        // Attempt to commit the transaction. 
        transaction.Commit(); 

        conn.Close(); 
        conn.Dispose(); 
        command.Dispose(); 
       } 
+0

Minör noktası -, Ameliyattan sonra –

+0

biraz eski olabilir, bunun yerine, 'try' olmalıdır, ancak bu teyit ediniz olabilir -' finally' içinde işlemeye çalışmamalıdır cevabın problemini çözdü mü? – Afshin

cevap

2

yürütmek ve sonra kodunuzu sarın zaman saklı işlemdir

kendi işlem oluşturur TransactionScope

+1

TransactionScope'a çok dikkat edin. Çalışırken oldukça güzel görünüyor. Ancak yerel olmayan SQL sunucularını hedeflerken çok kırılgan buldum. "Doğru" kurulum için gereken şeylere ihtiyacın var. –

11

İşlemi kullanırken, her yerde kullanmalısınız.

cmd.Transaction = transaction; 
+0

, saklı yordamların kendi işlemlerini içerdiği zaman önemli midir? – pothios

+0

Aslında evet. Net açıdan görünüyor. – Afshin

+0

sorusu nasıl kendi işlem ile saklı bir prosedür çağıracak bir işlem çalıştıran nasıl elde edebilirsiniz :( – pothios

İlgili konular