डेट्रोएट में डेटारो एरे को कन्वर्ट करने का सरल तरीका


98

मैं एक DataRowसरणी को रूपांतरित करना चाहता हूं DataTable... ऐसा करने का सबसे सरल तरीका क्या है?

जवाबों:


91

क्यों अपने DataRow सरणी के माध्यम से पुनरावृत्ति न करें और (DataRow.ImportRow का उपयोग करके, यदि आवश्यक हो, तो DataRow की एक प्रति प्राप्त करने के लिए), कुछ इस तरह से:

foreach (DataRow row in rowArray) {
   dataTable.ImportRow(row);
}

सुनिश्चित करें कि आपके डेटाटेबल के पास आपके DataRow एरे में DataRows के समान स्कीमा है।


1
यदि आपको त्रुटि संदेश "MyControl के लिए एक अमान्य डेटा स्रोत का उपयोग किया जा रहा है, तो यह तकनीक मददगार है। एक मान्य डेटा स्रोत को किसी नियंत्रण के DataSow संपत्ति में सीधे DataRow को बाँधने का प्रयास करते समय IListSource या IEnumerable" को लागू करना चाहिए। यहाँ यह कैसे करना है:DataTable dataTable = new DataTable(); dataTable.ImportRow(dataRow); MyControl.DataSource = dataTable;
हम्बड्स

+1 मैं इसे पसंद करता हूं rowArray.CopyToDataTable();क्योंकि यह टेबल स्कीमा रखता है और इसे नए टेबल ऑब्जेक्ट के साथ प्रतिस्थापित नहीं कर रहा है!
Mojtaba Rezaeian

7
बहुत अच्छा ! लेकिन मैं फॉर्च्यूनर से पहले डेटाटेबल को क्लोन करने का सुझाव दूंगा। यह DataTable के प्रारूप को कॉपी करता है: newDataTable = oldDataTable.clone ();
Whiplash 18

2
संकेत: आपके डिटैचेबल में कॉलम बनाए जाने चाहिए या यह सही ढंग से नहीं भरेगा।
लोगिक्सोलॉजिस्ट

192

.Net फ्रेमवर्क 3.5+ के लिए

DataTable dt = new DataTable();
DataRow[] dr = dt.Select("Your string");
DataTable dt1 = dr.CopyToDataTable();

लेकिन अगर सरणी में कोई पंक्तियाँ नहीं हैं, तो यह त्रुटियों का कारण बन सकता है जैसे कि स्रोत में कोई DataRows नहीं है । इसलिए, यदि आप इस पद्धति का उपयोग करने का निर्णय लेते हैं, तो आपको CopyToDataTable()यह जानने के लिए सरणी की जांच करनी चाहिए कि उसमें डेटा है या नहीं।

if (dr.Length > 0)
    DataTable dt1 = dr.CopyToDataTable();

MSDN पर उपलब्ध संदर्भ: DataTableExtensions.CopyToDataTable Method (IEnumerable)


1
कहाँ से मिला copyToDataTable()? मैंने इसे .net 2.0 में नहीं पाया
SMUsamaShah

11
यह एक सही उत्तर के रूप में चिह्नित किया जाना चाहिए क्योंकि copyToDataTable()विधि चयनित पंक्तियों के स्तंभों की एक परिपूर्ण प्रतिलिपि बनाता है, जबकि datatable.ImportRow(row)विधि doesn't
Dante

5
यह तरीका अच्छा नहीं है यदि तालिका में पहले से ही पंक्तियाँ हैं क्योंकि यह पहले से ही जो कुछ भी है उसे प्रतिस्थापित करता है। अगर टेबल खाली है तो इसकी शुरुआत ठीक है।
फ्रेंक

5
मैं इस विधि को तब तक पसंद करता हूं जब तक .Net फ़ंक्शन अनुकूलित हो जाते हैं। अपने प्रोजेक्ट में System.Data.DataSetExtensions का संदर्भ जोड़ना न भूलें, ताकि आप खुद से यह पूछने में निराश न हों कि यह तरीका क्यों याद आ रहा है (मेरी तरह)
Broken_Window

संदर्भ में याद रखें System.Data.DataSetExtensions विधानसभा को जोड़ने के लिए
Vagner Gon

12
DataTable dt = new DataTable(); 

DataRow[] dr = (DataTable)dsData.Tables[0].Select("Some Criteria");

dt.Rows.Add(dr);

2
मैंने पहले ही इस तरह की कोशिश की है .. त्रुटि कुछ इस तरह की होती है "इनपुट सारणी इस तालिका में कॉलम की संख्या से अधिक है।"
डेवलपर

जैसा कि जे ने बताया, सुनिश्चित करें कि आपके डेटाटेबल के पास डेटाट्रो सरणी में डेटारोज़ के समान स्कीमा है
मिच गेहूं

1
हां .. मैंने कोशिश की। मैंने Datatable1 = datatable2.Clone () का उपयोग किया; अब यह काम कर रहा है ... धन्यवाद :-)
Developer404

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

1
यह .NET फ्रेमवर्क 4.0 में पोस्ट किए गए नमूने के साथ काम नहीं करता है, न ही "dt" के साथ dstata.tables से क्लोन किया गया है [0]। @ जो का जवाब मेरे उद्देश्यों के लिए काम करना था। नो-क्लोन संस्करण त्रुटि: " Input array is longer than the number of columns in this table."। वर्जन-क्लोन संस्करण त्रुटि के साथ: " Unable to cast object of type 'System.Data.DataRow' to type 'System.IConvertible'.Couldn't store <System.Data.DataRow> in StoreOrder Column. Expected type is Int64." नोट: StoreOrderटेबल स्कीमा का पहला कॉलम है। लगता है यह है कि पहले कॉलम में जाम पूरे DataRow की कोशिश कर रही
ब्रायन वेबस्टर

11

एक अन्य तरीका एक DataView का उपयोग करना है

// Create a DataTable
DataTable table = new DataTable()
...

// Filter and Sort expressions
string expression = "[Birth Year] >= 1983"; 
string sortOrder = "[Birth Year] ASC";

// Create a DataView using the table as its source and the filter and sort expressions
DataView dv = new DataView(table, expression, sortOrder, DataViewRowState.CurrentRows);

// Convert the DataView to a DataTable
DataTable new_table = dv.ToTable("NewTableName");

9

सरल तरीका है:

// dtData is DataTable that contain data
DataTable dt = dtData.Select("Condition=1").CopyToDataTable();

// or existing typed DataTable dt
dt.Merge(dtData.Select("Condition=1").CopyToDataTable());




3

.Net 3.5+ ने DataTableExtensions को जोड़ा, DataTableExtensions.CopyToDataTable मेथड का उपयोग करें

Datarow array के लिए बस .CopyToDataTable () का उपयोग करें और यह वापस लाने योग्य हो जाएगा।

एकल datarow उपयोग के लिए

new DataRow[] { myDataRow }.CopyToDataTable()

2

यहाँ समाधान है। यह ठीक काम करना चाहिए।

DataTable dt = new DataTable();
dt = dsData.Tables[0].Clone();
DataRows[] drResults = dsData.Tables[0].Select("ColName = 'criteria');

foreach(DataRow dr in drResults)
{
    object[] row = dr.ItemArray;
    dt.Rows.Add(row);
} 

1

किसी को भी VB.NET में इसकी आवश्यकता है:

Dim dataRow as DataRow
Dim yourNewDataTable as new datatable
For Each dataRow In yourArray
     yourNewDataTable.ImportRow(dataRow)
Next

1

आप इस तरह System.Linq का उपयोग कर सकते हैं:

if (dataRows != null && dataRows.Length > 0)
{
   dataTable = dataRows.AsEnumerable().CopyToDataTable();
}

1

आपको पहले डेटा टेबल की संरचना को क्लोन करना होगा फिर लूप के लिए पंक्तियों को आयात करना होगा

DataTable dataTable =dtExisting.Clone();
foreach (DataRow row in rowArray) {
   dataTable.ImportRow(row);
}

0
DataTable dataTable = new DataTable();
dataTable = OldDataTable.Tables[0].Clone();
foreach(DataRow dr in RowData.Tables[0].Rows)
{
 DataRow AddNewRow = dataTable.AddNewRow();
 AddNewRow.ItemArray = dr.ItemArray;
 dataTable.Rows.Add(AddNewRow);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.