2010-06-04 16 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 को SqlBulkCopyColumnMappingCollection नहीं जोड़ सकते हैं के रूप में बाद में केवल मिलता है फिर से परिभाषित। आप एक समय में मैपिंग जोड़ने के लिए bulkCopy.ColumnMappings की विधि विधि का उपयोग कर सकते हैं। – 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); 
    }  
} 

संपादित करें:

टिप्पणियों के आधार पर, लक्ष्य एक सामान्य कार्य करना था, उदाहरण के लिए फ़ंक्शन में स्पष्ट रूप से मैपिंग को हार्डकोड नहीं करना है। चूंकि कॉलम मैपिंग कोलेक्शन को तत्काल नहीं किया जा सकता है, इसलिए मैं List<string> या इसी तरह के कार्य को पार करने की अनुशंसा करता हूं जिसमें फ़ंक्शन में कॉलम मैपिंग परिभाषा शामिल है। उदाहरण के लिए:

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

तब समारोह

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

हालांकि मुझे इसके बारे में पता है। अब आपने इस विधि को एक ही टेबल पर बांध दिया है (जब तक मेरे पास एक ही कॉलम नाम वाली प्रत्येक तालिका नहीं है)। मैं यहां एक सामान्य विधि बनाने की कोशिश कर रहा हूं कि मैं किसी भी तालिका में जा सकता हूं और एक एसक्लबुलकॉपी कर सकता हूं। इसलिए यदि मुझे 5 अलग-अलग स्क्लबुलकॉपी आवेषण की आवश्यकता है, तो मेरे पास मैपिंग को छोड़कर लगभग उसी कोड के साथ इनमें से 5 विधियां नहीं हैं। – chobo2

+0

यह देखते हुए कि फ़ंक्शन सामान्य होना चाहिए, और आप कॉलम मैपिंग कोलेक्शन को तुरंत चालू नहीं कर सकते हैं, मैं मैपिंग के प्रतिनिधित्व में गुजरने की अनुशंसा करता हूं - उपर्युक्त संपादन देखें। – goric

+3

हां जिस तरह से मैंने यह अनुमान लगाया है कि मैं सिर्फ तारों की बजाय कॉलम मैपिंग की सूची में भेजता हूं। – chobo2

संबंधित मुद्दे