【发布时间】:2016-03-16 17:59:05
【问题描述】:
我继承了一个项目,但遇到了一个不知道如何修复的 SQL 错误。
在电子商务网站上,代码将订单发货信息插入到另一个数据库表中。
以下是将信息插入表格的代码:
string sql = "INSERT INTO AC_Shipping_Addresses
(pk_OrderID, FullName, Company, Address1, Address2, City, Province, PostalCode, CountryCode, Phone, Email, ShipMethod, Charge_Freight, Charge_Subtotal)
VALUES (" + _Order.OrderNumber;
sql += ", '" + _Order.Shipments[0].ShipToFullName.Replace("'", "''") + "'";
if (_Order.Shipments[0].ShipToCompany == "")
{
sql += ", '" + _Order.Shipments[0].ShipToFullName.Replace("'", "''") + "'";
}
else
{
sql += ", '" + _Order.Shipments[0].ShipToCompany.Replace("'", "''") + "'";
}
sql += ", '" + _Order.Shipments[0].Address.Address1.Replace("'", "''") + "'";
sql += ", '" + _Order.Shipments[0].Address.Address2.Replace("'", "''") + "'";
sql += ", '" + _Order.Shipments[0].Address.City.Replace("'", "''") + "'";
sql += ", '" + _Order.Shipments[0].Address.Province.Replace("'", "''") + "'";
sql += ", '" + _Order.Shipments[0].Address.PostalCode.Replace("'", "''") + "'";
sql += ", '" + _Order.Shipments[0].Address.Country.Name.Replace("'", "''") + "'";
sql += ", '" + _Order.Shipments[0].Address.Phone.Replace("'", "''") + "'";
if (_Order.Shipments[0].ShipToEmail == "")
{
sql += ",'" + _Order.BillToEmail.Replace("'", "''") + "'";
}
else
{
sql += ",'" + _Order.Shipments[0].ShipToEmail.Replace("'", "''") + "'";
}
sql += ", '" + _Order.Shipments[0].ShipMethod.Name.Replace("'", "''") + "'";
sql += ", " + shippingAmount;
sql += ", " + _Order.ProductSubtotal.ToString() + ")";
bll.dbUpdate(sql);
它工作正常,但它也输出以下SQL错误:
违反主键约束“PK_AC_Shipping_Addresses”。无法插入 对象“dbo.AC_Shipping_Addresses”中的重复键。重复键值 是 (165863)。
通过阅读类似的问题,我似乎应该在声明中声明ID。
正确吗?我将如何调整代码来解决这个问题?
【问题讨论】:
-
步骤 1) 在运行之前找出
sql的值是多少。步骤 0) 更改为对查询使用绑定值而不是串联。谷歌“SQL注入”的原因。 -
你传递给主键的值是什么(大概是“pk_OrderID”)?您可以将其设置为自动递增,然后复制值永远不会有问题 - 数据库会处理这个问题。如果您需要自己指定一个值,则需要编写代码来确定该字段的最大值是多少,然后将其递增。
-
您的唯一关键字段是什么?看起来您的 OrderNumber 是重复的,您的表中可能已经有 order# 165863 并且您正在尝试插入重复
-
如果 PK 值已经存在,那么您只需更新它,否则您必须在插入新值之前删除先前的值:
string sql = "DELETE FROM AC_Shipping_Addresses where pk_OrderID = " + _Order.OrderNumber;
标签: sql-server sql-server-2008 primary-key