2010-06-04 3 views
11

매개 변수를 통해 특정 데이터를 전달하여 모든 대량 삽입에 사용할 수있는 하나의 SqlBulkCopy 메서드를 만들고 싶습니다.SqlBulkCopyColumnMappingCollection을 사용하는 방법?

이제 일부 정보를 매핑해야합니다. SqlBulkCopyColumnMappingCollection을 만드는 방법을 모르겠습니다. 매핑 계획을 전달하고 사용하는 계획 이었기 때문입니다. 그러나 나는 그것을 어떻게 만드는지 모른다. 나는 그것의 새로운 목적을 만들 수 없다.

이것은 내가 지금 가지고있는 것입니다. 패스를 넣으면 매핑을 어떻게 추가 할 수 있습니까?

public void BatchBulkCopy(DataTable dataTable, string DestinationTbl, int batchSize) 
{ 
    // Get the DataTable 
    DataTable dtInsertRows = dataTable; 

    using (SqlBulkCopy sbc = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity)) 
    { 
     sbc.DestinationTableName = DestinationTbl; 

     // Number of records to be processed in one go 
     sbc.BatchSize = batchSize; 

     // Finally write to server 
     sbc.WriteToServer(dtInsertRows); 
    } 
} 
+0

으로 기능을 다시 정의합니다. bulkCopy.ColumnMappings의 Add 메소드를 사용하여 한 번에 하나씩 매핑을 추가 할 수 있습니다. – iTSrAVIE

답변

20

당신은 그것의 새 인스턴스를 만들 필요가 없습니다 않음 - SqlBulkCopy의 클래스가 사용할 수있는 매핑 모음입니다 속성이 있습니다

public void BatchBulkCopy(DataTable dataTable, string DestinationTbl, int batchSize) 
{ 
    // Get the DataTable 
    DataTable dtInsertRows = dataTable; 

    using (SqlBulkCopy sbc = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity)) 
    { 
     sbc.DestinationTableName = DestinationTbl; 

     // Number of records to be processed in one go 
     sbc.BatchSize = batchSize; 

     // Add your column mappings here 
     sbc.ColumnMappings.Add("field1","field3"); 
     sbc.ColumnMappings.Add("foo","bar"); 

     // Finally write to server 
     sbc.WriteToServer(dtInsertRows); 
    }  
} 

편집 :

의견을 바탕으로 목표는 일반적인 함수를 만드는 것이 었습니다. 함수에서 맵핑을 명시 적으로 하드 코딩 할 필요가 없습니다. ColumnMappingCollection을 인스턴스화 할 수 없으므로 열 매핑 정의가 포함 된 List<string> 또는 이와 비슷한 함수를 함수에 전달하는 것이 좋습니다. 예를 들어 :

var columnMapping = new List<string>(); 
columnMapping.Add("field1,field3"); 
columnMapping.Add("foo,bar"); 

는 다음과 같은 이상에만 얻을 당신이 bulkCopy.ColumnMappings에 SqlBulkCopyColumnMappingCollection를 추가 할 수 없습니다

public void BatchBulkCopy(DataTable dataTable, string DestinationTbl, int batchSize, List<string> columnMapping) 
{ 
    // Get the DataTable 
    DataTable dtInsertRows = dataTable; 

    using (SqlBulkCopy sbc = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity)) 
    { 
     sbc.DestinationTableName = DestinationTbl; 

     // Number of records to be processed in one go 
     sbc.BatchSize = batchSize; 

     // Add your column mappings here 
     foreach(var mapping in columnMapping) 
     { 
      var split = mapping.Split(new[] { ',' }); 
      sbc.ColumnMappings.Add(split.First(), split.Last()); 
     } 

     // Finally write to server 
     sbc.WriteToServer(dtInsertRows); 
    } 
} 
+0

그러나 나는 알고 있습니다. 이제는이 메소드를 단일 테이블에 연결했습니다 (동일한 열 이름을 가진 모든 단일 테이블을 제외하고). 여기에 제네릭 메서드를 만들어서 모든 테이블을 전달하고 sqlbulkcopy를 할 수 있습니다. 그래서 5 개의 다른 sqlbulkcopy inserts가 필요하다면 매핑을 제외하고는 거의 같은 코드를 가진 5 개의 메소드가 없다. – chobo2

+0

함수가 generic이어야하고 ColumnMappingCollection을 인스턴스화 할 수 없다면 위의 편집을 참조하여 매핑 표현을 전달하는 것이 좋습니다. – goric

+3

그래, 내가 생각한 방법은 문자열 대신 ColumnMappings 목록을 보내면된다. – chobo2

관련 문제