Meilleur auteur de réponses
Erreur d'incrémentation du compteur ...

Question
-
Bonjour,
Dans le cadre d'applications développées avec Visual Studio 2013 Windows Forms C# et SQL Server 2012, j'utilise le compteur sur la colonne d'index primaire afin d'avoir un identificateur unique, ce qui est un standard il me semble.
Je constate que le compteur qui est configuré pour un incrément de 1, à quelques reprises, saute un grand nombre d'unités et ce sans raison apparente.
Par exemple, sur la colonne primaire d'une table d'abonnements avec compteur incrément de une unité, la création d'un nouvel enregistrement passe de l'ID 2784 à 3783, puis le compteur continue normalement.
Cela arrive sur 2 applications différentes et sur différents sites.
Si cela, dans l'immédiat, ne pose pas de problème majeur, puisque l'intégrité des données entre les tables et respectée, ce problème non expliqué me pose question et m'inquiète quand à un saut d'incrément trop fréquent ou trop important.
Merci de votre aide.
Réponses
-
Bonjour
Il n'y a pas aucun changement si vous utilisez BEGIN TRAN - ROLLBACK TRAN.
Ici vous avez une autre possible cause (et solution) du problème :Identity column value suddenly jumps to 1001 in sql server
Bien cordialement,
Aurel BERA, MSFT
MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.- Marqué comme réponse Gruninger mardi 8 juillet 2014 13:08
Toutes les réponses
-
Bonjour
Il n'y a pas aucune garantie que tous les valeurs dans les colonnes prennent des valeurs successives.
Les transactions finies par un rollback laissent un tel trou.
Aussi, on ne doit pas oublier les delete qui peuvent intervenir.
Si vous voulez recycler les valeurs non utilisez-vous devez créer votre propre mécanisme (qui ne sera pas très simple).
Mais sera plus simple de changer l’ int en bigint ou utiliser des GUIDS.
Bien cordialement,
Aurel BERA, MSFT
MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution. -
Merci de votre réponse,
L'utilisation d'une colonne d'index primaire est également prévue comme no. de référence d'un client, d'une facture, etc ... Dès lors un "trou" entre des no de factures, par exemple, peut-être ennuyeux. A l'époque j'utilisai plutôt la base de données Sybase SqlAnywhere et je n'ai jamais connu tel problème, l'incrémentation de une unité était toujours respectée. Il est clair que la suppression d'un enregistrement n'entraine pas le remplacement de la clé supprimée.
Dans la pratique, est-ce que l'ajout des instructions BEGIN TRANSACTION et COMMIT TRANSACTION comme défini dans le code suivant, optimise les chances d'avoir une incrémentation de une unité respectée ?
Merci de votre aide et meilleures salutations. Pierre
// Insert Command this.oSqlDataAdapter.InsertCommand = new SqlCommand("BEGIN TRANSACTION; Insert Into Yoga.Invoices (CreateDate, CustomerID) Values (@CreateDate, @CustomerID); " + "COMMIT TRANSACTION; Select Top 1 InvoiceID From Yoga.Invoices Order By InvoiceID DESC", Program.oConnect); this.oSqlDataAdapter.InsertCommand.Parameters.Add("@CreateDate", SqlDbType.Date); this.oSqlDataAdapter.InsertCommand.Parameters.Add("@CustomerID", SqlDbType.Int);
-
Bonjour
Il n'y a pas aucun changement si vous utilisez BEGIN TRAN - ROLLBACK TRAN.
Ici vous avez une autre possible cause (et solution) du problème :Identity column value suddenly jumps to 1001 in sql server
Bien cordialement,
Aurel BERA, MSFT
MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.- Marqué comme réponse Gruninger mardi 8 juillet 2014 13:08
-