【问题标题】:Parent table always inserted Duplicate rows父表总是插入重复行
【发布时间】:2019-01-20 05:17:19
【问题描述】:

我有以下带有事务块的代码。当我下订单时,我的基表 (TBL_T_Orders) 总是插入 2 个相同的行(具有不同 OrderId 的重复行)。详细信息表TBL_T_OrderItems 正确插入了项目。

我的代码

public CartTotal InsertNewOrder(CartTotal cartTotal)
{
            try
            {
                con.Open();

                transaction = con.BeginTransaction();

                string orderQuery = @"INSERT INTO [dbo].[TBL_T_Orders] ([OrderCode],[OrderReceivedDate]) 
                                      OUTPUT INSERTED.OrderId
                                      VALUES (@OrderCode, @OrderReceivedDate)";
                cmd = db.GetSqlStringCommand(orderQuery);
                cmd.Transaction = transaction;

                db.AddInParameter(cmd, "OrderCode", DbType.Int32, cartTotal.OrderCode);
                db.AddInParameter(cmd, "OrderReceivedDate", DbType.DateTime,DateTime.Now);

                db.ExecuteNonQuery(cmd, transaction);

                int OrderId = (int)cmd.ExecuteScalar();

                foreach (var item in cartTotal.items)
                {
                    string orderItemsQuery = @"INSERT INTO [dbo].[TBL_T_OrderItems] ([OrderId], [ItemId]
                                               VALUES (@OrderId, @ItemId)";

                    cmd = db.GetSqlStringCommand(orderItemsQuery);
                    cmd.Transaction = transaction;

                    db.AddInParameter(cmd, "OrderId", DbType.Int32, OrderId);//temp
                    db.AddInParameter(cmd, "ItemId", DbType.String, item.ItemId);

                    db.ExecuteNonQuery(cmd, transaction);
                }

                transaction.Commit();
            }
            catch (Exception ex)
            {
                transaction.Rollback();
                throw ex;
            }
            finally
            {
                con.Close();
            }

            return cartTotal;
}

【问题讨论】:

  • 好吧,你执行db.ExecuteNonQuery(cmd, transaction);,然后直接执行int OrderId = (int)cmd.ExecuteScalar();——看起来你执行了两次插入。
  • @stickybit 当我删除该项目时显示错误“System.InvalidOperationException: 'ExecuteScalar: Connection property has not been initialized.'”

标签: c# sql sql-server asp.net-mvc


【解决方案1】:

您收到重复的条目,因为您执行了两次查询。第一次使用db.ExecuteNonQuery,然后第二次使用cmd.ExecuteScalar();

删除第一个db.ExecuteNonQuery 行。然后它将完美运行。

【讨论】:

  • 当我删除那个异常返回时,如“System.InvalidOperationException: 'ExecuteScalar: Connection property has not been initialized.'”
  • 添加 cmd.Connection = con;
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 1970-01-01
相关资源
最近更新 更多