Datarow dizisini veriye dönüştürmenin basit yolu


Yanıtlar:


92

Neden DataRow dizinizi yinelemiyorsunuz ve (gerekirse DataRow'un bir kopyasını almak için DataRow.ImportRow kullanarak) aşağıdakilere benzer bir şey eklemiyorsunuz:

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

DataTable'ınızın DataRow dizinizdeki DataRows ile aynı şemaya sahip olduğundan emin olun.


1
Bir DataRow'u bir denetimin DataSource özelliğine doğrudan bağlamaya çalışırken "MyControl için geçersiz bir veri kaynağı kullanılıyor. Geçerli bir veri kaynağı IListSource veya IEnumerable'ı uygulamalıdır" hata iletisini alırsanız bu teknik yararlıdır. İşte nasıl yapılacağı:DataTable dataTable = new DataTable(); dataTable.ImportRow(dataRow); MyControl.DataSource = dataTable;
humbads

+1 Bunu rowArray.CopyToDataTable();tablo şemasını koruduğu ve onu yeni tablo nesnesiyle değiştirmediği için tercih ederim !
Mojtaba Rezaeian

7
Çok iyi ! Ama DataTable'ı foreach'den önce klonlamayı öneririm. DataTable'ın biçimini kopyalar: newDataTable = oldDataTable.clone ();
Whiplash

2
İpucu: Datatable'ınız oluşturulmuş sütunlara sahip olmalıdır, aksi takdirde doğru doldurulmayacaktır.
logixologist

193

.Net Framework 3.5+ için

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

Ancak dizide satır yoksa, Kaynak DataRows içermiyor gibi hatalara neden olabilir . Bu nedenle, bu yöntemi kullanmaya karar verirseniz CopyToDataTable(), diziyi veri satırına sahip olup olmadığını anlamak için kontrol etmelisiniz.

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

MSDN'de mevcut referans: DataTableExtensions.CopyToDataTable Method (IEnumerable)


1
Gönderen aldın nerede copyToDataTable()? .Net 2.0'da bulamadım
SMUsamaShah

11
Beri doğru cevap olarak bu işaretlenmesi gereken copyToDataTable()yöntemin iken, seçilen satırların sütun mükemmel bir kopyasını oluşturur datatable.ImportRow(row)yöntem doesnt
Dante

5
Tabloda zaten satırlar varsa bu yöntem iyi değildir, çünkü bu zaten var olanı değiştirir. Başlamak için tablo boşsa sorun değil.
Franck

5
.Net fonksiyonları optimize edildiği sürece bu yöntemi tercih ederim. Projenize System.Data.DataSetExtensions referansını eklemeyi unutmayın, böylece kendinize bu yöntemin neden eksik olduğunu
sormaktan sıkılmayacaksınız

Referanslar'da System.Data.DataSetExtensions Assembly'yi eklemeyi unutmayın
Vagner Gon

12
DataTable dt = new DataTable(); 

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

dt.Rows.Add(dr);

2
Zaten böyle denedim .. "Giriş dizisi bu tablodaki sütun sayısından daha uzun" gibi bir hata oluştu.
Geliştirici404

Jay'in belirttiği gibi, dataTable'ınızın DataRow dizinizdeki DataRows ile aynı şemaya sahip olduğundan emin olun
Mitch Wheat

1
Evet .. denedim. Datatable1 = datatable2.Clone () kullandım; Şimdi çalışıyor ... Teşekkür ederim :-)
Developer404

Bunu bir satır dizisi ile denedim ve işe yaramadı. Satır dizisindeki her satır için yeni bir satır oluşturdum, orijinal satırdan ItemArray özelliğini kopyaladım ve ardından ekleme çalıştı.
Steve

1
Bu, gönderildiği gibi örnekle .NET Framework 4.0'da veya dstata.tables [0] 'dan klonlanmış "dt" ile çalışmıyor gibi görünüyor. @ joe'nin cevabı benim amaçlarım için işe yaradı. Klon Sürümü Yok hatası: " 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." Not: StoreOrdertablo şemasındaki ilk sütundur. Görünüşe göre tüm verileri ilk sütuna sıkıştırmaya çalışıyor
Brian Webster

11

Başka bir yol da DataView kullanmaktır

// 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

Basit yol:

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

5
DataTable dt = myDataRowCollection.CopyToDataTable<DataRow>();

5
DataTable dt = new DataTable();
foreach (DataRow dr in drResults)
{ 
    dt.ImportRow(dr);
}   

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

4

.Net 3.5+ DataTableExtensions ekledi, DataTableExtensions.CopyToDataTable Yöntemini kullanın

Datarow dizisi için sadece .CopyToDataTable () kullanın ve datatable döndürecektir.

Tek datarow kullanımı için

new DataRow[] { myDataRow }.CopyToDataTable()

2

İşte çözüm. İyi çalışmalı.

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'te herkesin buna ihtiyacı olması durumunda:

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

1

System.Linq'i şu şekilde kullanabilirsiniz:

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

1

Önce Veri tablosunun yapısını klonlamanız, ardından for döngüsünü kullanarak satırları içe aktarmanız gerekir.

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);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.