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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.89204 の関連記事表示

<< 0 >>
■89204  データの移動方法
□投稿者/ 夜叉丸 -(2018/11/07(Wed) 14:44:53)

    分類:[.NET 全般] 

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

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

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

    DataTable dt;
    DataTableEx dte = (DataTableEx)dt;

    だと「キャストできません」のエラーが出ます。
    どうすればよいのでしょうか?
親記事 /過去ログ153より / 関連記事表示
削除チェック/

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

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

    DataTableExの中がどのようになっているかによると
    思いますが、場合によっては派生クラスにしない方が
    よいかもしれません。
記事No.89204 のレス /過去ログ153より / 関連記事表示
削除チェック/

■89206  Re[1]: データの移動方法
□投稿者/ ムムム -(2018/11/07(Wed) 15:08:55)
    2018/11/07(Wed) 15:09:57 編集(投稿者)

    (誤字修正しました)
    dtはDataTableExではないので、それは無理です。
    DataTableExクラスに、基底クラスDataTableのクローンを作成するメソッドを用意してはどうでしょうか。
記事No.89204 のレス /過去ログ153より / 関連記事表示
削除チェック/

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

    その辺を考慮の上「どうすればよいのか」は自分で決める必要がある。
記事No.89204 のレス /過去ログ153より / 関連記事表示
削除チェック/

■89208  Re[1]: データの移動方法
□投稿者/ 魔界の仮面弁士 -(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 の引数指定は適宜調整してください。
記事No.89204 のレス /過去ログ153より / 関連記事表示
削除チェック/

■89209  Re[2]: データの移動方法
□投稿者/ PANG2 -(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);
    }
記事No.89204 のレス /過去ログ153より / 関連記事表示
削除チェック/

■89210  Re[1]: データの移動方法
□投稿者/ あみい -(2018/11/08(Thu) 10:23:19)
    そもそもキャストしてもデータはコピーされません。

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

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

    dte.Merge(dt);

    と書けるようにしておくとかっこいいのではないでしょうか。
記事No.89204 のレス /過去ログ153より / 関連記事表示
削除チェック/

■89211  Re[1]: データの移動方法
□投稿者/ 魔界の仮面弁士 -(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 しやすい)、
    テーブルクラスだけでなく行クラスも用意しなければならない分、
    手動実装する場合は、ちょっと手間かも。(自動実装なら良いのですが)
記事No.89204 のレス /過去ログ153より / 関連記事表示
削除チェック/

■89228  Re[1]: データの移動方法
□投稿者/ にゃるら -(2018/11/09(Fri) 09:40:12)
    No89204 (夜叉丸 さん) に返信
    > 基本的なことですみません。
    >
    > DataTable から派生させた
    > class DataTableEx : DataTable を作ったときに
    >
    > dte に dt のデータを移したいので
    >
    > DataTable dt;
    > DataTableEx dte = (DataTableEx)dt;
    >
    > だと「キャストできません」のエラーが出ます。
    > どうすればよいのでしょうか?

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

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

    暗黙的なキャストは値型でないと違和感がある、ということでしたらコピーコンストラクタ
    での実装されてはいかがでしょうか。
記事No.89204 のレス /過去ログ153より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -