2010-06-04 8 views
11

Tôi muốn tạo một phương thức SqlBulkCopy mà tôi có thể sử dụng cho tất cả các chèn số lượng lớn bằng cách truyền dữ liệu cụ thể qua các tham số.Làm thế nào để sử dụng SqlBulkCopyColumnMappingCollection?

Bây giờ tôi cần thực hiện ánh xạ trên một số trong số chúng. Tôi không biết làm thế nào để tạo ra một SqlBulkCopyColumnMappingCollection vì đó là kế hoạch của tôi để vượt qua trong bộ sưu tập ánh xạ và sử dụng nó. Tuy nhiên tôi không biết làm thế nào để làm cho nó. Tôi không thể tạo ra một vật thể mới.

Đây là những gì tôi có bây giờ. Làm thế nào tôi có thể thêm nó làm bản đồ đặt vượt qua nó trong?

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

bạn không thể thêm SqlBulkCopyColumnMappingCollection để bulkCopy.ColumnMappings như sau chỉ nhận được. bạn có thể sử dụng phương thức Thêm của bulkCopy.ColumnMappings để thêm ánh xạ từng cái một. – iTSrAVIE

Trả lời

20

Bạn không cần phải tạo ra một thể hiện mới của nó - lớp SqlBulkCopy có một tài sản mà là một bộ sưu tập bản đồ mà bạn có thể sử dụng:

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

EDIT:

Dựa trên các ý kiến, mục tiêu là tạo ra một hàm tổng quát, ví dụ không phải mã hóa bản đồ một cách rõ ràng trong hàm. Kể từ khi ColumnMappingCollection không thể được instantiated, tôi sẽ khuyên bạn nên đi qua một List<string> hoặc tương tự có chứa định nghĩa ánh xạ cột vào chức năng. Ví dụ:

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

Sau đó tái xác định các chức năng như

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

Tuy nhiên, tôi biết điều đó. Bây giờ bạn chỉ cần gắn phương thức này vào một bảng đơn (Trừ khi tôi có tất cả các bảng có cùng tên cột). Tôi đang cố gắng thực hiện một phương pháp chung ở đây mà tôi có thể vượt qua trong bất kỳ bảng và làm một sqlbulkcopy. Vì vậy, nếu tôi cần 5 sqlbulkcopy chèn khác nhau, tôi không có 5 của các phương pháp này với gần như cùng một mã ngoại trừ lập bản đồ. – chobo2

+0

Cho rằng hàm phải là chung chung và bạn không thể khởi tạo ColumnMappingCollection, tôi khuyên bạn nên chuyển sang biểu diễn ánh xạ - xem phần chỉnh sửa ở trên. – goric

+3

Ya đó là cách tôi đã tìm ra quá mong đợi tôi chỉ cần gửi trong một danh sách các ColumnMappings thay vì dây. – chobo2