Domanda

Sto usando un set di dati per inserire i dati convertiti da un database più vecchio. Il requisito è mantenere gli attuali numeri Order_ID.

Ho provato a usare:

SET IDENTITY_INSERT orders ON;

Funziona quando sono in SqlServer Management Studio, sono in grado di

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

Tuttavia, non mi consente di farlo tramite l'inserto del set di dati che sto usando nel mio script di conversione. Che assomiglia sostanzialmente a questo:

dsOrders.Insert(oldorderId, ...);

Ho eseguito l'SQL (SET IDENTITY_INSERT ordini ON) anche durante il processo. So che posso farlo solo contro un tavolo alla volta e lo sono.

Continuo a ricevere questa eccezione:

  

Eccezione durante il tentativo di inserire un valore nella tabella degli ordini   System.Data.SqlClient.SqlException: impossibile inserire il valore esplicito per la colonna identità nella tabella 'ordini' quando IDENTITY_INSERT è impostato su OFF.

Qualche idea?

Aggiorna

AlexS & amp; AlexKuznetsov ha menzionato che Set Identity_Insert è un'impostazione a livello di connessione, tuttavia, quando guardo l'SQL in SqlProfiler, noto diversi comandi.

  • Primo - SET IDENTITY_INSERT DEAL ON
  • Secondo: exec sp_reset_connection
  • Da terzo a n - i miei vari comandi sql incluso select & amp; dell'inserto

Esiste sempre un exec sp_reset_connection tra i comandi, credo che ciò sia responsabile della perdita di valore sull'impostazione Identity_Insert.

Esiste un modo per impedire al mio set di dati di ripristinare la connessione?

È stato utile?

Soluzione

Hai le opzioni confuse:

SET IDENTITY_INSERT orders ON

attiverà ON la possibilità di inserire valori specifici (specificati) in una tabella con una colonna IDENTITY.

SET IDENTITY_INSERT orders OFF

Disattiva nuovamente quel comportamento e viene ripristinato il normale comportamento (non è possibile specificare i valori per le colonne IDENTITY poiché sono generati automaticamente).

Marc

Altri suggerimenti

Vuoi fare SET IDENTITY_INSERT ON per permetterti di inserire nelle colonne identità.

Sembra un po 'indietro, ma è così che funziona.

Sembra che tu stia facendo tutto nel modo giusto: SET IDENTITY_INSERT ordini ON è la strada giusta da lato SQL Server . Ma il problema è che stai usando set di dati. Dal codice che ho fornito posso dire che stai usando set di dati digitato - quello che è stato generato in Visual Studio basato sul database.

Se questo è il caso (molto probabilmente), questo set di dati contiene un vincolo che non consente di impostare valori per il campo orderId, ovvero è il codice che non consentire di specificare un valore esplicito, non SQL Server. Dovresti andare al designer del set di dati e modificare le proprietà del campo orderId: imposta AutoIncrement e ReadOnly su false. Ma le stesse modifiche possono essere eseguite in fase di esecuzione. Ciò consentirà di aggiungere una riga con valore esplicito per orderId a un set di dati e successivamente di salvarlo nella tabella di SQL Server (sarà comunque necessario SET IDENTITY_INSERT).

Si noti inoltre che IDENTITY_INSERT è un'impostazione a livello di connessione, quindi è necessario assicurarsi che si stia eseguendo il SET corrispondente esattamente per la stessa connessione che si utilizzerà per salvare le modifiche nel database.

Vorrei utilizzare Profiler per determinare se i tuoi ordini SET IDENTITY_INSERT sono ATTIVI; viene emesso dalla stessa connessione degli inserimenti successivi, nonché dall'esatto codice SQL eseguito durante gli inserimenti.

AlexS era corretto, il problema era che Insert_Identity funzionava, ma si tratta di un'impostazione a livello di connessione, quindi avevo bisogno di impostare Insert_Identity all'interno di una transazione.

Ho usato il TableAdapterHelper di Ryan Whitaker

e ho creato un comando di aggiornamento sul mio tableadapter che ha eseguito Identity_Insert. Ho quindi dovuto creare un nuovo comando Inserisci con la colonna Identity specificata. Ho quindi eseguito questo codice

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();
 }

Nel caso in cui tu abbia ancora problemi con " insert_identity " , puoi provare a utilizzare una istruzione di inserimento completa come:

  

inserisci nei valori Utente (Id, Nome) (1, 'jeff')

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top