2012-06-18 16 views
5

Estoy tratando de insertar una lista genérica a SQL Server con SqlBulkCopy,SqlBulkCopy con Identidad Insertar en la tabla de destino

Y tengo ingenio problemas de identidad campo

I wan t mi tabla de destino para generar campo de identidad ¿Cómo debo manejar esto, aquí es mi código

using (var bulkCopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString)) 
       { 
        bulkCopy.BatchSize = (int)DetailLines; 
        bulkCopy.DestinationTableName = "dbo.tMyTable"; 

        var table = new DataTable(); 
        var props = TypeDescriptor.GetProperties(typeof(tBFFormularyStatusList)) 
         //Dirty hack to make sure we only have system data types 
         //i.e. filter out the relationships/collections 
               .Cast<PropertyDescriptor>() 
               .Where(propertyInfo => propertyInfo.PropertyType.Namespace.Equals("System")) 
               .ToArray(); 
        foreach (var propertyInfo in props) 
        { 
         bulkCopy.ColumnMappings.Add(propertyInfo.Name, propertyInfo.Name); 
         table.Columns.Add(propertyInfo.Name, Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType); 
        } 

        var values = new object[props.Length]; 
        foreach (var item in myGenericList) 
        { 
         for (var i = 0; i < values.Length; i++) 
         { 
          values[i] = props[i].GetValue(item); 
         } 

         table.Rows.Add(values); 
        } 

        bulkCopy.WriteToServer(table); 
       } 

excepción

Property accessor 'ID' on object 'ProcessFlatFiles.DetailsClass' threw the following exception:'Object does not match target type.' 

también he intentado

using (var bulkCopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString, SqlBulkCopyOptions.KeepIdentity)) 
       { 

Respuesta

13

Finalmente llegué esto funcionó de esta manera

using (var bulkCopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString, SqlBulkCopyOptions.KeepNulls & SqlBulkCopyOptions.KeepIdentity)) 
       { 
        bulkCopy.BatchSize = (int)DetailLines; 
        bulkCopy.DestinationTableName = "dbo.myTable"; 
        bulkCopy.ColumnMappings.Clear(); 
        bulkCopy.ColumnMappings.Add("SourceColumnName", "DestinationColumnName"); 
        bulkCopy.ColumnMappings.Add("SourceColumnName", "DestinationColumnName"); 
        bulkCopy.ColumnMappings.Add("SourceColumnName", "DestinationColumnName"); 
        bulkCopy.ColumnMappings.Add("SourceColumnName", "DestinationColumnName"); 
        . 
        . 
        . 
        . 
        bulkCopy.ColumnMappings.Add("SourceColumnName", "DestinationColumnName"); 

        bulkCopy.WriteToServer(datatable); 
       } 
+0

Esta publicación hizo mi día =) – Schuere

0

Sé que esto es una vieja pregunta, pero pensé que valía la pena añadir esta alternativa: (Si ya tiene el esquema correcto, puede omitir 1,2,3)

  1. Realice un simple TOP 1 seleccione de la tabla para devolver la tabla de datos w ITH esquema de la tabla de destino método
  2. Uso de DataTable Clone para generar una tabla de datos con el mismo esquema y no hay datos
  3. insertar sus datos en esta tabla
  4. interpretará la SqlBulkCopy WriteToServer (si casar las órdenes de columnas, a continuación, los valores de identidad pueden ser leídos . Si la opción no se proporciona en el constructor de SqlBulkCopy, el valor predeterminado es ignorar estos valores y dejar que el destino los proporcione).

Lo importante es que si tiene las columnas en el orden correcto (incluidas las columnas de identidad), todo se maneja por usted.

Cuestiones relacionadas