2012-06-18 11 views
5

Sto cercando di inserire un elenco generico a SQL Server con SqlBulkCopy,SqlBulkCopy con l'identità di inserimento nella tabella di destinazione

E ho difficoltà spirito Identity Campo

I wan t la mia tabella di destinazione per generare campo di identità Come devo gestire questa situazione, ecco il mio codice

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); 
       } 

eccezione

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

Ho anche provato

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

risposta

13

Finalmente ho ottenuto questo ha funzionato in questo modo

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

Questo post ha reso la mia giornata =) – Schuere

0

So che questa è una vecchia questione, ma ho pensato che valeva la pena di aggiungere questa alternativa: (Se ha già schema corretto, può saltare 1,2,3)

  1. Eseguire una semplice TOP 1 selezionare dalla tabella per restituire un datatable w esimo schema della tabella di destinazione metodo
  2. Usa di DataTable Clone per generare un DataTable con lo stesso schema e non ci sono dati
  3. Inserisci i tuoi dati in questa tabella
  4. Perform SqlBulkCopy WriteToServer (se gli ordini di colonne partita, poi i valori di identità possono essere letti . Se l'opzione non viene fornita nel costruttore di SqlBulkCopy, l'impostazione predefinita è di ignorare questi valori e lasciare che siano forniti dalla destinazione).

Il punto importante è che se le colonne sono nell'ordine corretto (comprese le colonne di identità), tutto viene gestito per te.

Problemi correlati