Un moyen simple de convertir un tableau de flux de données en datatable


Réponses:


92

Pourquoi ne pas parcourir votre tableau DataRow et ajouter (en utilisant DataRow.ImportRow, si nécessaire, pour obtenir une copie de DataRow), quelque chose comme:

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

Assurez-vous que votre dataTable a le même schéma que les DataRows de votre tableau DataRow.


1
Cette technique est utile si vous obtenez le message d'erreur «Une source de données non valide est utilisée pour MyControl. Une source de données valide doit implémenter IListSource ou IEnumerable» lorsque vous essayez de lier un DataRow directement à la propriété DataSource d'un contrôle. Voici comment faire:DataTable dataTable = new DataTable(); dataTable.ImportRow(dataRow); MyControl.DataSource = dataTable;
humbads

+1 Je préfère cela plutôt que rowArray.CopyToDataTable();parce que cela conserve le schéma de la table et ne le remplace pas par un nouvel objet de table!
Mojtaba Rezaeian

7
Très bien ! Mais je suggérerais de cloner le DataTable avant le foreach. Il copie le format du DataTable: newDataTable = oldDataTable.clone ();
Whiplash

2
Astuce: votre table de données doit avoir des colonnes créées ou elle ne se remplira pas correctement.
logixologist

193

Pour .Net Framework 3.5+

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

Mais s'il n'y a pas de lignes dans le tableau, cela peut provoquer des erreurs telles que La source ne contient pas de DataRows . Par conséquent, si vous décidez d'utiliser cette méthode CopyToDataTable(), vous devez vérifier le tableau pour savoir qu'il a des lignes de données ou non.

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

Référence disponible sur MSDN: DataTableExtensions.CopyToDataTable, méthode (IEnumerable)


1
D'où viens-tu copyToDataTable()? Je ne l'ai pas trouvé dans .net 2.0
SMUsamaShah

11
Cela devrait être marqué comme une bonne réponse car la copyToDataTable()méthode crée une copie parfaite des colonnes des lignes sélectionnées, tandis que la datatable.ImportRow(row)méthode ne le fait pas
Dante

5
cette méthode n'est pas bonne si la table contient déjà des lignes car elle remplace tout ce qui s'y trouve déjà. Si la table est vide pour commencer, tout va bien.
Franck

5
Je préfère cette méthode tant que les fonctions .Net sont optimisées. N'oubliez pas d'ajouter la référence à System.Data.DataSetExtensions dans votre projet afin que vous ne soyez pas frustré de vous demander pourquoi cette méthode est manquante (comme moi)
Broken_Window

N'oubliez pas d'ajouter l'assembly System.Data.DataSetExtensions dans les références
Vagner Gon

12
DataTable dt = new DataTable(); 

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

dt.Rows.Add(dr);

2
J'ai déjà essayé comme ça .. Une erreur se produit quelque chose comme "Le tableau d'entrée est plus long que le nombre de colonnes dans ce tableau."
Developer404

Comme Jay l'a souligné, assurez-vous que votre dataTable a le même schéma que les DataRows de votre tableau DataRow
Mitch Wheat

1
Oui ... j'ai essayé. J'ai utilisé Datatable1 = datatable2.Clone (); Maintenant ça marche ... Merci :-)
Developer404

J'ai essayé cela avec un tableau de lignes et cela n'a pas fonctionné. Pour chaque ligne du tableau de lignes, j'ai créé une nouvelle ligne, copié la propriété ItemArray de la ligne d'origine, puis l'ajout a fonctionné.
Steve

1
Cela ne semble pas fonctionner dans .NET Framework 4.0 avec l'exemple tel que publié, ni avec "dt" étant cloné à partir de dstata.tables [0]. La réponse de @ joe a fini par fonctionner pour mes besoins. Erreur de version sans clonage: " Input array is longer than the number of columns in this table.". Erreur de version With-Clone: ​​" 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." Remarque: StoreOrderest la première colonne du schéma de table. Il semble qu'il essaie de brouiller tout le flux de données dans cette première colonne
Brian Webster

11

Une autre façon consiste à utiliser un 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

Un moyen simple est:

// 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 Assetdaterow =
    (
        from s in dtResourceTable.AsEnumerable()
        where s.Field<DateTime>("Date") == Convert.ToDateTime(AssetDate)
        select s
    ).CopyToDataTable();

3

.Net 3.5+ a ajouté DataTableExtensions, utilisez la méthode DataTableExtensions.CopyToDataTable

Pour le tableau datarow, utilisez simplement .CopyToDataTable () et il retournera datable.

Pour une utilisation unique de flux de données

new DataRow[] { myDataRow }.CopyToDataTable()

2

Voici la solution. Cela devrait fonctionner correctement.

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

Incase quiconque en a besoin dans VB.NET:

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

1

Vous pouvez utiliser System.Linq comme ceci:

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

1

Vous devez d'abord cloner la structure de la table de données, puis importer des lignes à l'aide de la boucle 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);
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.