2009-08-05 13 views
22

Sto utilizzando un set di dati per inserire dati da convertire da un database precedente. Il requisito è mantenere gli attuali numeri ID_ordine.Disattiva IDENTITY_INSERT per l'inserto Dataset

Ho provato con:

SET IDENTITY_INSERT orders ON; 

Questo funziona quando sono in SqlServer Management Studio, sono in grado di successo

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

Tuttavia, non mi permette di farlo tramite l'inserto del set di dati che sto utilizzando nel mio script di conversione. Che assomiglia in questo modo:

dsOrders.Insert(oldorderId, ...); 

Ho eseguito 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 quando si tenta di inserire un valore nella tabella ordini System.Data.SqlClient.SqlException: Impossibile inserire valore esplicito per la colonna Identity nella tabella 'ordini' quando IDENTITY_INSERT è impostato su OFF.

Qualche idea?

Aggiornamento

alexs & AlexKuznetsov hanno detto che SET_IDENTITY_INSERT è un'impostazione livello di connessione, tuttavia, quando guardo lo SQL in SQLProfiler, ho notato diversi comandi.

  • In primo luogo - SET IDENTITY_INSERT DEAL ON
  • In secondo luogo - exec sp_reset_connection
  • Terzo al n - i miei vari comandi SQL tra cui selezionare & dell'inserto

C'è sempre una exec sp_reset_connection tra i comandi, però, credo che questa è responsabile della perdita di valore nell'impostazione Identity_Insert.

C'è un modo per impedire che il set di dati effettui il reset della connessione?

risposta

49

sono disponibili le opzioni mescolati:

SET IDENTITY_INSERT orders ON 

si trasformerà ON la possibilità di inserire valori specifici (che si specifica) in una tabella con una colonna IDENTITY.

SET IDENTITY_INSERT orders OFF 

Turns che il comportamento OFF di nuovo e il comportamento normale (non è possibile specificare i valori per le colonne IDENTITY dal momento che sono generati automaticamente) viene reintegrato.

Marc

+0

Lol, ho avuto lo stesso stupido errore – Jupaol

5

si vuole fare SET_IDENTITY_INSERT ON per consentire di inserire in colonne di identità.

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

+0

avevi ragione che avevo le opzioni confuse ma quando le ho cambiate non risolveva i miei problemi. Altre idee? –

3

Sembra che si sta facendo tutto nel modo giusto: SET ordini IDENTITY_INSERT ON è il modo giusto per parte di SQL Server. Ma il problema è che stai usando i set di dati. Dal codice che hai fornito, posso dire che stai utilizzando set di dati digitati - quello che è stato generato in Visual Studio in base al database.

Se questo è il caso (più probabile), allora questo set di dati contiene un vincolo che non permette di impostare i valori per il campo orderId, cioè è il codice che non permette specificando 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 un valore esplicito per orderId a un set di dati e successivamente salvarla 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 esegua il SET corrispondente esattamente per la stessa connessione che si utilizzerà per salvare le modifiche nel database.

1

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

1

AlexS era corretto, il problema era l'Insert_Identity funzionava, ma si tratta di un'impostazione di livello di connessione, quindi ho dovuto impostare Insert_Identity all'interno di una transazione.

ho usato TableAdapterHelper codice di Ryan Whitaker

e ho creato un comando di aggiornamento sulla mia TableAdapter che correva l'Identity_Insert. Ho quindi dovuto creare un nuovo comando di inserimento con la colonna Identità specificata. Allora ho fatto funzionare 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(); 
} 
0

Nel caso in cui si hanno ancora problemi con "insert_identity", si può provare a utilizzare un'istruzione completa inserto come:

inserto in utente (ID, nome) valori (1, 'jeff')