2012-06-18 24 views
5

我試圖插入一個泛型列表與SqlBulkCopy的SQL Server中,SqlBulkCopy的與標識插入的目標表

,我有麻煩了機智的標識字段

餘萬牛逼我的目標表生成標識字段 我應該如何處理這個問題, 這裏是我的代碼

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

例外

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

我也曾嘗試

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

回答

13

最後我得到了這個工作這種方式

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

這篇文章讓我的日子=) – Schuere

0

我知道這是一個老問題,但我認爲這是值得加入這個替代: (如果您已經有正確的模式,可以跳過1,2,3)

  1. 執行一個簡單的TOP 1選擇從表中返回一個數據表w第i個目標表的模式
  2. 使用DataTable的Clone方法來生成與相同架構的DataTable並沒有數據
  3. 插入您的數據到這個表
  4. 可執行許多使用SqlBulkCopy的WriteToServer(如果列訂單匹配,則標識值可以讀。如果該選項在SqlBulkCopy的構造函數中沒有提供,那麼缺省值是忽略這些值並讓目標提供它們)。

重要的一點是,如果您有正確順序的列(包括標識列),則會爲您處理所有內容。