トップ回答者
TableAdapterのUpdateコマンド

質問
-
おはようございます。
VB2005+SQLServerExpressを使用しています。
TableAdapterを作成しようと思い、既存のストアドプロシージャを使用するを選択してSelect、Insertなどを
セットし、先へ進めていくと、Fillを作成するなどの画面において「Updateコマンドの生成」にチェックが
入らず、当然Updateコマンドも生成されません。(グレー表示で自分でチェックをすることすら出来ません)単独のテーブルを追加、更新するというないようです。
疑問に思い、新しいストアドプロシージャを使用するを選択し、ストアドプロシージャをVB2005から
作成してもらうと、「Updateコマンドの生成」にチェックが入っています。新しく作成されたストアドプロシージャと自分が作成したものとでは、内容としてはまったく変わらないの
ですが、なぜこのような現象が起きてしまうのでしょうか。過去の質問にMyOBDCを使用すると出来ないという記述は呼んだのですが、SQLServerを使用しているので
出来ないことはないとは思うのですが、理由がわかりません。理由をご存知の方がいらっしゃいましたら、ご教授いただけませんでしょうか。
どうか、よろしくお願いします。
回答
-
Updateメソッドができないのはおかしな動作というわけではないのですね。
そうですね。
仮にTableAdapter.Update()をしたいと思ったら、Partialクラスなどで独自に作ることに
なるのでしょうか。
「SQLステートメントを使用する」を利用した場合は、主キーを含む適切なSQL文を入力すれば、TableAdapter.Update()が自動生成されます。そうではなく、「既存のストアドプロシージャを使用する」を選択した場合、select用のストアドプロシージャだけではなく、InsertやUpdateなどのストアドプロシージャも指定する必要があります。つまり、「SQLステートメントを使用する」を選択した場合は、select文からInsert文やUpdate文が自動生成されてTableAdapter.Update()が最終的に作成されますが、既存のストアドプロシージャを使用する」を選択した場合は、select用のストアドプロシージャからInsertやUpdate用のストアドプロシージャが自動生成されるわけではなく、それらを手動で与えることにより、最終的に更新可能なTableAdapter.Update()が生成されます。
よく、TableAdapterは非常に便利だというご意見を聞くのですが、たしかに便利な半面、
私のようにそれほど知識がない人間からすると、非常に分かりにくいものでもありますね。記述するコードの量は圧倒的に多くなってはしまいますが、自分でDataTableなどを
作るほうが自分が何をしているのかが、よくわかるので自分にはあっているようです。
(こんなことではいけないとは、思うのですが)TableAdapterは実際に便利なもので、私もよく利用します。今ではDataSetやDataTableなどを自分で用意して利用することはほとんどなくなりました。結局、TableAdapterとは自分でDataSetやDataTableを用意してプログラムする代わりに、それらをラップした便利なクラスとしてVisual Studioが自動生成したクラスです。自動生成されたTableAdapterのコードを読むと、おなじみのDataSetやDataTableを利用して処理しているところが見つかります。
しかし、自動生成されたTableAdapterでは場合によっては足りない機能があります。かといって自動生成されたTableAdapterを編集しても、ふたたび自動生成されれば編集した内容は全て消えてしまいます。そこで、何度自動生成しても消えないように、Partial Classとして記述します。つまり、考え方としては、自分でDataSetやDataTableを利用してコードを書くという手間の代わりに、TableAdapterという形でコードを自動生成し、足らない部分をPartial Classで付け足すという感じです。この足らない部分を付けたすというのがポイントで、これはDataSetやDataTalbeなどをちゃんと理解していないとなかなかできないものです。ですから、TI-cb400さんのように「自分でDataTableなどを作るほうが自分が何をしているのかが、よくわかる」と言われる方は、TableAdapterをより使いこなせると思うのです。お勉強中なので、いろいろなことを試してみたいとは思うのですが、最終的には自分にあった
スタイルのコーディングになっていくのかなと思っています。
(それでよいのかと自問中ではありますが)お勧めとしては上述した考え方でコーディングするのが良いと思っています。TableAdapterが登場してからDataSetやDataTable、DataAdapterは標準でツールボックスから無くなってしまいましたので、TableAdapterを使ってコーディングするのが一般的だということなのでしょう。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/- 回答としてマーク TI-cb400 2010年11月3日 1:10
すべての返信
-
GenerateDbDirectMethodsのことでしょうか? であれば、これは入力されたselect文を元にデーターベースのテーブルが解析されて作成されますので、そのような動作になるのだと思います。既存のストアドプロシージャを指定した場合は、このselect文を指定していないためテーブルが解析できず、GenerateDbDirectMethodsを作成できないのでしょう。
ちなみにTableAdpater.Update()で使用されるのはUpdateCommand, InsertCommand, DeleteCommandであり、GenerateDbDirectMethodsの結果として生成されるTableAdaper.Updateメソッド、TableAdaper.Insertメソッド、TableAdaper.Deleteメソッドとは異なります。Updateに関してはメソッド名が同一であり、オーバーロードの関係にあります。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/ -
お返事が遅くなり申し訳ありません。
Updateメソッドができないのはおかしな動作というわけではないのですね。
Updateメソッドが何をしているかと思い、他のTableAdapterのコードを見たのですが、
Updateがいくつもあり、まだ、何がどのようなことをしているかがわかってはおりません。仮にTableAdapter.Update()をしたいと思ったら、Partialクラスなどで独自に作ることに
なるのでしょうか。よく、TableAdapterは非常に便利だというご意見を聞くのですが、たしかに便利な半面、
私のようにそれほど知識がない人間からすると、非常に分かりにくいものでもありますね。記述するコードの量は圧倒的に多くなってはしまいますが、自分でDataTableなどを
作るほうが自分が何をしているのかが、よくわかるので自分にはあっているようです。
(こんなことではいけないとは、思うのですが)勉強中なので、いろいろなことを試してみたいとは思うのですが、最終的には自分にあった
スタイルのコーディングになっていくのかなと思っています。
(それでよいのかと自問中ではありますが) -
Updateメソッドができないのはおかしな動作というわけではないのですね。
そうですね。
仮にTableAdapter.Update()をしたいと思ったら、Partialクラスなどで独自に作ることに
なるのでしょうか。
「SQLステートメントを使用する」を利用した場合は、主キーを含む適切なSQL文を入力すれば、TableAdapter.Update()が自動生成されます。そうではなく、「既存のストアドプロシージャを使用する」を選択した場合、select用のストアドプロシージャだけではなく、InsertやUpdateなどのストアドプロシージャも指定する必要があります。つまり、「SQLステートメントを使用する」を選択した場合は、select文からInsert文やUpdate文が自動生成されてTableAdapter.Update()が最終的に作成されますが、既存のストアドプロシージャを使用する」を選択した場合は、select用のストアドプロシージャからInsertやUpdate用のストアドプロシージャが自動生成されるわけではなく、それらを手動で与えることにより、最終的に更新可能なTableAdapter.Update()が生成されます。
よく、TableAdapterは非常に便利だというご意見を聞くのですが、たしかに便利な半面、
私のようにそれほど知識がない人間からすると、非常に分かりにくいものでもありますね。記述するコードの量は圧倒的に多くなってはしまいますが、自分でDataTableなどを
作るほうが自分が何をしているのかが、よくわかるので自分にはあっているようです。
(こんなことではいけないとは、思うのですが)TableAdapterは実際に便利なもので、私もよく利用します。今ではDataSetやDataTableなどを自分で用意して利用することはほとんどなくなりました。結局、TableAdapterとは自分でDataSetやDataTableを用意してプログラムする代わりに、それらをラップした便利なクラスとしてVisual Studioが自動生成したクラスです。自動生成されたTableAdapterのコードを読むと、おなじみのDataSetやDataTableを利用して処理しているところが見つかります。
しかし、自動生成されたTableAdapterでは場合によっては足りない機能があります。かといって自動生成されたTableAdapterを編集しても、ふたたび自動生成されれば編集した内容は全て消えてしまいます。そこで、何度自動生成しても消えないように、Partial Classとして記述します。つまり、考え方としては、自分でDataSetやDataTableを利用してコードを書くという手間の代わりに、TableAdapterという形でコードを自動生成し、足らない部分をPartial Classで付け足すという感じです。この足らない部分を付けたすというのがポイントで、これはDataSetやDataTalbeなどをちゃんと理解していないとなかなかできないものです。ですから、TI-cb400さんのように「自分でDataTableなどを作るほうが自分が何をしているのかが、よくわかる」と言われる方は、TableAdapterをより使いこなせると思うのです。お勉強中なので、いろいろなことを試してみたいとは思うのですが、最終的には自分にあった
スタイルのコーディングになっていくのかなと思っています。
(それでよいのかと自問中ではありますが)お勧めとしては上述した考え方でコーディングするのが良いと思っています。TableAdapterが登場してからDataSetやDataTable、DataAdapterは標準でツールボックスから無くなってしまいましたので、TableAdapterを使ってコーディングするのが一般的だということなのでしょう。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/- 回答としてマーク TI-cb400 2010年11月3日 1:10
-
ご回答ありがとうございます。
いつも、参考になるご意見、本当にありがとうございます。
先ほども、いろいろとテストをしていて、どうしてもよくわからないのですが、TableAdapterで「新しいストアドプロシージャを作成する」を選択して
生成されたストアドプロシージャとまったく構成は同じストアドプロシージャを自分で作成して、「既存のストアドプロシージャを使用する」で
TableAdapterを作成すると、Updateメソッドを作成するというチェックが入らないことがしばしばあります。ストアドプロシージャの内容が異なっているならば、理解は出来るのですが、書き方は異なるが内容はまったく同じなのに、Updateメソッドが
生成されないことがあるのはなぜなのでしょうか。どうしてもこのあたりがすっきりとしません。
-
「新しいストアドプロシージャを作成する」を選択した場合、select文を入力されると思います。このselect文を元にselect, update, insert, deleteの各ストアドプロシージャが自動生成されます。この結果、update用のストアドプロシージャが生成されますので、Updateメソッドの生成にチェックを入れることが可能になります。
一方、、「既存のストアドプロシージャを使用する」でselect用のストアドプロシージャのみを指定した場合は、それしかTableAdapterに存在しません。したがって、Updateを行なうことができませんので、Updateメソッドの生成にチェックを入れることができません。
なお、ここでいうupdateメソッドはTableAdapter.Update()メソッドではありません。前述した通り、DataRowなどを引数にとるupdateメソッドです。つまり、updateメソッドのオーバーロード版を作成するかどうかをGenerateDbDirectMethodsで選択しているのです。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/