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

99

Je souhaite convertir un DataRowtableau en DataTable... Quelle est la manière la plus simple de procéder?

Développeur404
la source

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.

Jay Riggs
la source
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)

Joe
la source
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);
Blé Mitch
la source
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");
ilans
la source
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());
Zolfaghari
la source
5
DataTable dt = myDataRowCollection.CopyToDataTable<DataRow>();
Miriam
la source
5
DataTable dt = new DataTable();
foreach (DataRow dr in drResults)
{ 
    dt.ImportRow(dr);
}   
utilisateur1036202
la source
5
DataTable Assetdaterow =
    (
        from s in dtResourceTable.AsEnumerable()
        where s.Field<DateTime>("Date") == Convert.ToDateTime(AssetDate)
        select s
    ).CopyToDataTable();
Rajenthiran T
la source
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()
Haseeb Mukhtar
la source
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);
} 
zaib shah
la source
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
logixologue
la source
1

Vous pouvez utiliser System.Linq comme ceci:

if (dataRows != null && dataRows.Length > 0)
{
   dataTable = dataRows.AsEnumerable().CopyToDataTable();
}
Andrés
la source
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);
}
Awais Shabir
la source
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);
}
AVINASH DUBEY
la source