Question

J'utilise un ensemble de données pour insérer des données en cours de conversion à partir d'une base de données plus ancienne. L'exigence est de conserver les numéros d'ordre_ID actuels.

J'ai essayé d'utiliser:

SET IDENTITY_INSERT orders ON;

Cela fonctionne lorsque je suis dans SqlServer Management Studio, je suis en mesure de réussir

INSERT INTO orders (order_Id, ...) VALUES ( 1, ...);

Cependant, cela ne me permet pas de le faire via l'insert de jeu de données que j'utilise dans mon script de conversion. Ce qui ressemble fondamentalement à ceci:

dsOrders.Insert(oldorderId, ...);

J'ai également exécuté le code SQL (commandes SET IDENTITY_INSERT ON) au cours du processus. Je sais que je ne peux le faire que contre une table à la fois et je le suis.

Je continue à recevoir cette exception:

  

Exception lors de la tentative d'insertion d'une valeur dans la table des commandes   System.Data.SqlClient.SqlException: impossible d'insérer une valeur explicite pour la colonne d'identité dans la table 'orders' lorsque IDENTITY_INSERT est défini sur OFF.

Des idées?

Mettre à jour

AlexS & amp; AlexKuznetsov a mentionné que Set Identity_Insert est un paramètre de niveau de connexion. Toutefois, lorsque je regarde le code SQL dans SqlProfiler, je remarque plusieurs commandes.

  • Premier - SET IDENTITY_INSERT DEAL ON
  • Deuxième - exec sp_reset_connection
  • Troisième à n - Mes différentes commandes SQL, y compris select & amp; insérer de

Il y a toujours un exec sp_reset_connection entre les commandes, cependant, je pense que cela est responsable de la perte de valeur du paramètre Identity_Insert.

Existe-t-il un moyen d'empêcher mon jeu de données de réinitialiser la connexion?

Était-ce utile?

La solution

Vous avez mélangé les options:

SET IDENTITY_INSERT orders ON

activera ON la possibilité d'insérer des valeurs spécifiques (que vous spécifiez) dans un tableau avec une colonne IDENTITY.

SET IDENTITY_INSERT orders OFF

Désactive à nouveau ce comportement et le comportement normal (vous ne pouvez pas spécifier de valeurs pour les colonnes IDENTITY car elles sont générées automatiquement) est rétabli.

Marc

Autres conseils

Vous souhaitez définir SET IDENTITY_INSERT ON pour vous permettre de l'insérer dans des colonnes d'identité.

Cela semble un peu en arrière, mais c’est comme ça que ça marche.

Il semble que vous fassiez les choses à la perfection: SET IDENTITY_INSERT SET ON est la bonne solution du côté du côté de SQL Server . Mais le problème est que vous utilisez des jeux de données. D'après le code que vous avez fourni, vous pouvez utiliser le jeu de données typé , celui qui a été généré dans Visual Studio à partir de la base de données.

Si tel est le cas (très probablement), alors cet ensemble de données contient une contrainte qui ne vous permet pas de définir des valeurs pour le champ orderId, c'est-à-dire que c'est le code qui n'autorise pas la spécification d'une valeur explicite, pas SQL Server. Vous devez accéder au concepteur de jeu de données et modifier les propriétés du champ orderId: définissez AutoIncrement et ReadOnly sur false. Mais les mêmes modifications peuvent être effectuées en temps d'exécution. Cela vous permettra d'ajouter une ligne avec une valeur explicite pour orderId à un jeu de données et de l'enregistrer ultérieurement dans une table SQL Server (vous aurez toujours besoin de SET IDENTITY_INSERT).

Notez également que IDENTITY_INSERT est un paramètre de niveau de connexion. Vous devez donc vous assurer que vous exécutez le SET correspondant pour la même connexion que celle que vous utiliserez pour enregistrer vos modifications dans la base de données.

J'utiliserais Profiler pour déterminer si votre SET IDENTITY_INSERT ordonne ON; provient de la même connexion que vos insertions ultérieures, ainsi que du code SQL exact en cours d'exécution lors des insertions.

AlexS avait raison, le problème était que Insert_Identity fonctionnait, mais il s’agissait d’un paramètre de niveau de connexion. Je devais donc définir Insert_Identity dans une transaction.

J'ai utilisé le TableAdapterHelper de Ryan Whitaker code

et j'ai créé une commande de mise à jour sur mon tableadapter qui exécutait Identity_Insert. Je devais alors créer une nouvelle commande Insérer avec la colonne Identité spécifiée. J'ai ensuite exécuté ce code

SqlTransaction transaction = null;

try
{
     using (myTableAdapter myAdapter = new myTableAdapter())
     {   
         transaction = TableAdapterHelper.BeginTransaction(myAdapter);
         myAdapter.SetIdentityInsert();
         myAdapter.Insert(myPK,myColumn1,myColumn2,...);
     }

     transaction.Commit();
 }
 catch(Exception ex)
 {
     transaction.Rollback();
 } 
 finally
 {
     transaction.Dispose();
 }

Si vous rencontrez toujours des problèmes avec "insert_identity " , vous pouvez essayer d’utiliser une instruction d’insertion complète telle que:

  

insérer dans l'utilisateur (Id, Nom) les valeurs (1, 'jeff')

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top