एक डेटाटेबल से दूसरे डेटाटेबल में पंक्तियों को कॉपी करें?


165

मैं DataTable से किसी अन्य Datable के लिए c # में विशिष्ट पंक्तियों को कैसे कॉपी कर सकता हूं? एक से अधिक रो होंगे।

जवाबों:


257
foreach (DataRow dr in dataTable1.Rows) {
    if (/* some condition */)
        dataTable2.Rows.Add(dr.ItemArray);
}

उपरोक्त उदाहरण मानता है कि dataTable1और dataTable2स्तंभों की संख्या, प्रकार और क्रम है।


22
यह परिणाम नहीं होगा "यह पंक्ति पहले से ही किसी अन्य तालिका से संबंधित है।"
मैकआर्थी

15
@McArthey नहीं, यह नहीं होगा; मौजूदा पंक्ति में मानों से एक नई पंक्ति बनाई जा रही है। पंक्ति को अन्य डेटाटेबल में नहीं जोड़ा जा रहा है।
ब्रैडली स्मिथ

20
@DawoodAbbasi केवल तभी होता है जब आप ItemArrayअभिव्यक्ति के अंत में भाग छोड़ देते हैं । सुनिश्चित करें कि आप पंक्ति के मूल्यों को जोड़ रहे हैं, न कि पंक्ति को।
ब्रैडली स्मिथ

4
@DawoodAbbasi DataTable.Cloneविधि के लिए MSDN प्रलेखन का संदर्भ लें : msdn.microsoft.com/en-us/library/…
ब्रैडली स्मिथ

10
यद्यपि आपका उत्तर तकनीकी रूप से सही है, आपका कोड नमूना आपकी मान्यताओं को संबोधित नहीं करता है। @RageeshGr द्वारा उत्तर सभी मान्यताओं को संभालता है और IMHO अधिक संक्षेप में लिखा जाता है और कम त्रुटि वाला होता है।
chris.nesbit1

94

तालिका से दूसरे तक निर्दिष्ट पंक्तियों की प्रतिलिपि बनाएँ

// here dttablenew is a new Table  and dttableOld is table Which having the data 

dttableNew  = dttableOld.Clone();  

foreach (DataRow drtableOld in dttableOld.Rows)
{
   if (/*put some Condition */)
   {
      dtTableNew.ImportRow(drtableOld);
   }
}

अगर मुझे आयात के बाद dttableOld का उपयोग करने की आवश्यकता नहीं है, तो क्या मुझे अभी भी क्लोन () का उपयोग करने की आवश्यकता है?
सैम

महान और व्यावहारिक! धन्यवाद!
मेयर स्पिट्जर

1
@Sam आपके प्रश्न के बारे में, क्लोन तालिका संरचना की प्रतिलिपि बनाना है, यदि आपकी तालिका पहले से ही डेटा-प्रकार है, तो आपको इसकी आवश्यकता नहीं है।
मेयर स्पिट्जर

19

इसे इस्तेमाल करे

    String matchString="ID0001"//assuming we have to find rows having key=ID0001
    DataTable dtTarget = new DataTable();
    dtTarget = dtSource.Clone();
    DataRow[] rowsToCopy;
    rowsToCopy = dtSource.Select("key='" + matchString + "'");
    foreach (DataRow temp in rowsToCopy)
    {
        dtTarget.ImportRow(temp);
    }

@ManojSavalia, तो क्या विकल्प है कि प्रदर्शन लागत नहीं है?
सैम

16

इसे देखें, आप इसे पसंद कर सकते हैं (पहले, कृपया, क्लोन 1 से टेबल 2 तक):

table1.AsEnumerable().Take(recodCount).CopyToDataTable(table2,LoadOption.OverwriteChanges);

या:

table1.AsEnumerable().Where ( yourcondition  ) .CopyToDataTable(table2,LoadOption.OverwriteChanges);

यह एक बहुत बेहतर तरीका है क्योंकि यह अंतर्निर्मित लूप के सभी के विपरीत, प्रत्येक के माध्यम से स्पष्ट रूप से पुनरावृत्ति के बिना एक DataTable से दूसरे तक डेटा-टेबल से पंक्तियों की रेंज-कॉपी या यहां तक ​​कि अंतर्निहित क्षमता का उपयोग करता है। .ForEach पद्धति आधारित उत्तर।
डेविड बर्ग

15

में समर्थित: 4, 3.5 SP1, अब आप सिर्फ ऑब्जेक्ट पर एक विधि कह सकते हैं।

DataTable dataTable2 = dataTable1.Copy()

