型付 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/19 14:43 編集
退会済みユーザー
2021/02/20 00:46
2021/02/20 05:06
退会済みユーザー
2021/02/20 05:25
2021/02/20 08:53