2016-03-25 20 views
0

Aşağıdaki ekleme ve silme işlemlerinin tamamen çalıştığından veya tamamen çalışmadığından emin olmaya çalışıyorum. Bağlantı neslimin, işlem kapsamım dışında,% 100 emin olmadığına inanıyorum.TransactionScope çalışıyor görünüyor

Bu kodun amacım gibi çalışmadığını biliyorum. İlk kısımdan sonra (insert çalışır) ve daha sonra bir mola noktasında sona erdirerek iptal ediyorum, asla kapsamı tamamlamamış olsa bile satırlar gerçekten eklenir.

Lütfen buradaki düşünce ve mantığımdaki kusuru belirtin.

   sqlConnection.Open(); 

       int numFound = 1; 
       int max = 99; 
       int iteration = 0; 
       while (iteration < max && numFound > 0) 
       { 
        iteration++; 
        var ids = new List<int>(); 
        using (var sqlCommand0 = new SqlCommand(sql0, sqlConnection)) 
        { 
         using (SqlDataReader reader1 = sqlCommand0.ExecuteReader()) 
         { 
          while (reader1.Read()) 
          { 
           ids.Add(reader1.GetInt32(0)); 
          } 
         } 
        } 
        numFound = ids.Count; 
        if (numFound > 0) 
        { 
         using (var scope = new TransactionScope()) 
         { 
          string whereClause = $"WHERE Id IN ({string.Join(",", ids)})"; 

          string sql1 = string.Format(sqlTemplate1, whereClause); 
          using (var sqlCommand1 = new SqlCommand(sql1, sqlConnection)) 
          { 
           sqlCommand1.ExecuteNonQuery(); 
          } 

          // BREAK POINT HERE - ABORTED PROGRAM AND sql1 had been committed. 

          var sql2 = "DELETE FROM SendGridEventRaw " + whereClause; 
          using (var sqlCommand2 = new SqlCommand(sql2, sqlConnection)) 
          { 
           sqlCommand2.ExecuteNonQuery(); 
          } 
          scope.Complete(); 
          total += numFound; 
          Console.WriteLine("deleted: " + whereClause); 
         } 
        } 
       } 
      } 

cevap

3

Bunun sebebi, işleminizi başlatmadan önce bağlantınızı açmanızdır. İşleminizi başlatarak ve ardından bağlantınızı açarak sorununuzu gidermeye çalışabilirsiniz.

0

Sadece gelen ne görmeye ve ben ne ben varsayıyorum ne olmasını niyetinde şudur şudur:

if (numFound > 0) 
: İlk sorgu bazı kayıtları, bir sonraki sorgu dolayısıyla açıklamada, yürütür alırsa

Eğer durum böyleyse, ve noktanızı koyduğunuz yer true ise, tabii ki insert ifadesi yanacaktır. Nedeni ise:

, eğer bu ifadenin içinde yer almaktadır. "Herhangi bir satır varsa, ekleme sorgusunu yürütün" diyorsunuz.

Sorguyu yapmak için scope nesnesini almayı deniyorsanız, nesnenin içinde gerçekleşen tüm sorgu oluşturma işlemlerine sahip olmanız ve ardından yürütme işlemini scope.complete() yapması gerekir. Örneğin

:

//In TransactionScope class 

public string Complete(var ids, int numFound, SqlConnection sqlConnection, string sqlTemplate1) 
{ 
    string whereClause = $"WHERE Id IN ({string.Join(",", ids)})"; 

          string sql1 = string.Format(sqlTemplate1, whereClause); 
          using (var sqlCommand1 = new SqlCommand(sql1, sqlConnection)) 
          { 
           sqlCommand1.ExecuteNonQuery(); 
          } 

          var sql2 = "DELETE FROM SendGridEventRaw " + whereClause; 
          using (var sqlCommand2 = new SqlCommand(sql2, sqlConnection)) 
          { 
           sqlCommand2.ExecuteNonQuery(); 
          } 
          return whereClause; 
} 


//in your Main class 

if (num > 0) 
{ 
    string whereClause = scope.Complete(ids, numFound, sqlConnection, sqlTemplate1); 
    Console.WriteLine("deleted" + whereClause"."); 
} 

Ben tabii hemen yukarıda belirtilen varsayımlar kapalı gidiyorum. Eğer hatalıysam lütfen bana bildirin.

Yardım edin.

İlgili konular