sql-server - used - set identity update
Desactivar IDENTITY_INSERT para inserciĆ³n de conjunto de datos (6)
Estoy usando un conjunto de datos para insertar datos que se convierten de una base de datos más antigua. El requisito es mantener los números de Order_ID actuales.
He intentado usar:
SET IDENTITY_INSERT orders ON;
Esto funciona cuando estoy en SqlServer Management Studio, puedo hacerlo correctamente
INSERT INTO orders (order_Id, ...) VALUES ( 1, ...);
Sin embargo, no me permite hacerlo a través de la inserción de datos que estoy usando en mi script de conversión. Que se parece básicamente a esto:
dsOrders.Insert(oldorderId, ...);
También he ejecutado las órdenes SQL (SET IDENTITY_INSERT ON) durante el proceso. Sé que solo puedo hacer esto contra una mesa a la vez y lo soy.
Sigo recibiendo esta excepción:
Excepción cuando se intenta insertar un valor en la tabla de órdenes System.Data.SqlClient.SqlException: No se puede insertar un valor explícito para la columna de identidad en la tabla ''órdenes'' cuando IDENTITY_INSERT está desactivado.
¿Algunas ideas?
Actualizar
AlexS y AlexKuznetsov han mencionado que Set Identity_Insert es una configuración de nivel de conexión, sin embargo, cuando veo el SQL en SqlProfiler, observo varios comandos.
- Primero -
SET IDENTITY_INSERT DEAL ON
- Segundo -
exec sp_reset_connection
- Tercero a n: mis diversos comandos de sql, incluidos los de selección e inserción
Sin embargo, siempre hay un exec sp_reset_connection
entre los comandos, creo que esto es responsable de la pérdida de valor en la configuración Identity_Insert.
¿Hay alguna manera de evitar que mi conjunto de datos realice el restablecimiento de la conexión?
AlexS era correcto, el problema era que Insert_Identity funcionaba, pero es una configuración de nivel de conexión, por lo que necesitaba establecer el Insert_Identity dentro de una transacción.
TableAdapterHelper código de TableAdapterHelper la TableAdapterHelper Ryan Whitaker
y creé un comando de actualización en mi tableadapter que ejecutó Identity_Insert. Luego tuve que crear un nuevo comando Insertar con la columna de identidad especificada. Entonces corri este codigo
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();
}
Desea realizar SET IDENTITY_INSERT ON para permitirle insertar en columnas de identidad.
Parece un poco al revés, pero así es como funciona.
En caso de que aún tenga problemas con "insert_identity", puede intentar usar una declaración de inserción completa como:
insertar en los valores de usuario (Id, nombre) (1, ''jeff'')
Parece que estás haciendo todo bien: SET IDENTITY_INSERT pedidos ENCENDIDO es la forma correcta en el lado de SQL Server . Pero el problema es que estás usando conjuntos de datos. Del código que proporcionó, puedo decir que está usando un conjunto de datos escrito , el que se generó en Visual Studio basado en la base de datos.
Si este es el caso (lo más probable), entonces este conjunto de datos contiene una restricción que no le permite establecer valores para el campo orderId, es decir, es el código que no permite especificar un valor explícito, no SQL Server. Debe ir al diseñador del conjunto de datos y editar las propiedades del campo orderId: establecer AutoIncrement y ReadOnly en false. Pero los mismos cambios se pueden realizar en tiempo de ejecución. Esto le permitirá agregar una fila con un valor explícito para orderId a un conjunto de datos y luego guardarlo en la tabla de SQL Server (todavía necesitará SET IDENTITY_INSERT).
También tenga en cuenta que IDENTITY_INSERT es una configuración de nivel de conexión, por lo que debe asegurarse de que está ejecutando el SET correspondiente exactamente para la misma conexión que utilizará para guardar los cambios en la base de datos.
Tienes las opciones mezcladas:
SET IDENTITY_INSERT orders ON
se activará la capacidad de insertar valores específicos (que usted especifique) en una tabla con una columna de IDENTIDAD.
SET IDENTITY_INSERT orders OFF
Desactiva ese comportamiento nuevamente y se restablece el comportamiento normal (no puede especificar valores para las columnas de IDENTIDAD porque se generan automáticamente).
Bagazo
Yo usaría Profiler para determinar si sus órdenes SET IDENTITY_INSERT están ENCENDIDAS; se emite desde la misma conexión que sus inserciones posteriores, así como el SQL exacto que se ejecuta durante las inserciones.