none
TableAdapter vs DataAdapter RRS feed

  • 質問

  • こんばんは。いつも参考にさせていただいております。
    ひとつ質問させて下さい。

    Visual Basic 2005 から、DataAdapter に加えて
    新機能でTableAdapterが加わりましたが、参考書などを読むと
    未だにDataAdapterを使用している解説が多くあります。

    この理由はどうしてでしょうか?
    1.単純に筆者が執筆時点でTableAdapterをまだよく理解していない。
    2.実はDataAdapterとTableAdapterでは使用する場面や基準が違う。
      つまりDataAdapterはTableAdapterに取って代わるものではない。

    けっこう有名な筆者な方ですから、もしかしたら「2」では?と思ってしまいます。

    では、もし答えが「2」の場合、
    どのようなときにDataAdapterを使用し、
    そしてどのようなときにTableAdapterを使用するのでしょうか?

    ご教示よろしくお願いいたします。

    2010年2月22日 17:59

回答

  • TableAdapterはDataAdapterとDataTableなどをラップしたものです。TableAdapterというクラスが.NETに最初から用意されているわけではなく、デザイン時に動的に生成されるクラスです。簡単に言えば、DataAdapterとDataTableはセットで使用しますから、それらをまとめて扱いやすいように動的に作成したのがTableAdapterです。一種のラッパークラスです。
    ですから大きな違いは、DataAdapterは.NETに存在するクラスですが、TabaleAdapterはデザイナを用いて生成しない限り、.NETには存在しません。
    以上から、TableAdapterがDataAdapterに取って代わるものではないことがおわかりになると思います。

    さて、両者の使い分けですが、一般的にはTableAdapterで事足りることがほとんどだと思います。現にVisual StudioのツールボックルにはデフォルトでDataAdapterは表示されていません。
    DataAdapterを使う場合は、自動生成されたTableAdapterクラスが使いにくい場面であったり、一時的にDataTableを扱いたいので、TableAdapterクラスを永続的に生成したくない場合などでしょうか。

    いずれにしても、ADO.NETの基本であるDataAdapterを学習されることは良いことだと思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク kei_chan_gt 2010年2月25日 14:49
    2010年2月23日 2:18
    モデレータ
  • > この理由はどうしてでしょうか?
    > 1.単純に筆者が執筆時点でTableAdapterをまだよく理解していない。
    > 2.実はDataAdapterとTableAdapterでは使用する場面や基準が違う。
    >   つまりDataAdapterはTableAdapterに取って代わるものではない。

    本の種類にもよると思いますが、ADO.NET 関係の教本であれば、答え
    は1でも2でもないと思います(二者択一なら2が近いかもしれませ
    んが)。

    たぶん、ADO.NET を学習する上で、基本 (DataAdapter) の習得なくし
    て応用 (TableAdapter) はないというのが理由だと思います。

    DataAdapter は、DataReader, Connection, Command, DataSet な
    どと共に、ADO.NET の基本的クラスライブラリの一つです。詳しくは、以下
    の解説を読んでください(DataAdapter については「非接続型データアクセ
    スの動作とそのアドバンテージ」のあたりに注目)。

    DB 設計者のための明解 ADO.NET 第 1 回
    http://msdn.microsoft.com/ja-jp/events/dd231281.aspx

    一方、TableAdapter は ADO.NET のクラスライブラリではありません。

    型付 DataSet と TableAdapter は Visual Studio のウィザードを利
    用して、特定の DB に対して DataSet と DataAdapter を使って作る
    カスタム・クラスと考えればよいと思います。

    使い方は、Web アプリの場合ですが、以下のページが参考になると思
    います。

    Microsoft Visual Studio 2005によるWebアプリケーション構築技法
    http://www.atmarkit.co.jp/fdotnet/bookpreview/vs2005webapp_07/vs2005webapp_07_01.html

    > どのようなときにDataAdapterを使用し、
    > そしてどのようなときにTableAdapterを使用するのでしょうか?

    開発工数、型付 DataSet + TableAdapter の利便性、保守性などを考
    えて、適材適所で決めることと思います。

    個人的意見ですが、例えば、DataTable を作るためだけなら、わざわざ
    TableAdapter を作るまでもなく、DataAdapter で十分でしょう。短時
    間で、間違いなく、DB の更新処置までを含めたアプリを作るならウィ
    ザードを使って型付 DataSet + TableAdapter を作るのが良いと思い
    ます。

    • 回答としてマーク kei_chan_gt 2010年2月25日 14:49
    2010年2月23日 14:01
  • 解決済みのようですが、一言。

    trapemiyaさま SurferOnWwwさま ご教示ありがとうございます。やはりTableAdapterはDataAdapterに取って代わるものではなかったのですね(^_^;)

    TableAdapter は 「取って変わるもの」 ではなく、生産性を上げるためのヘルパクラスというのが、.NET 開発チームの認識のようです。
    以下は .NET 開発チームのメンバが書いた .NET クラスライブラリの設計 からの引用ですが、
    DO NOT  基本的なシナリオのプログラミングを開始できる前に、手間のかかる初期化処理を要することがないようにします。

    メインシナリオの API は、初期化の必要性を最小限にするように設計されるべきです。

    ・・・・・・・ 中略 ・・・・・・

    ADO.NET は、私たちの顧客が手間のかかる初期化を必要とすることにより使用しづらくなってると認識している機能領域の例です。
    最もシンプルなシナリオでも、ユーザーはいくつかの型の間で複雑な相互関係および依存性を理解することが求められます。
    この機能を使用するためには、シンプルなシナリオでも、ユーザーはいくつものオブジェクト
    (DataSet ・ DataAdapter ・ SqlConnection ・ および SqlCommand ) をインスタンス化し、さらに組みまわせねばなりません。

    これらの問題の多くが、.NET Framework 2.0 で追加された、基本的なシナリオを素晴らしく単純化するヘルパクラスにより解決されたことをご覧下さい。

    とのことだそうです。

    もっとも、TableAdapter を使うか DataAdapter を使うかはケースバイケースで、どちらがいいかはシステムの仕様によって変わってくると思います。
    • 回答としてマーク kei_chan_gt 2010年2月28日 16:09
    2010年2月25日 16:04
    モデレータ
  • 書籍や雑誌の執筆でもDataAdapterはとりあげていますがTableAdapterは取り上げる機会は少ないです。
    理由としては、ADO.NETの使い方とした場合、
    • .NET Framework(ADO.NET)に含まれるのはDataAdapterだけ
    • ConnectionやCommand、DataReaderなどと同じ階層の説明をするならDataAdapter
    • DB側のテーブル変更が発生したときにTableAdapterは影響を受けやすいので、スマートじゃない開発の場合はあんまり恩恵にあずかれない。
    などの理由から限られたページ数でDataAdapterに割くページ数を減らしてまでもTableAdapterを取り上げる必要性を感じていないからです。

    http://blogs.wankuma.com/hatsune/
    • 回答としてマーク kei_chan_gt 2010年2月28日 16:09
    2010年2月26日 7:47

