投稿者 るしぇ  (社会人) 投稿日時 2010/1/23 23:53:40
>という、事前にデータテーブルを作成しておく手法は初めて知りました。
ウィザードを使ってって言う意味なら分からないでもないけど、
DataGridView.DataSource は普通、事前に設定しますよ。DataGridView
がそもそも、データベースの検索結果(DataTable)を表示するような目的の
コントロールの流れを受け継いでいるから。WEB 上のサンプルもそっちの
パターンの方が多いです。調べれば分かる事だと思いますが。

全てのオブジェクト(Class)は New というキーワードでインスタンス(実体)を
生成してから使用し、使わなくなったら破棄します。
http://homepage1.nifty.com/CavalierLab/lab/vb/clsmdl/index.html

デザイナやウィザードを利用した場合、自動でコードが追加されますが、
そのコードでやってる事は同じです。

>(a) DataSet に対して、.Tables.Add のメソッドを呼び出して作成する方法。
本来、入れ物にテーブルを入れる命令です。つまり、既存のデータベース検索
処理で DataTable があったとします。新しくインスタンスを生成する必要は
無いって言うか、新しく作っちゃったらデータの入れ替えしないといけませんよね。
そのまま引数に渡せばいいのです。
じゃあ、逆にまだ検索処理をしてなかったら?
>>dSet.Tables.Add("商品リスト")
>に関しては、
>http://msdn.microsoft.com/ja-jp/library/cxzk77ex.aspx
>を見ると、新しいテーブルが作成されるという趣旨のことが書いてあるので、今回の件ではおかしいことがわかります。
新しくインスタンスを生成する必要がありますね。ついでに TableName も設定して
おけば便利かもしれません。つまり
        Dim dTbl As New DataTable()
        dTbl.TableName = "商品リスト"
        dSet.Tables.Add(dTbl)

が内部で実行されていると予想できるわけです。

ところで、DataSet も DataGridView.DataSource に設定できます。
何が違うのか?テーブルを複数格納できるという点です。
1つしかテーブルを扱わないのであれば過重包装かもしれませんね。
でもテーブルが複数あって、全部使うとか、一部使うとかしてたら?
手提げ袋にまとめて入れておいてくれた方が持ち運びに便利ですよね。

>(b) Dim dTbl As New DataTable() のように、New で生成する方法。
コレが一番基本。一番単純なインスタンスの生成。

>(c) デザイナで型付 DataSet を作っておき、それを利用する方法。
やってる事は基本的には同じ。型付なので、データ型がはっきりする
ところはいいけど、ボクは基本的にウィザードが全部嫌いです。
自動化するには処理の一般化・共通化が必要です。同じ手順を踏める
から自動化もできると。すると、必要無いありがた迷惑な設定も勝手に
設定してたり、内部に設定情報持ってたり。。。
。。。結局、全部共通して重いし。掲示板で説明するのも面倒だし。

まぁ、同じ人間の考えることだから常識で考えれば理解できるでしょう?
量産品は自動化できるけど、オーダーメイドが必要になる場面もあります。
ボクは基本オーダーメイドで作るから、量産品を作る手順はむしろ足枷に
なって嫌いなんです。
>メリット、デメリット
単純に処理が遅くなったり、誤動作したりという事ですか?常識で考えて
有り得ないでしょう。作成するものが同じなのに、処理方法を3つ用意
したりします?インターフェースだけ変えて内部で同じ処理に繋げる
でしょう?同じ人間ならそう考えるはずです。

ここで差が出てくるとしたら、構造的にまとめてしまっている場合。
例えばファイルを開いて書込み命令を1万回繰り返して閉じるのと、
ファイルパスを渡すと「開いて1行書いて閉じる」をまとめてしまって
いる場合。これを1万回繰り返せば無駄な「開く閉じる」処理をやる
から遅くなるとか。
もしくは.NET になってフレームワーク上に複数言語を乗せちゃったから、
つじつま合わせで無駄な処理が入っているとか。

無いとは言いません。というかあります。が、実際にコーディングして
問題が出てから調べたのでいいのでは?結局、単体・結合・総合テストで
網羅性を考えているでしょう?
まぁ、でも、ここがノウハウでしょうね。ご飯を食べるネタなので、
ボクはタダで出す事は極稀ですかねー。回答者によってはバンバン出す
人もいますね。