2010-11-15 22 views
6

मैं 1 डेटा तालिका से 1 डेटा कॉलम को एक नए डेटाटेबल में कैसे कॉपी कर सकता हूं। जब मैं इसे करने का प्रयास करता हूं, तो मुझे त्रुटि मिलती है कॉलम 'XXX' पहले से ही किसी अन्य डेटाटेबल से संबंधित है।डाटाकॉलम को डेटा डेटा से दूसरे डेटा में कॉपी करने में असमर्थ

dataColumn = datatable1.Columns[1]; 
datatable2 = new DataTable(); 
datatable2.Columns.Add(dataColumn); 

धन्यवाद अग्रिम

+1

आप कोड या एक्सएमएल पोस्ट करते हैं तो ** कृपया ** पाठ संपादक में उन पंक्तियों को उजागर करने और अच्छी तरह से स्वरूपित करने के लिए और वाक्य रचना यह उजागर संपादक उपकरण पट्टी पर "कोड" बटन (101 010) पर क्लिक करें! –

+0

संभावित डुप्लिकेट [हम डेटाटेबल के डाटाकॉलम के डेटा को किसी अन्य डेटाटेबल में कैसे कॉपी कर सकते हैं?] (Http://stackoverflow.com/questions/2583898/how-can-we-copy-the-data-of-the -डेटाकॉलम-द-दैटटेबल-टू-ए-डेटटेबल) –

उत्तर

7

आप डेटा कॉलम कॉपी नहीं कर सकते हैं। आपको क्या करने की आवश्यकता होगी, पुराने डेटाटेबल के कॉलम के समान डेटा प्रकार के साथ नए डेटाटेबल में एक नया डेटा कॉलम बनाएं, और फिर आपको पुरानी डेटाटेबल से सभी डेटा लाने के लिए फोर लूप चलाने की आवश्यकता है विवरण सारणी।

निम्नलिखित कोड देखें। यह मानता है कि डेटाटेबल्स में पंक्तियों की एक ही संख्या है।

 
DataTable dt1 = new DataTable(); 
DataTable dt2 = new DataTable(); 

dt2.Columns.Add("ColumnA", dt1.Columns["ColumnA"].DataType); 

for (int i = 0; i < dt1.Rows.Count; i++) 
{ 
    dt2.Rows[i]["ColumnA"] = dt1.Rows[i]["ColumnA"]; 
}

इसके अलावा, डेटा आप कॉपी कर रहे संदर्भ प्रकार और नहीं मूल्य प्रकार आप अगर एक .Clone() विधि प्रकार के लिए उपलब्ध है, या एक अपने आप को बनाने के लिए चाहते हो सकता है कर रहे हैं। फोर लूप में बस 'यह = वह' करना संदर्भ प्रकारों पर काम नहीं करेगा।

+0

@ लेन धन्यवाद .. लेकिन मुझे लगता है कि यह दृष्टिकोण बहुत महंगा होगा मुझे 1 से अधिक कॉलम कॉपी करना पड़ सकता है और पंक्तियां 1 मिलियन से अधिक हो सकती हैं .. – Ananth

+1

आप उसी लूप में एकाधिक कॉलम में डेटा कॉपी कर सकते हैं। ऐसा करने का यही एकमात्र तरीका है। – SLaks

+0

सहमत हुए। ऐसा करने का यह एकमात्र तरीका है, यदि आप एक डेटाटेबल से दूसरे डेटाटेबल में कॉलम कॉपी कर रहे हैं। जैसा कि आप सोचते हैं उतना महंगा नहीं हो सकता है। इसे आज़माएं और देखें। – Lane

4

में आप एक DataColumn कॉपी नहीं कर सकते। (डेटा कॉलम बहुत अच्छी तरह से उनकी तालिकाओं के साथ मिलकर हैं)

इसके बजाय, आप एक ही नाम और डेटाटाइप के साथ एक नया कॉलम जोड़ सकते हैं।

आप DataTable.Clone() की तलाश कर रहे हैं, जो एक संपूर्ण तालिका की एक संरचनात्मक प्रति बना देगा। (एक ही स्कीमा के साथ, लेकिन कोई डेटा नहीं)

+0

धन्यवाद..लेकिन मुझे डेटा भी नई डेटा तालिका में रखना होगा .. – Ananth

1

बस एक विचार, क्या आपके डेटाटेबल्स दोनों एक ही डेटासेट में हैं?

यदि ऐसा है, तो आप दो टेबल के कॉलम (विदेशी कुंजी सोचें) के बीच नामित DataRelation बना सकते हैं।

फिर आप अपनी तालिका में एक प्रतिबिंबित डेटा कॉलम जोड़ सकते हैं जिसमें Expression संपत्ति "बाल (रिलेशनशिपनाम)।" कॉलमनाम "या" अभिभावक (संबंध नाम)। "कॉलमनाम" संबंध की दिशा के आधार पर सेट की गई है।

यह आपको कॉलम की प्रतिलिपि बनाने के समान प्रभाव देगा, लेकिन मेरा मानना ​​है कि यह केवल आलसी मूल्यांकन करता है। तो हो सकता है कि यह आपको वही देगा जो आपको चाहिए।

यह कैसे काम करता है here एक उदाहरण है। उदाहरण योग समेकित फ़ंक्शन का उपयोग करता है, लेकिन आप केवल स्तंभ नाम को संदर्भित करने की जरूरत है और यह आपके DataTable

myDataSet.Relations.Add(
    "Orders2OrderLines", 
    myDataSet.Tables["Orders"].Columns["OrderID"], 
    myDataSet.Tables["OrderLines"].Columns["OrderID"]); 

ordersTable.Columns.Add("OrderTotal", typeof(decimal), "Sum(Child(Orders2OrderLines).ExtendedPrice)"); 

HTH में इसकी नक़ल

+0

मुझे पूरा यकीन है कि यह आलसी मूल्यांकन नहीं करेगा। साथ ही, कॉलम में मान स्थायी रूप से लिंक किए जाएंगे, जो वह चाहे जो हो या न हो। – SLaks

+0

@ स्लक्स - आप लिंकिंग के बारे में सही हैं - यह आपकी आवश्यकताओं के आधार पर अच्छा या बुरा हो सकता है। मुझे लगता है कि यह आलसी है क्योंकि लिंकिंग की वजह से है। मैं कल्पना करता हूं कि आंतरिक रूप से यह केवल एक प्रतिनिधि है जो मूल तालिका में डेटा से जुड़ता है - इसलिए प्रतिलिपि वास्तव में नहीं होती है। मुझे यह जानना अच्छा लगेगा कि मैं गलत था क्योंकि मैंने कभी इसका परीक्षण नहीं किया है ... – sheikhjabootie

+0

धन्यवाद .. लेकिन मेरे डेटाटेबल्स दोनों एक ही डेटासेट में हैं। – Ananth

-2

कोई पाशन आवश्यक है, इस संदर्भ लें, आशा है इस का समाधान करना चाहिए आपकी समस्या ...

DataTable dt = new DataTable(); 
//fill the dt here 
DataTable dt2 = new DataTable(); 
string[] strCols = {"Column Name to copy"}; 
dt2 = dt.DefaultView.ToTable("newTableName", false, strCols); 
+0

एक नया डेटाटेबल बनाना इस सवाल में नहीं पूछा गया था। (इसके अलावा, दूसरा कन्स्ट्रक्टर कॉल अनावश्यक है।) –

0

समस्या से ग # के कारण होता है वस्तु उदाहरण बनाया पुन: उपयोग और गुणकों DataTables पर इसे इस्तेमाल करता है नहीं कर सकते। इसके लिए प्रत्येक लूप पुनरावृत्ति के लिए एक नया ऑब्जेक्ट DataCollumn बनाना आवश्यक है।

foreach (DataTable table in DATASET.Tables) 
{ 
    DataColumn yourDataCollumn = new DataColumn("Name of DataCollumn", typeof(Your data type)); 
    // your logic here 
} 

उम्मीद है कि यह मददगार है ...

0

मैंने नीचे LINQ का उपयोग करके दो तालिकाओं को मर्ज करने के लिए नीचे दिया और अंत में केवल पंक्तियों के माध्यम से लूपिंग किया। मैं इसे सुंदर नहीं कहूंगा लेकिन यह काम करता है। ऊपर सूचीबद्ध कुछ मान्यताओं को रोकने के लिए शामिल होने का उपयोग करना।

DataTable tableOne = getTableOne(); 
DataTable tableTwo = getTableTwo(); 

var oneColumns = tableOne.Columns.Cast<DataColumn>() 
           .Select(p => new Column(p.ColumnName, DataType)) 
           .ToArray(); 

var twoColumns = tableTwo.Columns.Cast<DataColumn>() 
           .Select(p => new DataColumn(p.ColumnName, p.DataType)) 
           .ToArray(); 


var matches = (from a in tableOne.AsEnumerable() 
       join b in tableTwo.AsEnumerable() on a["column_name"] equals b["column_name"] 
       select a.ItemArray.Concat(b.ItemArray)).ToArray(); 


DataTable merged = new DataTable(); 
merged.Columns.AddRange(oneColumns); 
merged.Columns.AddRange(twoColumns); 

foreach (var m in matches) { merged.Rows.Add(m.ToArray()); } 
+0

मुझे नहीं लगता कि वे एक टेबल को दूसरे के साथ मर्ज करना चाहते हैं, ऐसा लगता है जैसे वे पहले से केवल एक कॉलम के साथ एक टेबल बीज करना चाहते हैं। – Jesse

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