すべての返信

  • TableAdapterはDataAdapterとDataTableなどをラップしたものです。TableAdapterというクラスが.NETに最初から用意されているわけではなく、デザイン時に動的に生成されるクラスです。簡単に言えば、DataAdapterとDataTableはセットで使用しますから、それらをまとめて扱いやすいように動的に作成したのがTableAdapterです。一種のラッパークラスです。
    ですから大きな違いは、DataAdapterは.NETに存在するクラスですが、TabaleAdapterはデザイナを用いて生成しない限り、.NETには存在しません。
    以上から、TableAdapterがDataAdapterに取って代わるものではないことがおわかりになると思います。

    さて、両者の使い分けですが、一般的にはTableAdapterで事足りることがほとんどだと思います。現にVisual StudioのツールボックルにはデフォルトでDataAdapterは表示されていません。
    DataAdapterを使う場合は、自動生成されたTableAdapterクラスが使いにくい場面であったり、一時的にDataTableを扱いたいので、TableAdapterクラスを永続的に生成したくない場合などでしょうか。

    いずれにしても、ADO.NETの基本であるDataAdapterを学習されることは良いことだと思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク kei_chan_gt 2010年2月25日 14:49
    2010年2月23日 2:18
    モデレータ
  • > この理由はどうしてでしょうか?
    > 1.単純に筆者が執筆時点でTableAdapterをまだよく理解していない。
    > 2.実はDataAdapterとTableAdapterでは使用する場面や基準が違う。
    >   つまりDataAdapterはTableAdapterに取って代わるものではない。

    本の種類にもよると思いますが、ADO.NET 関係の教本であれば、答え
    は1でも2でもないと思います(二者択一なら2が近いかもしれませ
    んが)。

    たぶん、ADO.NET を学習する上で、基本 (DataAdapter) の習得なくし
    て応用 (TableAdapter) はないというのが理由だと思います。

    DataAdapter は、DataReader, Connection, Command, DataSet な
    どと共に、ADO.NET の基本的クラスライブラリの一つです。詳しくは、以下
    の解説を読んでください(DataAdapter については「非接続型データアクセ
    スの動作とそのアドバンテージ」のあたりに注目)。

    DB 設計者のための明解 ADO.NET 第 1 回
    http://msdn.microsoft.com/ja-jp/events/dd231281.aspx

    一方、TableAdapter は ADO.NET のクラスライブラリではありません。

    型付 DataSet と TableAdapter は Visual Studio のウィザードを利
    用して、特定の DB に対して DataSet と DataAdapter を使って作る
    カスタム・クラスと考えればよいと思います。

    使い方は、Web アプリの場合ですが、以下のページが参考になると思
    います。

    Microsoft Visual Studio 2005によるWebアプリケーション構築技法
    http://www.atmarkit.co.jp/fdotnet/bookpreview/vs2005webapp_07/vs2005webapp_07_01.html

    > どのようなときにDataAdapterを使用し、
    > そしてどのようなときにTableAdapterを使用するのでしょうか?

    開発工数、型付 DataSet + TableAdapter の利便性、保守性などを考
    えて、適材適所で決めることと思います。

    個人的意見ですが、例えば、DataTable を作るためだけなら、わざわざ
    TableAdapter を作るまでもなく、DataAdapter で十分でしょう。短時
    間で、間違いなく、DB の更新処置までを含めたアプリを作るならウィ
    ザードを使って型付 DataSet + TableAdapter を作るのが良いと思い
    ます。

    • 回答としてマーク kei_chan_gt 2010年2月25日 14:49
    2010年2月23日 14:01
  • trapemiyaさま SurferOnWwwさま ご教示ありがとうございます。 やはりTableAdapterはDataAdapterに取って代わるものでは なかったのですね(^_^;) Access.adp → VB2005 へ移ってきたのですが アクセスの参考書(ADO)は、どの参考書もコードや データベースのアプローチの仕方がだいたい似ていたのですが VB2005では、参考書によりコードの記述がマチマチなので かなり混乱しています。 どうか今後ともご教示よろしくお願いいたします<(_)>
    • 回答としてマーク kei_chan_gt 2010年2月25日 14:49
    • 回答としてマークされていない kei_chan_gt 2010年2月25日 14:50
    2010年2月25日 14:48
  • 解決済みのようですが、一言。

    trapemiyaさま SurferOnWwwさま ご教示ありがとうございます。やはりTableAdapterはDataAdapterに取って代わるものではなかったのですね(^_^;)

    TableAdapter は 「取って変わるもの」 ではなく、生産性を上げるためのヘルパクラスというのが、.NET 開発チームの認識のようです。
    以下は .NET 開発チームのメンバが書いた .NET クラスライブラリの設計 からの引用ですが、
    DO NOT  基本的なシナリオのプログラミングを開始できる前に、手間のかかる初期化処理を要することがないようにします。

    メインシナリオの API は、初期化の必要性を最小限にするように設計されるべきです。

    ・・・・・・・ 中略 ・・・・・・

    ADO.NET は、私たちの顧客が手間のかかる初期化を必要とすることにより使用しづらくなってると認識している機能領域の例です。
    最もシンプルなシナリオでも、ユーザーはいくつかの型の間で複雑な相互関係および依存性を理解することが求められます。
    この機能を使用するためには、シンプルなシナリオでも、ユーザーはいくつものオブジェクト
    (DataSet ・ DataAdapter ・ SqlConnection ・ および SqlCommand ) をインスタンス化し、さらに組みまわせねばなりません。

    これらの問題の多くが、.NET Framework 2.0 で追加された、基本的なシナリオを素晴らしく単純化するヘルパクラスにより解決されたことをご覧下さい。

    とのことだそうです。

    もっとも、TableAdapter を使うか DataAdapter を使うかはケースバイケースで、どちらがいいかはシステムの仕様によって変わってくると思います。
    • 回答としてマーク kei_chan_gt 2010年2月28日 16:09
    2010年2月25日 16:04
    モデレータ
  • 書籍や雑誌の執筆でもDataAdapterはとりあげていますがTableAdapterは取り上げる機会は少ないです。
    理由としては、ADO.NETの使い方とした場合、
    • .NET Framework(ADO.NET)に含まれるのはDataAdapterだけ
    • ConnectionやCommand、DataReaderなどと同じ階層の説明をするならDataAdapter
    • DB側のテーブル変更が発生したときにTableAdapterは影響を受けやすいので、スマートじゃない開発の場合はあんまり恩恵にあずかれない。
    などの理由から限られたページ数でDataAdapterに割くページ数を減らしてまでもTableAdapterを取り上げる必要性を感じていないからです。

    http://blogs.wankuma.com/hatsune/
    • 回答としてマーク kei_chan_gt 2010年2月28日 16:09
    2010年2月26日 7:47
  • ひらぽんさんへ

    ご教示ありがとうございます<(_)>

    > もっとも、TableAdapter を使うか DataAdapter を使うかは
    > ケースバイケースで

    はい、このケースバイケースの判断が素人にはつき辛く困っております(^_^;)
    まぁ、これはいくつも自分で開発してみて、経験で習得するしかないのかなぁと思っております。


    初音玲さんへ

    ご教示ありがとうございます<(_)>
    たしかにTableAdapterだと、DBのテーブル構成に変更が生じた場合
    またウィザードで設定しなおさなければなりませんが(他にも方法があるのかも知れませんが)
    DataAdapterはプログラムコードを直すだけなのでメンテがラクですもんね。
    (と言う認識でOKですか?)


    おふたかたとも、親切丁寧なご説明ありがとうございました。
    • 編集済み kei_chan_gt 2010年3月9日 14:26 改行訂正
    2010年2月28日 16:08