c# - ejemplo - Insertar SqlBulkCopy con columna de identidad
sqlbulkcopy c# example excel (6)
Estoy usando el objeto SqlBulkCopy
para insertar un par de millones de filas generadas en una base de datos. El único problema es que la tabla en la que estoy insertando tiene una columna de identidad. Intenté configurar SqlBulkCopyOptions
en SqlBulkCopyOptions.KeepIdentity
y estableciendo la columna de identidad en 0
, DbNull.Value
y null
. Ninguno de los cuales ha funcionado. Siento que me estoy perdiendo algo bastante simple, si alguien pudiera iluminarme eso sería fantástico. ¡Gracias!
editar Para aclarar, no tengo los valores de identidad establecidos en la DataTable
que estoy importando. Quiero que se generen como parte de la importación.
edit 2 Aquí está el código que uso para crear el objeto base SqlBulkCopy
.
SqlBulkCopy sbc = GetBulkCopy(SqlBulkCopyOptions.KeepIdentity);
sbc.DestinationTableName = LOOKUP_TABLE;
private static SqlBulkCopy GetBulkCopy(SqlBulkCopyOptions options =
SqlBulkCopyOptions.Default)
{
Configuration cfg = WebConfigurationManager.OpenWebConfiguration("/RSWifi");
string connString =
cfg.ConnectionStrings.ConnectionStrings["WifiData"].ConnectionString;
return new SqlBulkCopy(connString, options);
}
Complete the ColumnMapping
(vea this ) del objeto BulkCopy y no mapee la columna de identidad. La columna de identidad será generada por la base de datos de destino.
En mi caso, resultó ser un espacio en blanco dentro del nombre de la columna y en una de las columnas había usado accidentalmente hyphon (-) en lugar de subrayado (_) en mi tabla SQL. Reemplacé el espacio en blanco e hyphon con guión bajo en la tabla sql y solucionó el problema.
Para que la tabla de destino asigne la identidad, no use la opción SqlBulkCopyOptions.KeepIdentity
. En su lugar, no asigne la identidad de la fuente y no la extraiga de la fuente para enviarla a SqlBulkCopy
.
Sí, tienes razón al usar la opción SqlBulkCopyOptions.KeepIdentity, entonces bulkcopy writer no pienses que estructura tu tabla escribe este objeto desde la columna de inicio, entonces para nuestra necesidad, estoy haciendo lo mismo para preservar el campo de identidad en mi tabla solo tienes que crea una columna adicional en tu objeto de tabla de datos con el resto de tus columnas necesarias y pasa los valores nulos a esta columna, luego la tabla maneja automáticamente Identidad.
Tienes dos opciones -
1 - use KeepIdentity
y preserve los valores de Identity
la fuente.
2 - No mapea el campo Identity
. Si no intentas asignar un valor, la tabla objetivo asignará uno automáticamente.
Causa : - Había algunas filas vacías en Excel al final de los datos, que posiblemente parezcan filas en blanco. La carga masiva intentaba cargar estas filas en blanco en la tabla.
Solución : seleccione solo las filas que contienen datos, copie los datos en la hoja nueva. Supongamos que tiene sus datos en la "Hoja 1", muévalos a la "Hoja 2" y elimine "Hoja 1".