Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TransactionScope主键插入然后外键插入->插入2行主键_C#_Sql Server_Transactionscope - Fatal编程技术网

C# TransactionScope主键插入然后外键插入->插入2行主键

C# TransactionScope主键插入然后外键插入->插入2行主键,c#,sql-server,transactionscope,C#,Sql Server,Transactionscope,我正在尝试创建一个大型transactionScope,它要么全有,要么全无。我正在插入大约2000条记录。我想插入主键,读回它,然后在事务中插入外键,然后在发生错误时回滚所有内容 PSS\u InvoiceTotal表具有主键->InvoiceTotalID PSS_发票表具有FK->InvoiceTotalID 每次生成2个主键行时,问题就出现在数据库中。我在没有外键插入的情况下运行了代码,它运行得很好。有没有办法防止它生成两个主键行 using (TransactionSc

我正在尝试创建一个大型transactionScope,它要么全有,要么全无。我正在插入大约2000条记录。我想插入主键,读回它,然后在事务中插入外键,然后在发生错误时回滚所有内容

PSS\u InvoiceTotal表具有主键->InvoiceTotalID

PSS_发票表具有FK->InvoiceTotalID

每次生成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);
            }
        }
试着评论

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

可能您可以研究使用INSERT命令的输出选项来获取INSERT执行的主键。这样你就不必再读了。查看此链接:


此外,您可能需要向command对象添加输出参数以获取该信息。

您正在执行同一命令两次。一次使用ExecuteOnQuery,一次使用ExecuteReader。只使用ExecuteReader就足够了。你是对的->克劳斯·比斯科夫·佩德森