2012-01-12 17 views
34

से संबंधित है यह त्रुटि किसी डेटासेट से किसी अन्य डेटा को में जोड़ने के दौरान होती है। "डेटाटेबल पहले से ही किसी अन्य डेटासेट से संबंधित है।"डेटाटेबल पहले से ही किसी अन्य डेटासेट

dsformulaValues.Tables.Add(m_DataAccess.GetFormulaValues 
(dv.ToTable.DefaultView.ToTable(False, strSelectedCols)).Tables(0)) 

उत्तर

70
अन्य प्रतिक्रियाओं की तरह

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

डेटा समाधान के लिए Copy एक समाधान है और प्रतिलिपि अन्य डेटासेट पर असाइन करें।

dtCopy = dataTable.Copy() 
ds.Tables.Add(dtCopy) 

कॉपी किए गए डेटाटेबल में कॉपी किए गए डेटाटेबल की संरचना और डेटा होगा।

यदि आप केवल डेटाटेबल की संरचना चाहते हैं, तो इसके बजाय Clone पर कॉल करें।

dtCopy = dataTable.Clone() 
+0

की प्रतिलिपि बनाएगा क्या आपको पता है कि ऐसा क्यों है? मतलब उदा। सूची myl = नई सूची (); और फिर मैं 3 आइटम जोड़ता हूं और मैं यह myl [0] = myl [1] करता हूं और यह ठीक काम करता है। मैंने पहले ही सूची में myl [1] जोड़ा है। प्रश्न डेटाटेबल पर अधिक सामान्य है कि क्यों और कैसे यह जांच किया जाता है यदि तालिका पहले से ही डेटासेट – Dhananjay

+4

से संबंधित है, कॉपी में बहुत अधिक ओवरहेड है ... बेहतर समाधान के लिए नीचे नथनील लेटन का जवाब देखें। – Edyn

0

मुझे लगता है कि इसका मतलब यह है DataTable एक और डेटासेट के अंतर्गत आता है ...

आप एक्सएमएल के लिए DataTable serialze सकता है, तो अपने लक्ष्य डेटासेट में deserialize।

+0

मैं सिर्फ एक और डाटासेट एक डाटासेट में से एक datatable जोड़ने कर रहा हूँ। इसके लिए हमें serializtion का उपयोग करने की आवश्यकता है? – kbvishnu

+0

एक डेटाटेबल दो डेटासेट में नहीं रह सकता है। शायद आप इसे पहले से हटा सकते हैं और इसे दूसरे में जोड़ सकते हैं। मैंने कभी कोशिश नहीं की है। – zmbq

+0

dv.ToTable.DefaultView.ToTable (झूठी, strSelectedCols))। टेबल्स (0)। क्लोन()) मेरे लिए काम किया गया है आपके उत्तर के लिए धन्यवाद – kbvishnu

0

मुझे लगता है कि आपको एक नया डेटाटेबल बनाना चाहिए और संरचना और डेटा को नए में आयात करना चाहिए।

DataTable dt = dv.ToTable.DefaultView.ToTable(False, strSelectedCols)).Tables(0).Clone()

यह DataTable की एक प्रतिलिपि बनाने और लक्ष्य DataSet करने के लिए इसे प्रदान करेंगे:

2

इस विधि से कॉल करके

ds.Tables.Add(dt)

+0

धन्यवाद abbas मुझे यह मिला है :) – kbvishnu

+1

क्लोन केवल संरचना की प्रतिलिपि बनायेगा। .Copy() स्कीमा के साथ-साथ डेटा – kbvishnu

0

प्रयास मामले में DataTable.Copy() विधि के साथ तालिका कॉपी करने के लिए यह एक टाइप डेटासेट नहीं है। इस विधि में एक ही मेज का एक नया उदाहरण बनाता है तो यह किसी भी डेटासेट से संबंधित नहीं करने वाला:

