C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

データの移動方法

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■89204 / inTopicNo.1)  データの移動方法
  
□投稿者/ 夜叉丸 (139回)-(2018/11/07(Wed) 14:44:53)

分類:[.NET 全般] 

基本的なことですみません。

DataTable から派生させた
class DataTableEx : DataTable を作ったときに

dte に dt のデータを移したいので

DataTable dt;
DataTableEx dte = (DataTableEx)dt;

だと「キャストできません」のエラーが出ます。
どうすればよいのでしょうか?

引用返信 編集キー/
■89205 / inTopicNo.2)  Re[1]: データの移動方法
□投稿者/ 774RR (645回)-(2018/11/07(Wed) 15:08:07)
DataTableEx に DataTable の値を移行するためには DataTableEx の拡張メンバをどうすればよいのかを
ソースコード上明記しないと意味がないわけだけど、その意味で単にキャストしても無駄っす。
(コンパイラがエラーにしてるのはスーパークラス→サブクラスの変換ができないためだが)

その辺を考慮の上「どうすればよいのか」は自分で決める必要がある。
引用返信 編集キー/
■89206 / inTopicNo.3)  Re[1]: データの移動方法
□投稿者/ ムムム (1回)-(2018/11/07(Wed) 15:08:55)
2018/11/07(Wed) 15:09:57 編集(投稿者)

(誤字修正しました)
dtはDataTableExではないので、それは無理です。
DataTableExクラスに、基底クラスDataTableのクローンを作成するメソッドを用意してはどうでしょうか。

引用返信 編集キー/
■89207 / inTopicNo.4)  Re[1]: データの移動方法
□投稿者/ shu (1151回)-(2018/11/07(Wed) 15:16:58)
No89204 (夜叉丸 さん) に返信

同じColumn情報を作成して
1行づつImportRowする必要があると思います。

DataTableExの中がどのようになっているかによると
思いますが、場合によっては派生クラスにしない方が
よいかもしれません。
引用返信 編集キー/
■89208 / inTopicNo.5)  Re[1]: データの移動方法
□投稿者/ 魔界の仮面弁士 (1923回)-(2018/11/07(Wed) 15:44:01)
No89204 (夜叉丸 さん) に返信
> DataTable dt;
> DataTableEx dte = (DataTableEx)dt;

// これは NG
DataTable dt = new DataTable();
DataTableEx dte = (DataTableEx)dt;

// これは OK(ただのキャストであり、インポートではない)
DataTable dt = new DataTableEx();
DataTableEx dte = (DataTableEx)dt;


> dte に dt のデータを移したいので
だとしたら、
 DataTableEx dte = new DataTableEx();
 dte.Merge(dt, true, MissingSchemaAction.AddWithKey);
とか。Merge の引数指定は適宜調整してください。
引用返信 編集キー/
■89209 / inTopicNo.6)  Re[2]: データの移動方法
□投稿者/ PANG2 (239回)-(2018/11/07(Wed) 15:59:35)
Xmlシリアライズによる移行

DataTable dt = new DataTable("mytable");
dt.Columns.Add("key", typeof(int));
dt.Columns.Add("value", typeof(string));
dt.PrimaryKey = new[] { dt.Columns["Key"] };
dt.Rows.Add(1, "A");
dt.Rows.Add(2, "B");
dt.AcceptChanges();

DataTableEx dte = new DataTableEx();

using (MemoryStream ms = new MemoryStream()) {
dt.WriteXml(ms, XmlWriteMode.WriteSchema);
ms.Position = 0;
dte.ReadXml(ms);
}
引用返信 編集キー/
■89210 / inTopicNo.7)  Re[1]: データの移動方法
□投稿者/ あみい (1回)-(2018/11/08(Thu) 10:23:19)
そもそもキャストしてもデータはコピーされません。

参照元が同じなので、dteのデータを変更したらdtのデータも変わります。

DataTableExはDataTableの派生とのことですので、MergeメソッドもOverrideして、

dte.Merge(dt);

と書けるようにしておくとかっこいいのではないでしょうか。
引用返信 編集キー/
■89211 / inTopicNo.8)  Re[1]: データの移動方法
□投稿者/ 魔界の仮面弁士 (1924回)-(2018/11/08(Thu) 10:44:21)
2018/11/08(Thu) 11:05:00 編集(投稿者)

No89204 (夜叉丸 さん) に返信
> データの移動方法
> dte に dt のデータを移したいので

「移」ということなので、
Copy ではなく、Move したいという意味にもとれますが、
その場合は 全件 Merge 後に、元データを Clear すれば良さそう。


あと気になるとすると、このあたり。

(1) dte と dt で列定義が異なっていた場合にどうするのか

→ dte 側に列が不足していた場合、その列のデータを捨てるのか、
 列を自動追加するのか、それとも例外とするのか
→ dte 側の列が dt よりも多かった場合、
 過剰列のデータを DBNull で補うのか、それとも例外とするのか
→ dt と dte とで列の型や制約に違いがあった場合、どうするのか


(2) 各行(DataRow)の RowState プロパティを維持するのか否か

→ Deleted な行を dte に取り込むか否か
→ Modified な行を、Modified のままとするか、Unchanged にするか
→ Added な行を、Added のままとするか、Unchanged にするか




No89204 (夜叉丸 さん) に返信
> DataTable から派生させた
> class DataTableEx : DataTable を作ったときに

ちなみに、自動実装される型付 DataSet の場合には、
 class DataTableEx : DataTable
として生成される実装と、
 class DataTableEx : TypedTableBase<DataTableExRow>
として生成される実装とがあります。


利用者視点では後者の方が便利ですが(LINQ しやすい)、
テーブルクラスだけでなく行クラスも用意しなければならない分、
手動実装する場合は、ちょっと手間かも。(自動実装なら良いのですが)
引用返信 編集キー/
■89228 / inTopicNo.9)  Re[1]: データの移動方法
□投稿者/ にゃるら (51回)-(2018/11/09(Fri) 09:40:12)
No89204 (夜叉丸 さん) に返信
> 基本的なことですみません。
>
> DataTable から派生させた
> class DataTableEx : DataTable を作ったときに
>
> dte に dt のデータを移したいので
>
> DataTable dt;
> DataTableEx dte = (DataTableEx)dt;
>
> だと「キャストできません」のエラーが出ます。
> どうすればよいのでしょうか?

暗黙的なキャストの実装をDataTableExさんに追加すれば出来るようになるとは思います。

となると、結局は既にみなさんが書かれているようにデータをコピーするような処理を
何かしら自分で書くしかないということだと思います。

暗黙的なキャストは値型でないと違和感がある、ということでしたらコピーコンストラクタ
での実装されてはいかがでしょうか。

引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