2009-08-05 24 views
22

Estoy utilizando un conjunto de datos para insertar datos que se convierten desde una base de datos anterior. El requisito es mantener los números Order_ID actuales.Desactiva IDENTITY_INSERT para Dataset insert

He intentado usar:

SET IDENTITY_INSERT orders ON; 

Esto funciona cuando estoy en SqlServer Management Studio, estoy en condiciones de éxito

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

Sin embargo, no permite que lo haga a través del conjunto de datos que estoy usando en mi script de conversión. Que se ve básicamente así:

dsOrders.Insert(oldorderId, ...); 

He ejecutado el SQL (SET IDENTITY_INSERT órdenes ON) durante el proceso también. Sé que solo puedo hacer esto contra una mesa a la vez y lo estoy haciendo.

me siguen dando esta excepción:

Excepción al intentar insertar un valor en la tabla de pedidos System.Data.SqlClient.SqlException: No se puede insertar valor explícito para la columna de identidad en la tabla 'órdenes' cuando IDENTITY_INSERT está configurado en OFF.

¿Alguna idea?

actualización

ALEXS & AlexKuznetsov han mencionado que SET_IDENTITY_INSERT es un ajuste de nivel de conexión, sin embargo, cuando miro el SQL en SQLProfiler, noto varios comandos.

  • Primera - SET IDENTITY_INSERT DEAL ON
  • Segundo - exec sp_reset_connection
  • Tercera de n - mis varios comandos SQL como determinadas & de inserción

Siempre hay un exec sp_reset_connection entre los comandos, sin embargo, creo que esta 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?

Respuesta

49

tiene las opciones mezcladas:

SET IDENTITY_INSERT orders ON 

se volverá EN la posibilidad de insertar valores específicos (que especifique) en una tabla con una columna de identidad.

SET IDENTITY_INSERT orders OFF 

Resulta que el comportamiento de nuevo y el comportamiento normal (no se puede especificar los valores de las columnas IDENTITY ya que son auto-generado) es restituido.

Marc

+0

Lol, tuve el mismo error tonto – Jupaol

5

que quiere hacer SET_IDENTITY_INSERT EN que permitirá insertar en las columnas de identidad.

Parece un poco al revés, pero así es como funciona.

+0

tenía razón en que tenía las opciones mezcladas pero cuando las cambié no resolvió mis problemas. ¿Alguna otra idea? –

3

Parece que usted está haciendo todo bien: órdenes IDENTITY_INSERT SET ON es la manera correcta en el lado de SQL Server. Pero el problema es que estás usando datasets. Desde el código que ha proporcionado, puedo decir que está utilizando el conjunto de datos tipeados - 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 los valores para el campo orderId, es decir, que es el código que no permite especificar un valor explícito, no de SQL Server . Debe dirigirse al diseñador del conjunto de datos y editar las propiedades del campo orderId: configure AutoIncrement y ReadOnly en false. Pero los mismos cambios se pueden realizar en tiempo de ejecución. Esto le permitirá agregar una fila con valor explícito para orderId a un conjunto de datos y luego guardarlo en la tabla de SQL Server (aún 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 ejecutar el SET correspondiente exactamente para la misma conexión que utilizará para guardar los cambios en la base de datos.

1

Utilizaría Profiler para determinar si su SET IDENTITY_INSERT ordena ON; se emite desde la misma conexión que sus inserciones posteriores, así como el SQL exacto que se está ejecutando durante las inserciones.

1

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 Insert_Identity dentro de una transacción.

que utilizan TableAdapterHelper código de Ryan Whitaker

y yo creamos un comando de actualización en mi tableadapter que corría el Identity_Insert. Luego tuve que crear un nuevo comando Insertar con la columna Identidad especificada. entonces me encontré con este código

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

En caso de que todavía tiene problemas con "insert_identity", se puede tratar de utilizar una declaración completa inserción como:

inserto dentro de usuario (ID, Nombre) values ​​(1, 'jeff')

Cuestiones relacionadas