2016-02-09 132 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();