2016-02-09 136 views
1

我正在尝试创建一个大型的事务范围或全部没有。我插入了大约2000条记录。我想插入主键,将其读回来,然后将外键插入到事务中,然后在发生错误时将所有内容都回滚。TransactionScope主键插入,然后外键插入 - >插入2主键行

PSS_InvoiceTotal表具有PK - > InvoiceTotalID

PSS_Invoices表具有FK - > InvoiceTotalID

的问题是在每个时间2点主键的行是由该数据库。我运行没有外键插入的代码,它工作正常。有没有办法阻止它创建2个主键行?

 using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required)) 
     { 
      try 
      { 
       conn.Open(); 

       foreach (var uniqueSupply in supplyList.GroupBy(a=>a.ShipTo)) 
       { 
        //reset total 
        total = 0; 

        var supplyListByShipTo = supplyList.Where(a => a.ShipTo == uniqueSupply.Key); 

        foreach (var addSupply in supplyListByShipTo) 
        { 
         total = total + addSupply.Amount; 
        } 

        StringBuilder insert_PSS_InvoiceTotal = new StringBuilder(); 

        //save total to DB 
        insert_PSS_InvoiceTotal = new StringBuilder(); 
        insert_PSS_InvoiceTotal.Append("INSERT INTO [PSS_InvoiceTotal] "); 
        insert_PSS_InvoiceTotal.Append("([InvoiceDate],[Amount]) "); 
        insert_PSS_InvoiceTotal.Append("VALUES(@DateTime, @Amount) "); 
        insert_PSS_InvoiceTotal.Append("SELECT SCOPE_IDENTITY() AS [InvoiceTotalID];"); 

        cmd = new SqlCommand(insert_PSS_InvoiceTotal.ToString(), conn); 

        cmd.Parameters.AddWithValue("@DateTime", DateTime.Now); 
        cmd.Parameters.AddWithValue("@Amount", total); 

        //ToDo: Add back in later 
        cmd.ExecuteNonQuery(); 

        SqlDataReader dr = cmd.ExecuteReader(); 
        if (dr.Read()) 
        { 
         InvoiceTotalID = Convert.ToInt32(dr["InvoiceTotalID"].ToString()); 
        } 

        dr.Close(); 

        foreach (var supply in supplyListByShipTo) 
        { 
         StringBuilder insert_PSS_Invoice = new StringBuilder(); 

         //Create the SQL command 
         insert_PSS_Invoice.Append("INSERT INTO [PSS_Invoices] "); 
         insert_PSS_Invoice.Append("([ClientDetailId],Amount],InvoiceTotalId)"); 
         insert_PSS_Invoice.Append("VALUES("); 
         insert_PSS_Invoice.Append("@Amount,@InvoiceTotalId)"); 

         cmd = new SqlCommand(insert_PSS_Invoice.ToString(), conn); 

         cmd.Parameters.AddWithValue("@Amount", 4.44); 
         cmd.Parameters.AddWithValue("@InvoiceTotalId", InvoiceTotalID); 

         //ToDo: put back in later 
         cmd.ExecuteNonQuery(); 
        } 
       } 

       //Close connection 
       conn.Close(); 

       //Commit and Dispose Transaction 
       scope.Complete(); 
       scope.Dispose(); 
      } 

      catch (Exception ex) 
      { 
       //Rollback Transaction 
       scope.Dispose(); 
       return Json(new { success = false, message = ex.ToString() }, JsonRequestBehavior.AllowGet); 
      } 
     } 
+1

您正在执行两次相同的命令。一次使用'ExecuteNonQuery',一次使用'ExecuteReader'。仅使用'ExecuteReader'就足够了。 –

+0

你是对的 - > Klaus Byskov Pedersen –

回答

0

试评

//ToDo: Add back in later 
//cmd.ExecuteNonQuery();