Bonjour,
Je développe sous Delphi 7 avec les composants dbExpress pour accèder à une base de données SQL Server.
J'ai créé une table où j'ai paramétré avec le SQL Server Management la clé primaire en tant que Compteur et Identité avec comme paramètre :
début compteur = 1
Incrément Compteur = 1
Je pensais que cette manipulation servait à ce que ce champ soit en clé auto incrémentée. Mais lorsque je fais le bout de code suivant :
le nouvel enregistrement a 10 000 comme valeur de clé primaire. Je pensais que lors de l'envoi de cette valeur, elle était ensuite recalculée par SQL SERVER et réaffectée à la valeur max de la clé primaire +1, par exemple 296 si la dernière valeur était 295.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 SQLDataSetRequete_.CommandText:='SET IDENTITY_INSERT MATABLE ON'; SQLDataSetRequete_.ExecSQL(true); clientDataSetMATABLE.AppendRecord([10 000,champ2]); clientDataSetMATABLE.ApplyUpdates(-1); SQLDataSetRequete_.CommandText:='SET IDENTITY_INSERT MATABLE OFF'; SQLDataSetRequete_.ExecSQL(true);
Mon souci est que j'avais créé une fonction qui, au lieu de mettre 10 000, récupérait la valeur Max de cette clé par requête, comme ci dessous. J'ai une quizaine de logiciels qui lancent ce code en même temps et je n'ai pas de retours comme quoi il y aurait des erreurs sauf que tous les enregistrements ne sont pas créés et je me demande si cette manière de gérer les clés ne pouvait pas provoquer des conflits de clés...
Quelqu'un peut il me dire déjà si mon code est correct ou si je gère mal les clé auto incrémentées et ensuite s'il y a une aute méthode pour les gérer?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 SQLDataSetRequete_.CommandText:='SET IDENTITY_INSERT MATABLE ON'; SQLDataSetRequete_.ExecSQL(true); clientDataSetMATABLE.AppendRecord([ObtenirDernierID(MATABLE),champ2]); clientDataSetMATABLE.ApplyUpdates(-1); SQLDataSetRequete_.CommandText:='SET IDENTITY_INSERT MATABLE OFF'; SQLDataSetRequete_.ExecSQL(true); function ObtenirDernierID(table: string): LongWord; begin SQLDataSetObtenirID.Close; ClientDataSetObtenirID.Close; SQLDataSetObtenirID.CommandType := ctQuery; SQLDataSetObtenirID.CommandText := 'SELECT MAX(ID'+Table+') MaValeur FROM '+Table; ClientDataSetObtenirID.Open; ObtenirDernierID:=ClientDataSetObtenirID.Fieldbyname('MaValeur').AsInteger; end;
Merci d'avance
Partager