La Violation de la contrainte de CLÉ PRIMAIRE. Impossible d'insérer une clé en double dans l'objet de SQL Server

J'ai hérité d'un projet et je suis en cours d'exécution dans un SQL erreur que je ne suis pas sûr de la façon de les corriger.

Sur un site de commerce électronique, le code est l'insertion d'expédition de la commande info dans une autre table de base de données.

Voici le code à insérer les infos dans la table:

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);

Qu'il fonctionne correctement, mais c'est aussi la sortie de la suite SQL error:

Violation de la contrainte de CLÉ PRIMAIRE 'PK_AC_Shipping_Addresses'. Impossible d'insérer
clé en double dans l'objet 'dbo.AC_Shipping_Addresses'. La valeur de clé en double
est (165863).

À partir de la lecture des questions similaires, il semble que je devrais déclarer l'ID dans la déclaration.

Est-ce exact? Comment puis-je ajuster le code pour résoudre ce problème?

Toute aide est grandement appréciée!

Possible d'Injection SQL
Étape 1) connaître la valeur de sql est avant l'exécution. Étape 0) Changement à l'aide de valeurs de liaison pour la requête au lieu de concaténation. Google "SQL Injection" pour la raison du pourquoi.
Quelle est la valeur que vous êtes en passant à la clé primaire (sans doute "pk_OrderID")? Vous pouvez le configurer à l'auto incrément, et alors il ne devrait jamais être un problème avec la duplication de la valeur de la DB prendra soin de cela. Si vous devez spécifier une valeur pour vous-même, vous aurez besoin d'écrire du code pour déterminer quelle est la valeur max pour que le terrain est, et puis incrémenter.
quel est votre champ de clé unique? on dirait que votre OrderNumber est en double, vous pouvez déjà avoir le n ° d'ordre 165863 dans votre table et que vous essayez d'insérer un duplciate
Si la valeur de clé primaire existe déjà, alors vous pouvez simplement mettre à jour ou vous aurez à supprimer l'état de la valeur avant d'en insérer une nouvelle: string sql = "DELETE FROM AC_Shipping_Addresses where pk_OrderID = " + _Order.OrderNumber;

OriginalL'auteur Justin Hollender | 2016-03-16