🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

1回答

5258閲覧

ASP.NET TableAdapterの設定時に作成するFillメソッドとGetDataメソッドの使い分け

kazu0630

総合スコア26

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2021/02/17 14:15

編集2021/02/20 08:49

お世話になっております。

ASP.NETの学習を始めたばかりのものです。

xsdファイルにツールボックスからTableAdapterをドラッグアンドドロップすると、TableAdapter 構成ウィザードが表示されますが、そのときにFillメソッドとGetDataメソッドを作成することができると思います。(メソッド名は、任意)

![イメージ説明

このFillメソッドとGetDataメソッドの使い分けはどのようにすれば良いのかが分かっておりません。

上記の2つのメソッドはどのように使い分けるべきなのでしょうか。




■追記(2021 2/19)
例えば、Webアプリを作成する際に、以下のようにxsdファイルにTableAdapterを定義したとします。
イメージ説明

そして、以下のようにFillメソッドまたはGetDataテーブルを使うことで、どちらともテーブルからデータを取得することができると思いますが、この2つのメソッドの使い分けがまだ理解できておりません。

VB

1 Dim adapter As New TestDataSetTableAdapters.BookTableAdapter 2 Dim dt As New TestDataSet.BookDataTable 3 4 ' Fillメソッドでデータを取得 5 adapter.Fill(dt) 6 7 ' GetDataメソッドでデータを取得 8 Dim result As DataTable = adapter.GetData 9コード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

型付 DataSet / DataTable + TableAdapter を作って ASP.NET Web Forms アプリで利用する場合、データバインドコントロール(GridView, ListView など)と TableAtapter の間には ObjectDataSource を配置するのが普通ですが、その場合は GetData を使います。

と言うより、Visual Studio のデザイナを使って作っていくと自動的にそうなります。以下の画像を見てください。

[ビジネスオブジェクトの選択]ドロップダウンから TableAdapter を選択

イメージ説明

上の画像で[次へ]に進むと、自動的に GatData が選択されている

イメージ説明

ちなみに、型付 DataSet / DataTable + TableAdapter を作る際、update, insert, delete 用のメソッドも生成するようにした場合は、上の画像の UPDATE, INSERT, DELETE タブにはそのためのメソッドも設定されています。

DataObjectMethodAttribute 属性が TableAdapter のコードに自動的に付与されるので、Visual Studio のデザイナはそれを見て設定するようです。

ObjectDataSource を使わないで自力でコードを書くという場合は、自分のコードの合わせて使いやすい方を使えば良いと思います。

なお、余談ですが、Windows Forms アプリで型付 DataSet / DataTable + TableAdapter を使う場合、デザイナで作ると Fill の方を使いますが、それには型付 DataSet / DataTable のインスタンスへの参照を保持しておくという理由があります。Web アプリでは ViewState とか Session を使わない限りそういうことはできないので GetData の方が使いやすそうです。

【追記】

表形式でデータを表示したいわけではなく、単にデータベースからデータを取得して、その値によって処理を分岐したい場合、質問文に追記させていただいたプログラムのFillメソッドまたはGetDataメソッドで両方とも同じようにデータを取得できると思います。

データを取得してくるという意味では、同じ結果になると思いますが、どのようにFillメソッドとGetDataメソッドを使い分ければよいのでしょうか。

上の回答に "自力でコードを書くという場合は、自分のコードの合わせて使いやすい方を使えば良いと思います "と書いた通りです。

・・・が、それで終わりにしては身も蓋もなさそうなので、もう少し詳しい話を以下に追記しておきます。

質問者さんの例「単にデータベースからデータを取得して、その値によって処理を分岐」で、質問者さんがそのためのカスタムクラスを作るとして、そのカスタムクラスに DataTable を渡すのにどうするかによります。そこには組織の設計思想・ルール・質問者さんの好み等々が関係するはずです。

今質問者さんから提供されている情報では、そのあたりは他人は知る由もないので、自分でよく考えて決めてくださいという話にならざるを得ません。

ちなみに、上に書いた ObjectDataSource の場合は、SelectMethod プロパティにデータを取得するために呼び出すメソッドの名前を設定するという設計になっているので GetData を使っています。

質問者さんが作るカスタムクラスもそういう設計にするなら GetData を使うことになると思います。

ただ、単純に DataTable が返ってくればいいということではなく、Fill メソッドの戻り値が欲しいとか、既存の DataTable に追加するようにしたい場合は Fill を使うということになると思います。

ウィザードが生成するコードを見て考えてみてください。以下に上の回答で例に使った TableAdapter のコードを参考に載せておきます。

public virtual int Fill(Northwind.ProductsDataTable dataTable) { this.Adapter.SelectCommand = this.CommandCollection[0]; if ((this.ClearBeforeFill == true)) { dataTable.Clear(); } int returnValue = this.Adapter.Fill(dataTable); return returnValue; } public virtual Northwind.ProductsDataTable GetData() { this.Adapter.SelectCommand = this.CommandCollection[0]; Northwind.ProductsDataTable dataTable = new Northwind.ProductsDataTable(); this.Adapter.Fill(dataTable); return dataTable; }

そもそも「単にデータベースからデータを取得して、その値によって処理を分岐」という目的に型付 DataSet / DataTable + TableAdapter を使うのが適切かという話を考えるべきと思いますが、その話は今後の課題ということで・・・

投稿2021/02/18 01:58

編集2021/02/20 01:37
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazu0630

2021/02/19 14:43 編集

前回に引き続き、ご回答いただき、ありがとうございます。 ご回答いただきました内容を確認させていただきましたが、理解できませんでした・・。 なので、初めの質問文に内容を追記しました。 例えば、Webアプリを作成したいという前提でお話をさせていただきます。 表形式でデータを表示したいわけではなく、単にデータベースからデータを取得して、その値によって処理を分岐したい場合、質問文に追記させていただいたプログラムのFillメソッドまたはGetDataメソッドで両方とも同じようにデータを取得できると思います。 データを取得してくるという意味では、同じ結果になると思いますが、どのようにFillメソッドとGetDataメソッドを使い分ければよいのでしょうか。
退会済みユーザー

退会済みユーザー

2021/02/20 00:46

回答に「自力でコードを書くという場合は、自分のコードの合わせて使いやすい方を使えば良いと思います。」と書いた通りです。 今質問者さんから提供されている情報だけではホントにそれ以上答えようがないのですが、それで終わりにしては身も蓋もなさそうなので、後で回答欄にもう少し詳しい話を追記しておきます。
kazu0630

2021/02/20 05:06

ご回答いただき、ありがとうございます。 また、情報が不足しており、申し訳ありません。 最初の質問欄に「■追記(2021 2/20)」というところで、追加の質問をさせていただきました。 お手数ですが、ご確認いただけますと幸いです。 質問事項が増えてしまい、申し訳ありません・・。
退会済みユーザー

退会済みユーザー

2021/02/20 05:25

一つの疑問の答えが次の疑問を生んで、次から次へと質問を繰り返すのは好ましくないです。 最初の質問の「FillメソッドとGetDataメソッドの使い分け」には回答済みです。それの回答が分からないというのなら(分からないはずはないと思ってますが)、このスレッドではそのことについてのみ質問してください。 スレッドの表題と違うことは新たに別のスレッドを立てて質問してください。 Teratail は「質問と回答を通してお互いに知識や情報を交換・共有する場所」ということですので、後から検索などでここを訪れた人も情報が共有できるようにするには、一つのスレッドでは一つの質問とそれに対する回答に絞るのが好ましいのは理解できますよね? 次から次へと別のことを質問されると後でこのスレッドを訪れた人には訳が分からなくなりますから。 https://teratail.com/help/question-tips
kazu0630

2021/02/20 08:53

ご指摘いただきましたので、追加の質問については、別スレッドで質問をさせていただくことにしました。 なお、本日質問に追記した件については、削除致しました。 ひとまず、本質問に関しては、ご回答をいただきましたので、クローズとさせていただきます。 ご回答いただき、ありがとうございました。 ■本スレッドに関する追加質問 ASP.NET データベースからデータを取得する際に、カスタムクラスを作成する場面について https://teratail.com/questions/323701 ASP.NET Fillメソッドの使い方について https://teratail.com/questions/323704 ASP.NET 型付きデータセットとは https://teratail.com/questions/323706
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問