Disattiva IDENTITY_INSERT per l'inserimento del set di dati
-
22-07-2019 - |
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?
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')