トップ回答者
(同じ構造の)DataTableの表追加は可能なのでしょうか?

質問
-
お世話になります。
DataTableに対してDataTableの行追加は可能ですが、
DataSetに対して(同じ構造の)DataTableの表追加は可能なのでしょうか?
どうしてそんなことをしたいのかと言いますと、
ある明細データがあり、その明細ひとつひとつがまた明細データを持つような仕様なのです。
例えば、何かの商品一覧があり、
その商品一つ一つが構成品を階層が無限に持っているようなシチュエーションです。
データセット
|
|
|
|
商品データテーブル 構成品データテーブルA 構成品データテーブルB
車-----------------------タイヤ---------------------ゴム
|------------------------ハンドル |-----車輪
|------------------------フロントガラス
日替弁当-----------------コロッケ
|------------------------漬物
|------------------------ライス
|------------------------味噌汁
|------------------------小鉢
|------------------------ウインナー
パソコン-----------------CPU
|------------------------メモリ
ここで、構成品を2つnew(構成品データテーブルAとB)し、追加したいのですが可能なのでしょうか?
構成品を1つのデータテーブルで表現する方が正しいのかもしれませんが・・・。この例でいう、構成品の「タイヤ」がさらにゴムと車輪など階層が無限に増える可能性があるためです。
回答
-
DataTable の機能を中心に考えるより、まずテーブル設計から考えた方がよさそうです。
以前似たような構造の DB を設計したことがあります。
設備関連ですが、単体の機器を計上するだけでなく、▽▽工事費
|---中央監視装置
|---電線 n メートル
|---電線管 n 本●●工事費
|---○○工事費
|---○○工事費
|---○○工事費○○工事費
|---電線 n メートル
|---電線管 n 本
|---××工事費××工事費
|---電線 n メートル
|---電線管 n 本
|---■■工事費■■工事費
|---バルブ 3台
|---調整費というかなり複雑な構造でたいへん苦労した覚えがあります。結局テーブルを再帰的に使って解決しました。
後から考えたら、Composite パターンでデータを再帰的に持たせるようクラス設計し、
必要最小限の情報のみを DB に格納するようにした方がもっとうまくいったような気がします。
ひらぽん http://d.hatena.ne.jp/hilapon/- 編集済み ひらぽんModerator 2011年2月17日 10:22 リンクを追加
- 回答としてマーク sumi_sumi 2011年2月18日 2:50
-
こんな記述でしょうか?
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
すべての返信
-
honefai さま
有難う御座います。
例は、2階層にしましたが
階層は無限に続く可能性があるということです。
T-Yokoo さま
有難う御座います。
こんな記述でしょうか?
this._myDataSet.Tables.Add(dt商品構成)
試してみましたが、tableAdapterのUpdate()メソッド時に
以下のようなエラーが発生しました。
更新で TableMapping['構成品データテーブル']、または DataTable '構成品データテーブル' が見つかりませんでした。
galaco さま
有難う御座います。
いえ、調査したのですが行追加の情報しか見つけ出せず
表の記述方法が知りたかったのです。 -
DataTable の機能を中心に考えるより、まずテーブル設計から考えた方がよさそうです。
以前似たような構造の DB を設計したことがあります。
設備関連ですが、単体の機器を計上するだけでなく、▽▽工事費
|---中央監視装置
|---電線 n メートル
|---電線管 n 本●●工事費
|---○○工事費
|---○○工事費
|---○○工事費○○工事費
|---電線 n メートル
|---電線管 n 本
|---××工事費××工事費
|---電線 n メートル
|---電線管 n 本
|---■■工事費■■工事費
|---バルブ 3台
|---調整費というかなり複雑な構造でたいへん苦労した覚えがあります。結局テーブルを再帰的に使って解決しました。
後から考えたら、Composite パターンでデータを再帰的に持たせるようクラス設計し、
必要最小限の情報のみを DB に格納するようにした方がもっとうまくいったような気がします。
ひらぽん http://d.hatena.ne.jp/hilapon/- 編集済み ひらぽんModerator 2011年2月17日 10:22 リンクを追加
- 回答としてマーク sumi_sumi 2011年2月18日 2:50
-
こんな記述でしょうか?
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
-
皆様たくさんのアドバイス本当に有難う御座いました。
まだ解決にはいたっておりませんが、光が見いだせた感じです。
皆様のアドバイス通り、まずはテーブル設計から見直し→テーブルの再帰を調査してます(PGはありますがテーブルはやったことが無い・・・)。
その上で必要ならデータテーブルの追加を使わせていただこうと思います。
なので時間がかかりそうなので申し訳ないですが、いったん回答としてマークをさせていただきます。
また宜しくお願いいたします。
ちなみにテーブルの再帰は、trapemiyaさまのこちらのページを参考にさせていただきました。
大変分かりやすいです。
http://blogs.wankuma.com/trapemiya/archive/2009/10/29/182544.aspx