Comment puis-je copier 1 colonne de données de 1 table de données sur un nouveau jeu de données. Lorsque j'essaie de le faire, je reçois la colonne d'erreur 'xxx' appartient déjà à un autre DataTable.? merci d'avance p> p>
6 Réponses :
Vous ne pouvez pas copier un DataColumn. (Les datacolumns sont très étroitement couplés à leurs tables) p>
Au lieu de cela, vous pouvez ajouter une nouvelle colonne avec le même nom et le même type de données. P>
Vous recherchez peut-être datatable.clone () code>, qui créera une copie structuelle d'une table entière. (Avec le même schéma, mais pas de données) p>
Vous ne pouvez pas copier des datacolumns. Ce que vous aurez besoin de faire est de créer un nouveau DataColumn dans le nouveau type de données avec le même type de données que dans la colonne de l'ancienne DataTable, puis vous devez exécuter une boucle pour apporter toutes les données de l'ancien DataTable au nouveau. Datatable.
Voir le code suivant. Cela suppose que les datables ont exactement le même nombre de lignes. p> p> De plus, si les données que vous copiez sont des types de référence et non des types de valeur que vous voudrez peut-être voir si une méthode .clone () est disponible pour le type ou en faites un vous-même. Juste faire 'ceci = que' dans la boucle pour ne fonctionnera pas sur des types de référence. P> p>
@Lane merci..mais je pense que cette approche sera très coûteuse car j'aurai peut-être besoin de copier plus d'une colonne et des lignes peuvent dépasser 1 million ..
Vous pouvez copier des données dans plusieurs colonnes de la même boucle. C'est le seul moyen de le faire.
D'accord. C'est le seul moyen de le faire, si vous copiez une colonne d'une donnée sur une autre donnée. Ce n'est peut-être pas aussi cher que vous le pensez. Essayez-le et voyez.
@Slaks et @lane - vous mentez! ;-) Vous pouvez le faire avec une date de données et un dataColumn calculé aussi.
@XCALIBURP: Non si vous souhaitez ultérieurement modifier les valeurs dans l'une des tables. En outre, cela nécessite une clé commune.
@Slaks - la chose essentielle commune est vraie, mais j'essaie de penser à un exemple où j'ai voulu copier une colonne de données d'une donnée à une autre et que je ne fais pas une sorte de jointure (comme se joindre à un statut de statut à la Statubutable pour obtenir le nom de statut). Je ne peux pas penser à un. Donc, bien que votre point se tient, je pense que cela pourrait être un peu d'un homme de paille.
Juste une pensée, vos datables sont-ils tous deux dans le même jeu de données?
Si tel est le cas, vous pouvez créer un nommé DataRelation entre les colonnes de deux tables (pensez à la clé étrangère). P>
alors vous pouvez ajouter un DataColumn calculé à votre table qui a son Expression a > Propriété définie sur "Enfant (RelationName) .Columnname" ou "Parent (RelationName) .Columnname" En fonction de la direction de la relation. P> Cela vous donnera le même effet que de copier la colonne, mais je crois que ça ne l'évalue que paresseusement. Donc, peut-être que cela vous donnera ce dont vous avez besoin. P> Il y a un exemple Ici de la façon dont cela fonctionne. L'exemple utilise la fonction globale somme em>, mais il vous suffit de référencer le nom de la colonne et de la dupliquer dans votre DataTable P> myDataSet.Relations.Add(
"Orders2OrderLines",
myDataSet.Tables["Orders"].Columns["OrderID"],
myDataSet.Tables["OrderLines"].Columns["OrderID"]);
ordersTable.Columns.Add("OrderTotal", typeof(decimal), "Sum(Child(Orders2OrderLines).ExtendedPrice)");
Je suis à peu près sûr que cela n'évaluera pas paresseusement. En outre, les valeurs des colonnes seront liées de manière permanente, ce qui peut être ce qu'il souhaite.
@Slaks - Vous avez raison sur le lien - cela peut être bon ou mauvais en fonction de vos besoins. La raison pour laquelle je pense que c'est paresseux est à cause de la liaison. J'imagine qu'avec l'interne, c'est juste un délégué qui lie les données dans la table d'origine - elle n'a donc pas eu lieu. J'aimerais savoir si j'avais mal que je n'ai jamais testé ça ...
Merci ..mais mes fichiers datables dans le même jeu de données.
@Ananth - était-ce une faute de frappe? Ou avez-vous dit que vos tables sont toutes deux dans le même jeu de données? S'ils sont, alors cela fonctionnera. S'ils ne sont pas alors ce n'est pas une solution pour vous. Bonne chance.
Pas de boucle requise, référez-le, espérons que cela devrait résoudre votre problème ...
DataTable dt = new DataTable(); //fill the dt here DataTable dt2 = new DataTable(); string[] strCols = {"Column Name to copy"}; dt2 = dt.DefaultView.ToTable("newTableName", false, strCols);
Créer un nouveau jeu de données n'est pas ce qui a été posé dans cette question. (En outre, le deuxième appel de constructeur est superflu.)
Le problème est causé par le C # ne peut pas réutiliser l'instance d'objet créée et l'utilise sur les fichiers de données multiples. Pour cela, il est nécessaire de créer un nouvel objet Datacolumn pour chaque itération de boucle. espère que c'est de l'aide ... p> p>
J'ai utilisé ci-dessous pour fusionner deux tables en utilisant principalement Linq et ne boucle que par les rangées à la fin. Je ne l'appellerais pas jolie mais ça marche. Utilisation de la jointure pour empêcher certaines des hypothèses énumérées ci-dessus.
DataTable tableOne = getTableOne(); DataTable tableTwo = getTableTwo(); var oneColumns = tableOne.Columns.Cast<DataColumn>() .Select(p => new Column(p.ColumnName, DataType)) .ToArray(); var twoColumns = tableTwo.Columns.Cast<DataColumn>() .Select(p => new DataColumn(p.ColumnName, p.DataType)) .ToArray(); var matches = (from a in tableOne.AsEnumerable() join b in tableTwo.AsEnumerable() on a["column_name"] equals b["column_name"] select a.ItemArray.Concat(b.ItemArray)).ToArray(); DataTable merged = new DataTable(); merged.Columns.AddRange(oneColumns); merged.Columns.AddRange(twoColumns); foreach (var m in matches) { merged.Rows.Add(m.ToArray()); }
Je ne pense pas qu'ils veulent fusionner une table avec une autre, on dirait qu'ils veulent simplement semer une table avec une seule colonne de la première.
Si vous postez le code ou XML, Veuillez mettre en surbrillance ces lignes dans l'éditeur de texte et cliquez sur le bouton "Code" (101 010) dans la barre d'outils de l'éditeur sur le format bien et la syntaxe en surbrillance!
Dupliquer possible de Comment pouvons-nous copier les données du DataColumn of the DataTable vers une autre DataTable?