none
(同じ構造の)DataTableの表追加は可能なのでしょうか? RRS feed

  • 質問

  • お世話になります。


    DataTableに対してDataTableの行追加は可能ですが、
    DataSetに対して(同じ構造の)DataTableの表追加は可能なのでしょうか?


    どうしてそんなことをしたいのかと言いますと、

    ある明細データがあり、その明細ひとつひとつがまた明細データを持つような仕様なのです。


    例えば、何かの商品一覧があり、
    その商品一つ一つが構成品を階層が無限に持っているようなシチュエーションです。


    データセット
    |
    |
    |
    |
    商品データテーブル      構成品データテーブルA       構成品データテーブルB
    車-----------------------タイヤ---------------------ゴム
    |------------------------ハンドル                |-----車輪
    |------------------------フロントガラス


    日替弁当-----------------コロッケ
    |------------------------漬物
    |------------------------ライス
    |------------------------味噌汁
    |------------------------小鉢
    |------------------------ウインナー


    パソコン-----------------CPU
    |------------------------メモリ



    ここで、構成品を2つnew(構成品データテーブルAとB)し、追加したいのですが可能なのでしょうか?

    構成品を1つのデータテーブルで表現する方が正しいのかもしれませんが・・・。

    この例でいう、構成品の「タイヤ」がさらにゴムと車輪など階層が無限に増える可能性があるためです。

    2011年2月17日 8:47

回答

  • DataTable の機能を中心に考えるより、まずテーブル設計から考えた方がよさそうです。

    以前似たような構造の DB を設計したことがあります。
    設備関連ですが、単体の機器を計上するだけでなく、

    ▽▽工事費
    |---中央監視装置
    |---電線 n メートル
    |---電線管 n 本

    ●●工事費
    |---○○工事費
    |---○○工事費
    |---○○工事費

    ○○工事費
    |---電線 n メートル
    |---電線管 n 本
    |---××工事費

    ××工事費
    |---電線 n メートル
    |---電線管 n 本
    |---■■工事費

    ■■工事費
    |---バルブ 3台
    |---調整費

    というかなり複雑な構造でたいへん苦労した覚えがあります。結局テーブルを再帰的に使って解決しました。

    後から考えたら、Composite パターンでデータを再帰的に持たせるようクラス設計し、
    必要最小限の情報のみを DB に格納するようにした方がもっとうまくいったような気がします。


    ひらぽん http://d.hatena.ne.jp/hilapon/
    2011年2月17日 10:14
    モデレータ
  • こんな記述でしょうか?
    this._myDataSet.Tables.Add(dt商品構成)

    試してみましたが、tableAdapterのUpdate()メソッド時に
    以下のようなエラーが発生しました。

    更新で TableMapping['構成品データテーブル']、または DataTable '構成品データテーブル' が見つかりませんでした。

    Updateメソッドなど、TableAdapterに関する処理をする場合、単にTables.Addメソッドを追加するだけではダメです。理由は、TableAdapterはVisual Studioが自動生成するクラスであり、ウイザードでTableAdapterを追加する際に、指定した情報に基づきDataTableが生成され、それをTableAdapterが管理するからです。
    もしやるとしたらTableAdapterを使用せず、DataAdapterを使用されれば良いと思います。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク sumi_sumi 2011年2月18日 2:46
    2011年2月17日 10:27
    モデレータ

