J'écris une classe ODBC pour me connecter à une base de données SQL Server distante. J'ai presque tout fonctionné.
La classe a la capacité de générer des requêtes telles que les suivantes:
UPDATE Clients SET Id = ?, Name = ?, TaxId = ?, ContactFName = ?, ContactLName = ?, Phone_Office = ?, Phone_Mobile = ?, Phone_Home = ?, Email = ?, Website = ?, Address1_Physical = ?, Address2_Physical = ?, City_Physical = ?, State_Physical = ?, Zip_Physical = ?, Address1_Billing = ?, Address2_Billing = ?, City_Billing = ?, State_Billing = ?, Zip_Billing = ?, StartingBalance = ?, Discount = ?, BillingSequence = ?, BillingCategory = ?, ?, ShowOnReport = ?, Active = ?, CreateDate =?
Comme vous pouvez le voir, il s'agit d'une requête UPDATE. Pourtant, l'exécution de cette requête me donne une erreur:
Pilote Microsoft ODBC 17 pour SQL Server (SQL Server): ReturnCode: -1: Violation de la contrainte PRIMARY KEY 'PK_Customers'. Impossible d'insérer la clé en double dans l'objet 'dbo.Customers'. La valeur de clé en double est (82). (État: 23000, NativeError: 2627): l'instruction a été interrompue. (État: 01000, NativeError: 3621)
Je ne comprends pas pourquoi j'obtiens une erreur d'insertion lorsque je fais une mise à jour. Quelqu'un a-t-il vu ça?
Remarques:
Id
est la clé primaire. Je lis d'abord toutes les valeurs de colonne de la base de données, puis je mets à jour celles que je souhaite modifier. L'identifiant ne change pas. SQLGetDiagRec()
. 3 Réponses :
Dans la MISE À JOUR, je vois un champ appelé ID. Si vous apportez une modification à l'ID et qu'il s'agit de la clé primaire, alors le SGBD fera des tracas parce que vous essayez de stocker des clés en double.
Si l'ID ne change pas, je suggère de le retirer de la mise à jour et de voir quel message vous recevez.
Il n'y a pas de clause WHERE dans l'instruction UPDATE, donc il essaie de mettre à jour CHAQUE RANGÉE dans la base de données, et comme ID est l'une des colonnes en cours de modification, il essaie de définir l'ID de chaque ligne sur la même valeur. Cela entraîne une tentative de création d'une clé primaire en double.
Assurez-vous que votre instruction UPDATE a une clause WHERE appropriée ... comme "WHERE ID =?" ... et il est probablement préférable de NE PAS inclure l'ID dans cette instruction UPDATE si elle ne change pas.
Oh! Je suis tellement loin dans les détails techniques, cela m'a manqué.
C'est le message auquel vous devez vous attendre lorsqu'une instruction UPDATE viole une clé primaire. EG
use tempdb go drop table if exists t create table t(id int primary key) insert into t(id) values (1),(2) go update t set id = 2 where id = 1 --Msg 2627, Level 14, State 1, Line 11 --Violation of PRIMARY KEY constraint 'PK__t__3213E83F127C5D76'. Cannot insert duplicate key in object 'dbo.t'. The duplicate key value is (2). --The statement has been terminated.