วิธีง่ายๆในการแปลงอาร์เรย์ datarow เป็น datatable


คำตอบ:


92

ทำไมไม่ทำซ้ำผ่านอาร์เรย์ DataRow ของคุณและเพิ่ม (โดยใช้ DataRow.ImportRow หากจำเป็นเพื่อรับสำเนา DataRow) สิ่งที่ต้องการ:

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

ตรวจสอบให้แน่ใจว่า dataTable ของคุณมีสคีมาเดียวกันกับ DataRows ในอาร์เรย์ DataRow ของคุณ


1
เทคนิคนี้มีประโยชน์หากคุณได้รับข้อความแสดงข้อผิดพลาด "กำลังใช้แหล่งข้อมูลที่ไม่ถูกต้องสำหรับ MyControl แหล่งข้อมูลที่ถูกต้องต้องใช้ IListSource หรือ IEnumerable" เมื่อพยายามผูก DataRow โดยตรงกับคุณสมบัติ DataSource ของตัวควบคุม วิธีการทำมีดังนี้DataTable dataTable = new DataTable(); dataTable.ImportRow(dataRow); MyControl.DataSource = dataTable;
humbads

+1 ฉันชอบสิ่งนี้มากกว่าrowArray.CopyToDataTable();เพราะสิ่งนี้เก็บสคีมาของตารางและไม่ได้แทนที่ด้วยวัตถุตารางใหม่!
Mojtaba Rezaeian

7
ดีมาก ! แต่ฉันอยากจะแนะนำให้โคลน DataTable ก่อน foreach มันคัดลอกรูปแบบของ DataTable: newDataTable = oldDataTable.clone ();
Whiplash

2
คำแนะนำ: datatable ของคุณต้องมีการสร้างคอลัมน์มิฉะนั้นจะกรอกข้อมูลไม่ถูกต้อง
logixologist

193

สำหรับ. Net Framework 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)วิธีการไม่
Dante

5
วิธีนี้ไม่ดีถ้าตารางมีแถวอยู่แล้วเพราะแทนที่สิ่งที่มีอยู่แล้ว ถ้าตารางว่างเพื่อเริ่มต้นก็ใช้ได้
Franck

5
ฉันชอบวิธีนี้ตราบใดที่ฟังก์ชัน. Net ได้รับการปรับให้เหมาะสม อย่าลืมเพิ่มการอ้างอิงไปยัง System.Data.DataSetExtensions ในโปรเจ็กต์ของคุณเพื่อที่คุณจะได้ไม่หงุดหงิดถามตัวเองว่าทำไมวิธีนี้ถึงหายไป (เหมือนฉัน)
Broken_Window

อย่าลืมเพิ่ม System.Data.DataSetExtensions Assembly ในการอ้างอิง
Vagner Gon

12
DataTable dt = new DataTable(); 

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

dt.Rows.Add(dr);

2
ฉันลองแล้ว .. เกิดข้อผิดพลาดบางอย่างเช่น "อาร์เรย์อินพุตยาวเกินจำนวนคอลัมน์ในตารางนี้"
Developer404

ดังที่ Jay กล่าวไว้ตรวจสอบให้แน่ใจว่า dataTable ของคุณมีสคีมาเดียวกันกับ DataRows ในอาร์เรย์ DataRow ของคุณ
Mitch Wheat

1
ใช่ .. ฉันพยายามแล้ว ฉันใช้ Datatable1 = datatable2.Clone (); ตอนนี้ใช้งานได้แล้ว ... ขอบคุณ :-)
Developer404

ฉันลองสิ่งนี้กับอาร์เรย์แถวและไม่ได้ผล สำหรับแต่ละแถวในอาร์เรย์ของแถวฉันสร้างแถวใหม่คัดลอกคุณสมบัติ ItemArray จากแถวเดิมจากนั้นเพิ่มทำงาน
Steve

1
ดูเหมือนว่าจะใช้ไม่ได้ใน. NET Framework 4.0 กับตัวอย่างตามที่โพสต์และ "dt" ถูกโคลนจาก dstata.tables [0] คำตอบของ @ joe จบลงด้วยการทำงานเพื่อจุดประสงค์ของฉัน ข้อผิดพลาด No-Clone Version: " Input array is longer than the number of columns in this table." With-Clone Version Error: " 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 ทั้งหมดลงในคอลัมน์แรกนั้น
Brian Webster

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");

10

วิธีง่ายๆคือ:

// 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());




4

.Net 3.5+ เพิ่ม DataTableExtensions ใช้เมธอด DataTableExtensions.CopyToDataTable

สำหรับอาร์เรย์ datarow เพียงใช้. 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

คุณสามารถใช้ 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);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.