すべての返信

  • 同じ構造で別インスタンスのDataTableってことですよね、普通に問題ないと思います。

    それよりも、階層が無限ということですが、無限であるのに2つの構成品テーブルを作る

    理由がよくわかりません。

    一番上の階層だけ別で管理したい、とかいった理由ですか?

    2011年2月17日 9:09
  • 状況がちょっとよく分かりませんが、DataSet.Tables に追加すればいくらでもTableを追加することは可能ですよ。
    2011年2月17日 9:09
  • ここで質問なさったということは、試した上で何か問題があったのだと思いますが、どのような問題があったのでしょうか。
    2011年2月17日 9:31
  • honefai さま

    有難う御座います。

    例は、2階層にしましたが
    階層は無限に続く可能性があるということです。



    T-Yokoo さま

    有難う御座います。

    こんな記述でしょうか?
    this._myDataSet.Tables.Add(dt商品構成)

    試してみましたが、tableAdapterのUpdate()メソッド時に
    以下のようなエラーが発生しました。

    更新で TableMapping['構成品データテーブル']、または DataTable '構成品データテーブル' が見つかりませんでした。



    galaco さま

    有難う御座います。

    いえ、調査したのですが行追加の情報しか見つけ出せず
    表の記述方法が知りたかったのです。
    2011年2月17日 9:52
  • DataTable の機能を中心に考えるより、まずテーブル設計から考えた方がよさそうです。

    以前似たような構造の DB を設計したことがあります。
    設備関連ですが、単体の機器を計上するだけでなく、

    ▽▽工事費
    |---中央監視装置
    |---電線 n メートル
    |---電線管 n 本

    ●●工事費
    |---○○工事費
    |---○○工事費
    |---○○工事費

    ○○工事費
    |---電線 n メートル
    |---電線管 n 本
    |---××工事費

    ××工事費
    |---電線 n メートル
    |---電線管 n 本
    |---■■工事費

    ■■工事費
    |---バルブ 3台
    |---調整費

    というかなり複雑な構造でたいへん苦労した覚えがあります。結局テーブルを再帰的に使って解決しました。

    後から考えたら、Composite パターンでデータを再帰的に持たせるようクラス設計し、
    必要最小限の情報のみを DB に格納するようにした方がもっとうまくいったような気がします。


    ひらぽん http://d.hatena.ne.jp/hilapon/
    2011年2月17日 10:14
    モデレータ
  • ひらぽん さま

    有難う御座います。

    やはりですが。。。設計から見直したが良い気はしていました。

    PG側で再帰はする予定でいましたが、Compositeパターンは知りませんでした。

    クラス設計をみ直してみます。有難う御座いました。

     

    2011年2月17日 10:25
  • こんな記述でしょうか?
    this._myDataSet.Tables.Add(dt商品構成)

    試してみましたが、tableAdapterのUpdate()メソッド時に
    以下のようなエラーが発生しました。

    更新で TableMapping['構成品データテーブル']、または DataTable '構成品データテーブル' が見つかりませんでした。

    Updateメソッドなど、TableAdapterに関する処理をする場合、単にTables.Addメソッドを追加するだけではダメです。理由は、TableAdapterはVisual Studioが自動生成するクラスであり、ウイザードでTableAdapterを追加する際に、指定した情報に基づきDataTableが生成され、それをTableAdapterが管理するからです。
    もしやるとしたらTableAdapterを使用せず、DataAdapterを使用されれば良いと思います。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク sumi_sumi 2011年2月18日 2:46
    2011年2月17日 10:27
    モデレータ
  • そうなると、「構成品データテーブル」のテーブルが無限に増えていくってことですよね。そういう設計は普通は無理でしょう。

    構成品データテーブル」は一つだけにしておいて、商品データテーブル」と「構成品データテーブル」のリレーション、「構成品データテーブル」と「構成品データテーブル」の再帰リレーションという風にリレーションで解決した方が良いと思います

    2011年2月17日 11:25
  • >例は、2階層にしましたが
    >階層は無限に続く可能性があるということです。

    はい、それは理解しております。

    通常であれば1テーブルで親の構成番号なりで階層構造データをもったりするやり方が

    考えられるのでなぜ2つ、という意味でした。

    その上で、一階層目はデータ量が多い可能性などから、あえて別テーブルとして

    2テーブルなのかな~という質問でしたが、私の言葉足らずでしたね、申し訳ありません。

    2011年2月17日 12:42

  • みなさん、アドバイス本当に有難うございます。


    trapemiyaさま

    仰る通り、単にTables.Addメソッドを使っていました。

    DataAdapterを使ってみます。またご報告させてください。

    有難うございます。



    T-Yokoo さま

    言葉足らずですみません。
    おっしゃる通りの設計にしております。
    当然再帰も使う予定でいます。



    honefai さま

    こちらの方が最初に説明不足でした。
    すみません。

    おっしゃる通りテーブルは2つに分けてリレーションを貼ってあります。

    やはりテーブル設計の方は問題無いかと思っております。
    2011年2月18日 0:24
  • 皆様たくさんのアドバイス本当に有難う御座いました。

    まだ解決にはいたっておりませんが、光が見いだせた感じです。

    皆様のアドバイス通り、まずはテーブル設計から見直し→テーブルの再帰を調査してます(PGはありますがテーブルはやったことが無い・・・)。

    その上で必要ならデータテーブルの追加を使わせていただこうと思います。

    なので時間がかかりそうなので申し訳ないですが、いったん回答としてマークをさせていただきます。

     

    また宜しくお願いいたします。

     

    ちなみにテーブルの再帰は、trapemiyaさまのこちらのページを参考にさせていただきました。

    大変分かりやすいです。

    http://blogs.wankuma.com/trapemiya/archive/2009/10/29/182544.aspx

    2011年2月18日 2:50