124

DataRowのクローンを作成する簡単な方法を探しています。その行のスナップショットを取り、それを保存するようなものです。その後、元の行の値は自由に変更できますが、変更されない別の保存済みコピーがまだあります。これは正しい方法ですか?

DataRow Source, Destination;
// Assume we create some columns and fill them with values
Destination.ItemArray = Source.ItemArray;

これは、SnapshotのItemArray参照をSource内の参照を指すように設定するだけですか、それとも実際には別のコピーを作成しますか?代わりにこれを行う必要がありますか?

Destination.ItemArray = Source.ItemArray.Clone();

編集:2番目のコードスニペットが実際にコンパイルされるとは思いません。

4

4 に答える 4

198

ImportRowメソッドを使用して、同じスキーマで行をDataTableからDataTableにコピーできます。

var row = SourceTable.Rows[RowNum];
DestinationTable.ImportRow(row);

アップデート:

あなたの新しい編集で、私は信じます:

var desRow = dataTable.NewRow();
var sourceRow = dataTable.Rows[rowNum];
desRow.ItemArray = sourceRow.ItemArray.Clone() as object[];

動作します

于 2012-08-19T07:54:26.510 に答える
3

注:cuongleのhelfpulの回答にはすべての要素が含まれていますが、ソリューションを合理化して(必要なし.ItemArray)、質問に合わせて再構成することができます。

System.Data.DataRow特定のインスタンスの(分離された)クローンを作成するには、次のようにします。

// Assume that variable `table` contains the source data table.

// Create an auxiliary, empty, column-structure-only clone of the source data table.
var tableAux = table.Clone();
// Note: .Copy(), by contrast, would clone the data rows also.

// Select the data row to clone, e.g. the 2nd one:
var row = table.Rows[1];

// Import the data row of interest into the aux. table.
// This creates a *shallow clone* of it.
// Note: If you'll be *reusing* the aux. table for single-row cloning later, call
//       tableAux.Clear() first.
tableAux.ImportRow(row);

// Extract the cloned row from the aux. table:
var rowClone = tableAux.Rows[0];

注:浅いクローン作成が実行されます。これは、値型インスタンスである列値でそのまま機能しますが、参照型インスタンスを含む列値の独立したコピーを作成するには、さらに多くの作業が必要になります(このような独立したコピーを作成できるとは限りません。 )。

于 2019-11-11T16:38:07.290 に答える
1

必要な行は一部だけなので、DataTable全体をコピーとして保持したくないようです。テーブルの選択で指定できる基準がある場合は、それらの行だけをDataRowの追加のバックアップ配列にコピーできます。

DataRow[] rows = sourceTable.Select("searchColumn = value");

.Select()関数にはいくつかのオプションがあり、これはたとえばSQLとして読み取ることができます

SELECT * FROM sourceTable WHERE searchColumn = value;

次に、上記のように必要な行をインポートできます。

targetTable.ImportRows(rows[n])

...任意の有効なnに対して。ただし、各テーブルの列は同じである必要があります。

ImportRowについて知っておくべきことは、主キーを使用すると実行時にエラーが発生することです。

最初に、主キーがないために失敗した行がすでに存在するかどうかを確認したかったのですが、その後、チェックは常に失敗しました。最終的に、既存の行を完全にクリアして、必要な行を再度インポートすることにしました。

2番目の問題は、何が起こるかを理解するのに役立ちました。インポート機能を使用する方法は、1つの列に交換されたエントリを持つ行を複製することです。私はそれが常に変化し、それがまだ配列内の行への参照であることに気づきました。最初にオリジナルをインポートしてから、必要なエントリを変更する必要がありました。

このリファレンスでは、実際に2倍になったため、最初に行をインポートしようとしたときに表示された主キーエラーについても説明しています。

于 2020-02-24T15:10:02.000 に答える
-3

ただし、新しいテーブルで新しい行にアクセスできるようにするには、テーブルを閉じる必要があります。

DataTable destination = new DataTable(source.TableName);
destination = source.Clone();
DataRow sourceRow = source.Rows[0];
destination.ImportRow(sourceRow);
于 2015-04-04T19:03:02.220 に答える