【问题标题】:SQL Server primary key errorSQL Server 主键错误
【发布时间】:2013-09-09 14:57:14
【问题描述】:

我正在使用 ASP.NET 和 SQL Server 设计一个基于 Web 的物流系统。

在我的一个类中,当我尝试向数据库插入数据时,出现违反主键错误,但数据成功插入到表中。我找不到问题出在哪里。谁能看到我做错了什么?

public int fillShipmentDetail()
{
   int success = 0;
   string connectionString = ConfigurationManager.ConnectionStrings["LGDB"].ToString();

   SqlConnection sqlCon = new SqlConnection(connectionString);

   SqlCommand sqlCom = new SqlCommand("fillShipmentDetails", sqlCon);
   sqlCom.CommandType = CommandType.StoredProcedure;

   sqlCon.Open();

   sqlCom.Parameters.AddWithValue("shipOrderID", ShipOrderID);
   sqlCom.Parameters.AddWithValue("totalWeight", TotalWeight);
   sqlCom.Parameters.AddWithValue("weightIsMetric", WeightUnit);
   sqlCom.Parameters.AddWithValue("weightIsImperial", VolumeUnit);
   sqlCom.Parameters.AddWithValue("volume", Volume);
   sqlCom.Parameters.AddWithValue("quantity", Quantity);
   sqlCom.Parameters.AddWithValue("value", Value);
   sqlCom.Parameters.AddWithValue("description", GoodsDescription);            

   success = sqlCom.ExecuteNonQuery();

   if (success == 1)
   {
      success = 1;
   }
   else
   {
      success = 0;
   }            

   sqlCon.Close();            
   return success;
}

aspx.cs页面

 Classes.ShipmentDetails fillShipmentDetails = new Classes.ShipmentDetails(
                getLastShipOrder, _weight, _checkMetricImperial_weight, _checkMetricImperial_volume,
                _volume, _quantity, _value, txtGoodsDescription.Text);
            int success3 = fillShipmentDetails.fillShipmentDetail();

如下图所示,shipOrderID 7192 记录已插入表中。

我已经删除了所有三个表,并插入了新数据。虽然数据插入成功但又出现错误。

此屏幕截图清楚地显示了所有内容,每次新插入数据库时​​,最后一张表都会出现主键错误,正如您所见,没有成功插入任何重复的键和数据。

【问题讨论】:

  • getLastShipOrder 是做什么的?如何确定下一个发货订单 ID??
  • 该表的shipOrderID来自另一个表,数据来自三个不同的表。
  • 这会成为你的主键吗?您能1000% 确定您没有在此处创建重复项吗??
  • 这张表的主键来自另一个表的自动生成的主键,每次用户插入数据时都会自动生成一个索引,所以不能重复,我现在插入更多数据并把屏幕截图,所以你可以看到没有重复。我真的很惊讶,因为它只是工作!

标签: asp.net code-behind


【解决方案1】:

看起来 fillShipmentDetails.fillShipmentDetail() 被触发了两次。在代码中放置断点并检查

【讨论】:

  • 还要检查你的存储过程
  • 我检查了方法,它只调用了一次,存储过程也成功执行。
  • 从表中删除主键并检查值是否被插入两次
  • 我删除了表中的主键。插入后,我看到每条记录在表中插入 4 次。然后我注意到在我连接到数据库之前有一个 foreach 循环,我没有关闭它!!!!所以每个操作都重复了四次!!!
【解决方案2】:

shipOrderId 已存在于您的表中。

您需要赋予它一个新的独特价值。表更新的原因是因为shipOrderId已经存在,所以你可以用Id创建一个新的Shipping Order,但是这个顺序并不是指正确的shipOrderId

【讨论】:

  • 它不会退出,每次新插入都会发生这个错误!
  • @AlirezaX - 它确实存在,我可以在你的截图中看到它 (7192)
  • 自动生成,不能重复,
  • 我在插入后截取了这个截图,它插入了新值,但也抛出了主键错误
  • @AlirezaX - 你的函数被调用了两次吗?
猜你喜欢
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多