2
तकनीकी रूप से यह एक डेटा योग्य की एक प्रति बनाता है। हालांकि यह स्पष्ट रूप से प्रश्न में नहीं बताया गया है, यह संभव है कि dataTable2 पहले से मौजूद है और इसमें अन्य पंक्तियाँ हैं जिन्हें हम खोना नहीं चाहते हैं। साथ ही, प्रश्न विशेष रूप से "विशिष्ट पंक्तियों" को बताता है, जबकि यह केवल सभी पंक्तियों को संभालता है।
मैट

5

अन्य पदों के परिणामस्वरूप, यह सबसे छोटा है जो मुझे मिल सकता है:

DataTable destTable = sourceTable.Clone();
sourceTable.AsEnumerable().Where(row => /* condition */ ).ToList().ForEach(row => destTable.ImportRow(row));

जो मूल रूप से एक फॉर्च्यूनर है। ओपी द्वारा अनुरोध किए जाने पर भी, आप एक शर्त के माध्यम से फ़िल्टर नहीं कर रहे हैं।
एरिक वू

अब अगर मैं sourceTableवसीयत destTableभी साफ कर दूं?
15

मैं एक मान निर्दिष्ट करने में सक्षम होना चाहता हूं और गंतव्य को साफ किए बिना मूल चर को हटा देना चाहिए।
15

2

नीचे नमूना एक पंक्ति को कॉपी करने का सबसे तेज़ तरीका होगा। प्रत्येक सेल को कॉलम नाम के आधार पर कॉपी किया जा रहा है। अगर आपको कॉपी करने के लिए एक विशिष्ट सेल की आवश्यकता नहीं है, तो एक कोशिश पकड़ें या यदि जोड़ें। यदि आपकी 1 से अधिक पंक्ति कॉपी करने जा रही है तो नीचे दिए गए कोड को लूप करें।

DataRow dr = dataset1.Tables[0].NewRow();
for (int i = 0; i < dataset1.Tables[1].Columns.Count; i++)
{
    dr[dataset1.Tables[1].Columns[i].ColumnName] = dataset1.Tables[1].Rows[0][i];
}

datasetReport.Tables[0].Rows.Add(dr);

डेटासेट 1 टेबल्स [1] .Rows [ 0 ] [i]; इंडेक्स 0 को अपने निर्दिष्ट पंक्ति इंडेक्स में बदल दें या यदि आप लूप में जा रहे हैं या यदि तार्किक होने जा रहा है तो आप एक वेरिएबल का उपयोग कर सकते हैं


1
 private void CopyDataTable(DataTable table){
     // Create an object variable for the copy.
     DataTable copyDataTable;
     copyDataTable = table.Copy();
     // Insert code to work with the copy.
 }

आपका कोड मेरे लिए एकदम सही काम करता है, एक बहुत ही सरल कोड है, धन्यवाद
Esraa_92

1

जो एकल कमांड SQL क्वेरी चाहते हैं, उनके लिए:

INSERT INTO TABLE002 
(COL001_MEM_ID, COL002_MEM_NAME, COL002_MEM_ADD, COL002_CREATE_USER_C, COL002_CREATE_S)
SELECT COL001_MEM_ID, COL001_MEM_NAME, COL001_MEM_ADD, COL001_CREATE_USER_C, COL001_CREATE_S
FROM TABLE001;

इस क्वेरी से डेटा कॉपी जाएगा TABLE001करने के लिए TABLE002और हम मानते हैं कि दोनों स्तंभ अलग स्तंभ नाम था।

कॉलम नामों को एक-से-एक मैप किया जाता है जैसे:

COL001_MEM_ID -> COL001_MEM_ID

COL001_MEM_NAME -> COL002_MEM_NAME

COL001_MEM_ADD -> COL002_MEM_ADD

COL001_CREATE_USER_C -> COL002_CREATE_USER_C

COL002_CREATE_S -> COL002_CREATE_S

आप यह भी निर्दिष्ट कर सकते हैं कि कहां क्लॉज है, अगर आपको कुछ शर्त की आवश्यकता है।


0

पूरी तरह से व्यावहारिक प्रतिलिपि बनाने के लिए बस ऐसा करें

DataGridView sourceGrid = this.dataGridView1;
DataGridView targetGrid = this.dataGridView2;
targetGrid.DataSource = sourceGrid.DataSource;

2
सवाल यह है कि किसी डेटा टेबल से विशिष्ट पंक्तियों को कैसे कॉपी किया जाए, पूरी बात नहीं।
जटेट

0

मैंने इस मुद्दे को करने का एक आसान तरीका बनाया है

 DataTable newTable = oldtable.Clone();    
 for (int i = 0; i < oldtable.Rows.Count; i++)
 {
   DataRow drNew = newTable.NewRow();    
   drNew.ItemArray = oldtable.Rows[i].ItemArray;    
   newTable.Rows.Add(drNew);   
 } 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.