Cách đơn giản để chuyển đổi mảng dữ liệu thành dữ liệu


Câu trả lời:


91

Tại sao không lặp lại qua mảng DataRow của bạn và thêm (sử dụng DataRow.ImportRow, nếu cần, để nhận bản sao của DataRow), đại loại như:

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

Đảm bảo rằng dataTable của bạn có cùng một lược đồ với DataRows trong mảng DataRow của bạn.


1
Kỹ thuật này hữu ích nếu bạn nhận được thông báo lỗi "Nguồn dữ liệu không hợp lệ đang được sử dụng cho MyControl. Nguồn dữ liệu hợp lệ phải triển khai IListSource hoặc IEnumerable" khi cố gắng liên kết trực tiếp một DataRow với thuộc tính DataSource của một điều khiển. Dưới đây là làm thế nào để làm điều đó:DataTable dataTable = new DataTable(); dataTable.ImportRow(dataRow); MyControl.DataSource = dataTable;
humbads

+1 Tôi thích điều này hơn là rowArray.CopyToDataTable();vì điều này giữ lược đồ bảng và không thay thế nó bằng đối tượng bảng mới!
Mojtaba Rezaeian

7
Rất tốt ! Nhưng tôi sẽ Đề nghị sao chép DataTable trước khi tiến hành. Nó sao chép định dạng của DataTable: newDataTable = oldDataTable.clone ();
Whiplash

2
Gợi ý: Dữ liệu của bạn phải có các cột được tạo nếu không nó sẽ không điền chính xác.
logixologist

192

Đối với .Net Framework 3.5+

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

Nhưng nếu không có hàng nào trong mảng, nó có thể gây ra các lỗi như Nguồn không chứa DataRows . Do đó, nếu bạn quyết định sử dụng phương pháp này CopyToDataTable(), bạn nên kiểm tra mảng để biết nó có datarows hay không.

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

Tham khảo có sẵn tại MSDN: Phương pháp DataTableExtensions.CopyToDataTable (IEnumerable)


1
Bạn lấy từ copyToDataTable()đâu? Tôi không tìm thấy nó trong .net 2.0
SMUsamaShah

11
Điều này sẽ được đánh dấu là một câu trả lời đúng từ copyToDataTable()phương pháp tạo ra một bản sao hoàn hảo của các cột các hàng đã chọn, trong khi datatable.ImportRow(row)phương pháp doesnt
Dante

5
phương pháp này không tốt nếu bảng đã có các hàng trong đó vì nó thay thế bất cứ thứ gì đã có ở đó. Nếu bảng trống để bắt đầu với nó thì tốt.
Franck

5
Tôi thích phương pháp này miễn là các chức năng .Net được tối ưu hóa. Đừng quên để thêm tài liệu tham khảo để System.Data.DataSetExtensions trong dự án của bạn, do đó bạn sẽ không nhận được frustated tự hỏi tại sao phương pháp này là mất tích (như tôi)
Broken_Window

Hãy nhớ thêm System.Data.DataSetExtensions hội thông qua vào References
Vagner Gòn

12
DataTable dt = new DataTable(); 

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

dt.Rows.Add(dr);

2
Tôi đã thử như vậy rồi .. Lỗi xảy ra như "Mảng đầu vào dài hơn số cột trong bảng này."
Nhà phát triển

AS Jay chỉ ra, hãy chắc chắn DataTable của bạn có schema giống như DataRows trong mảng DataRow của bạn
Mitch Wheat

1
Vâng .. tôi đã cố gắng. Tôi đã sử dụng Datatable1 = datatable2.Clone (); Bây giờ nó đang hoạt động ... Cảm ơn bạn :-)
Nhà phát triển

Tôi đã thử điều này với một mảng hàng và nó không hoạt động. Đối với mỗi hàng trong mảng hàng, tôi tạo một hàng mới, sao chép thuộc tính ItemArray từ hàng ban đầu và sau đó thêm vào hoạt động.
Steve

1
Điều này dường như không hoạt động trong .NET Framework 4.0 với mẫu như đã đăng, cũng như "dt" được sao chép từ dstata.tables [0]. Câu trả lời của @ joe cuối cùng đã hoạt động cho mục đích của tôi. Lỗi phiên bản không sao chép: " Input array is longer than the number of columns in this table.". Lỗi phiên bản với bản sao: " 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." Lưu ý: StoreOrderlà cột đầu tiên trong lược đồ bảng. Dường như nó đang cố gắng để mứt toàn bộ DataRow vào cột đầu tiên
Brian Webster

11

Một cách khác là sử dụng 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

Cách đơn giản là:

// 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
DataTable dt = myDataRowCollection.CopyToDataTable<DataRow>();

4
DataTable Assetdaterow =
    (
        from s in dtResourceTable.AsEnumerable()
        where s.Field<DateTime>("Date") == Convert.ToDateTime(AssetDate)
        select s
    ).CopyToDataTable();

3

.Net 3.5+ đã thêm DataTableExtensions, sử dụng DataTableExtensions.CopyToDataTable Method

Đối với mảng datarow chỉ cần sử dụng .CopyToDataTable () và nó sẽ trả về dữ liệu.

Đối với sử dụng dữ liệu đơn lẻ

new DataRow[] { myDataRow }.CopyToDataTable()

2

Đây là giải pháp. Nó sẽ hoạt động tốt.

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

Trong trường hợp bất kỳ ai cần nó trong VB.NET:

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

1

Bạn có thể sử dụng System.Linq như thế này:

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

1

Bạn cần sao chép cấu trúc của bảng Dữ liệu trước rồi nhập các hàng bằng vòng lặp for

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);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.