Désactiver L'insertion D'identité pour l'insertion D'un ensemble de données

j'utilise un ensemble de données pour insérer des données converties à partir d'une ancienne base de données. L'exigence est de maintenir les nombres Order_ID actuels.

j'ai essayé d'utiliser:

SET IDENTITY_INSERT orders ON;

cela fonctionne quand je suis dans SqlServer Management Studio, je suis capable de réussir

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

cependant, il ne me permet pas de le faire via l'insert de données que j'utilise dans mon script de conversion. Qui ressemble fondamentalement à ceci:

dsOrders.Insert(oldorderId, ...);

j'ai lancé le SQL (SET IDENTITY_INSERT commandes sur) au cours du processus aussi. Je sais que je ne peux que faire contre une table à la fois et je le suis.

je reçois cette exception:

Exception lors de la tentative d'insérer une valeur dans la table des commandes Système.Données.SqlClient.SqlException: ne peut pas insérer de valeur explicite pour la colonne identity dans la table 'orders' lorsque IDENTITY_INSERT est défini à OFF.

des idées?

mise à Jour

AlexS & AlexKuznetsov ont mentionné que Set Identity_Insert est un paramètre de niveau de connexion, cependant, quand je regarde le SQL dans SqlProfiler, je remarque plusieurs commandes.

  • Premier SET IDENTITY_INSERT DEAL ON
  • Deuxième exec sp_reset_connection
  • troisième à n - mes diverses commandes sql incluant select & insert's

Il y a toujours un exec sp_reset_connection entre les commandes, je crois que c'est responsable de la perte de valeur sur les Identity_Insert réglage.

Est-il possible d'arrêter mon dataset de faire la réinitialisation de la connexion?

24
demandé sur Nathan Koop 2009-08-05 22:02:01

6 réponses

vous avez les options mélangées:

SET IDENTITY_INSERT orders ON

tour la possibilité d'insérer des valeurs spécifiques (que vous spécifiez) dans une table avec une colonne D'identité.

SET IDENTITY_INSERT orders OFF

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

Marc

50
répondu marc_s 2009-08-05 18:04:29

you want to do SET IDENTITY_INSERT pour vous permettre d'insérer dans les colonnes d'identité.

Il semble un peu en arrière, mais c'est la façon dont il fonctionne.

5
répondu Eric Petroelje 2009-08-05 18:04:51

il semble que vous faites tout ce qui est juste: passez les commandes IDENTITY_INSERT est la bonne façon sur côté du serveur SQL. Mais le problème est que vous utilisez des ensembles de données. Du code que vous avez fourni je peux dire que vous utilisez ensemble de données dactylographié - celui qui a été généré dans Visual Studio basé sur la base de données.

Si c'est le cas (le plus probable), alors cet ensemble de données contient une contrainte cela ne vous permet pas de définir des valeurs pour le champ orderId, c'est-à-dire que c'est le code qui ne permet pas de spécifier une valeur explicite, Pas SQL Server. Vous devriez aller à Concepteur d'ensemble de données et éditer les propriétés du champ orderId: définir Auto-Oincrement et ReadOnly à false. Mais les mêmes changements peuvent être effectués en temps d'exécution. Cela vous permettra d'ajouter une ligne avec une valeur explicite pour orderId à un ensemble de données et ensuite de l'enregistrer dans la table SQL Server (vous aurez toujours besoin de définir IDENTITY_INSERT).

notez Aussi que l' IDENTITY_INSERT est un paramètre de niveau de connexion, vous devez donc vous assurer que vous exécutez le paramètre correspondant exactement pour la même connexion que vous utiliserez pour enregistrer vos modifications dans la base de données.

3
répondu AlexS 2009-08-05 19:36:13

j'utiliserais Profiler pour déterminer si votre ensemble IDENTITY_INSERT commande; est issu de la même connexion que vos inserts suivants, ainsi que le SQL exact exécuté pendant les inserts.

1
répondu A-K 2009-08-05 19:44:55

AlexS était correct, le problème était que Insert_Identity fonctionnait, mais c'est un réglage du niveau de connexion, donc j'avais besoin de définir Insert_Identity dans une transaction.

j'ai utilisé Ryan Whitaker TableAdapterHelper code

et j'ai créé une commande de mise à jour sur mon tableadapter qui a lancé L'option Identity_Insert. J'ai ensuite créé une nouvelle commande Insert avec la colonne Identity 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();
 }
1
répondu Nathan Koop 2009-09-01 18:59:28

Dans le cas où vous avez encore des problèmes avec "insert_identity" , vous pouvez essayer d'utiliser un compléter insérer l'énoncé comme:

insert into Utilisateurs(Id, Nom) values (1,'jeff')

0
répondu user3447006 2014-10-22 15:30:42