2009-09-09 15 views
15

मैं एक DataAccess विधि ग्राहक द्वारा निर्धारित पुन: उपयोग करने की जरूरत है। यह विधि एक वेनिला डेटाटेबल लौटाती है। मैं अपने टाइप किए गए डेटाटेबल को इस डेटाटेबल को कास्ट करना चाहता हूं। कॉलम और उनके प्रकार की मात्रा मेल खाएगी। अपवाद संदेश "प्रकार 'System.Data.DataTable' की वस्तु कास्ट करने के लिए टाइप करने के लिए 'MarketValueDataTable' में असमर्थ।" बहुत स्पष्ट है, लेकिन मैं इसे कैसे ठीक कर सकता हूं?कास्टिंग सामान्य datatable लिखे गए datatable

casting-a-base-type-to-a-derived-type पर एक नज़र था, लेकिन वह काम करने के लिए कैसे नहीं देख सकता था।

मैं एक DataReader साथ datatable पॉप्युलेट नहीं कर सकते, केवल ग्राहक की DataAccess विधि का उपयोग कर सकते हैं।

उत्तर

32

यदि तालिका विधि द्वारा दिया वास्तव में MarketValueDataTable का एक उदाहरण था डाली केवल काम कर सकता था: की तरह

कोशिश कुछ। यदि ऐसा नहीं है, तो आप डेटा को MarketValueDataTable के उदाहरण पर प्रतिलिपि बना सकते हैं। अपने datatable एक सामान्य तालिका तो यह एक MarketValueDataTable में ढाला नहीं जा सकता है, तो

DataTable data = GetData(); 
MarketValueDataTable myData = new MarketValueDataTable(); 
myData.Merge(data); 
+0

मैं इतना Luv! धन्यवाद। – callisto

+0

बहुत अच्छा .. :) – Marshal

+0

विलय की लागत क्या हैं ?! – deepdive

1

आप सरल कारण यह है कि यह से विरासत नहीं है के लिए, एक MarketValueDataTable को DataTable डाली नहीं कर सकता।

आप क्या करने की जरूरत है एक नया MarketValueDataTable का दृष्टांत, तो यह में DataTable से डेटा कॉपी है।

MarketValueDataTable myTable = new MarketValueDataTable(); 
StringWriter writer = new StringWriter(); 
theDataTable.WriteXml(writer); 
myTable.ReadXml(new StringReader(writer.ToString())); 

(मैं इस परीक्षण नहीं किया)

0

: आप उदाहरण के लिए Merge विधि का उपयोग कर सकते हैं।

एक चीज जो आप कोशिश कर सकते हैं वह एक नया MarketValueDataTable ऑब्जेक्ट बनाने और मैन्युअल रूप से पंक्तियों को जोड़ने के लिए है। अपने जेनेरिक डेटाटेबल की पंक्तियों के माध्यम से कदम उठाकर और फिर प्रत्येक पंक्ति के कॉलम के माध्यम से कदम उठाने से आप एक नए MarketValueDataTableRow के प्रॉपर्टी वैल्यू सेट करने के लिए प्रतिबिंब का उपयोग कर सकते हैं।

कुछ निम्नलिखित की तरह (चेतावनी - स्यूडोकोड):

MarketValueDataTable mv = new MarketValueDataTable(); 
foreach(DataRow row in table.Rows) 
{ 

    MarketValueDataTableRow mvrow = mv.NewRow(); 
    foreach(DataColumn col in table.Columns) 
    { 
     PropertyInfo colProperty = mvrow.GetType().GetProperty(col.Name); 
     colProperty.SetValue(mvRow, row[col]); 
    } 
    mv.Rows.Add(mvrow); 

} 

आप सामान्य विचार मिलता है। सामान्य तालिका की पंक्तियों के माध्यम से कदम उठाएं और विशिष्ट टाइप की गई डेटा पंक्ति में मिलान करने वाले गुणों को ढूंढने के लिए प्रतिबिंब का उपयोग करें। यह काम करना चाहिए (मैंने पहले एक ही दृष्टिकोण का उपयोग किया है), लेकिन कोड को आपकी आवश्यकताओं से मेल खाने के लिए संशोधित किया जाना चाहिए।

7

एक नियमित DataTable को टाइप किए गए DataTable पर बदलने के लिए इस आसान कार्य का उपयोग करें।

वीबी

Public Shared Function ConvertToTypedDataTable(Of T As {Data.DataTable, New})(dtBase As Data.DataTable) As T 
    Dim dtTyped As New T 
    dtTyped.Merge(dtBase) 

    Return dtTyped 
End Function 

प्रयोग

Dim dtTyped = ConvertToTypedDataTable(Of dataset1.MyTypedDataTable)(MyUntypedDataTable) 

सी #

public static T ConvertToTypedDataTable<T>(System.Data.DataTable dtBase) where T : Data.DataTable, new() 
{ 
    T dtTyped = new T(); 
    dtTyped.Merge(dtBase); 

    return dtTyped; 
} 

प्रयोग

dataset1.MyTypedDataTable dtTyped = ConvertToTypedDataTable<dataset1.MyTypedDataTable>(MyUntypedDataTable); 
संबंधित मुद्दे