मंद newTable DataTable = oldTable.Copy के रूप में() मंद DataView = newTable.DefaultView

dsformulaValues.Tables के रूप में DV। जोड़ें (m_DataAccess.GetFormulaValues ​​(dv.ToTable.DefaultView.ToTable (झूठी, strSelectedCols))। टेबल्स (0))

27

स्वीकृत उत्तर बहुत अच्छा नहीं है। क्लोनिंग हमेशा एक अंतिम विकल्प होना चाहिए।

क्लोनिंग के ऊपरी हिस्से के बिना समस्या के आसपास एक तरीका है।

 DataSet ds = GetData1(); 

     DataSet ds2 = GetData2(); 

     //Assuming you know you've got good data 

      DataTable dt = ds2.Tables[0]; 
      ds2.Tables.Remove(dt); 
      dt.TableName = "PortedTable";//you may need to change the table name to prevent conflicts 
      ds.Tables.Add(dt); 
+0

@ लेटन मई मुझे पता है कि 'क्लोन' के साथ क्या समस्या है? – kbvishnu

+0

@VeeKayBee निश्चित रूप से स्मृति की खपत –

+3

यह स्वीकार्य उत्तर होना चाहिए ... प्रतिलिपि बहुत अधिक है। – Edyn

0

मैं एक ही समस्या थी और मैं इसे Remove का उपयोग कर हल किया।मेरी राय में, अपने कोड इस हो सकता है:

DataTable myTable = new DataTable(); 

private void Save() 
{ 
    DataSet myDataSet = new DataSet(); 
    myDataSet.Tables.Add(myTable); 
    myDataSet.Tables.Remove(myTable);//This works 
    myDataSet.WriteXml("myTable.xml"); 
} 

private void buttonSave_Click(object sender, EventArgs e) 
     { 
      Save(); 
     } 

हर बार जब मैं बटन buttonSave, संदेश "DataTable क्लिक किया पहले से ही:

dsformulaValues.Tables.Add(m_DataAccess.GetFormulaValues 
(dv.ToTable.DefaultView.ToTable(False, strSelectedCols)).Tables(0)) 

dsformulaValues.Tables.Remove(//I'm not sure to understand your code, so read this code line as only an input for your stuff. Please, consider my code below for more understanding. 

मेरे काम कर कोड इस तरह था एक अन्य डेटासेट से संबंधित है "दिखाई दिया। लाइन कोड myDataSet.Tables.Remove(myTable);//This works लिखने के बाद एप्लिकेशन बिना किसी समस्या के चल रहा है और अब मैंके मूल्य को खोए बिना बटन को अधिक बार क्लिक कर सकता हूंऔर त्रुटि संदेश के बिना।

मुझे आशा है कि इससे मदद मिल सकती है।

+0

क्षमा करें, 'myDataSet.Tables.Remove (myTable); // यह काम करता है' लाइन कोड (उपरोक्त मेरे कोड में) 'myDataSet.WriteXml ("myTable.xml") के बाद होना चाहिए;' मैं पुष्टि करता हूं कि कोड काम करता है। – GMarco1989

0

मैं एक बारी पाया चारों ओर मुझे आशा है कि यह मदद कर सकते हैं

_DataTable.TableName = _TableName 
If _DataTable.DataSet IsNot Nothing Then 
    _DataSet = _DataTable.DataSet 
Else 
    _DataSet = New DataSet 
    _DataSet.Tables.Add(_DataTable) 
End If 

किसी तरह भले ही _DataTable नया है, लेकिन अगर यह एक पिछले भरी हुई शारीरिक तालिका को संदर्भित करता है यह है कि DataTable पिछले विन्यास इनहेरिट हो जाता है।

0

सरल तरीका इस प्रकार तालिका को विलय कर रहा है।

dsformulaValues.Merge(m_DataAccess.GetFormulaValues(dv.ToTable.DefaultView.ToTable(False, strSelectedCols)).Tables(0))

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