C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: ObjectDataSourceのSELECT文を取得


(過去ログ 132 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■77725 / inTopicNo.1)  ObjectDataSourceのSELECT文を取得
  
□投稿者/ きゅう (1回)-(2015/11/19(Thu) 11:23:42)

分類:[ASP.NET (C#)] 

お世話になります。

ASP.NET 4.5 C#でWEBサイトを作っております。

WebformにGridViewを配置し、ObjectDataSourceをバインドしており、
ObjectDataSourceでは、「ページング」、「ソート」、「画面で指定した条件(InputParameters)」を
パーシャルクラスのセレクトメソッドに渡してデータを取得しています。

このデータをCSVに出力したいと思い、ジェネリックハンドラを作成し、
その中でDBから再取得して出力しようと考えております。

ただ、CSV出力ボタンでジェネリックハンドラに飛ばす際、「画面で指定した条件」の渡し方で悩んでいます。

画面で条件指定 ⇒ 検索ボタン ⇒ 画面で条件変更 ⇒ CSV出力ボタン

と操作した場合、GridViewに表示されている結果とCSVの結果が異なるリスクが発生するように思えます。

ObjectDataSourceに指定した直近のInputParametersを取得する方法はありますでしょうか?
もしくは直近のセレクトメソッドで得られたSQL文を取得する方法はありますでしょうか?

また、方法が無い場合、画面で指定した条件をhiddenなどで保持しとこうと思っていますが、
他にやり方、ありましたら、教えて頂けると助かります。
(GridViewのデータ自体を渡そうとも考えましたが、そもそもページ分しか取得していないので却下でした。)

宜しくお願いします。




引用返信 編集キー/
■77726 / inTopicNo.2)  Re[1]: ObjectDataSourceのSELECT文を取得
□投稿者/ WebSurfer (706回)-(2015/11/19(Thu) 12:16:17)
No77725 (きゅう さん) に返信

回答でなく質問ですみませんが、不明点が多すぎます。

> パーシャルクラスのセレクトメソッドに渡してデータを取得しています。

以下の記事にあるように表示するページの部分のみ DB からレコードを取得するためのクラス/メ
ソッドを実装しているということですか?

ObjectDataSource でページング
http://surferonwww.info/BlogEngine/post/2010/08/26/Paging-with-ObjectDataSource.aspx

違うのであれば、どういう意味か具体的に書いてください。 


> 画面で条件指定 ⇒ 検索ボタン ⇒ 画面で条件変更 ⇒ CSV出力ボタン
> と操作した場合、GridViewに表示されている結果とCSVの結果が異なるリスクが発生するように思えます。

「画面で条件変更」して表示される内容をユーザーが確認した後「CSV出力ボタン」をクリックする
のですよね。

で、「画面で条件変更」で DB からデータを抽出した時点から「CSV出力ボタン」をクリックして再度
DB からデータを取得するまでの間に、誰かが DB を変更する可能性のことをリスクと言ってますか?

そうだとするとページングの際にも変更される可能性はあるのですが、それは気にしない?

違うのであれば、どういうリスクか具体的に書いてください。

上記の想像が合っているとすると、

> ObjectDataSourceに指定した直近のInputParametersを取得する方法はありますでしょうか?
> もしくは直近のセレクトメソッドで得られたSQL文を取得する方法はありますでしょうか?

と言うようなことをしても無駄だと思うのですが? やっぱり私の想像は違っている?

> 画面で指定した条件をhiddenなどで保持しとこうと思っていますが、
> 他にやり方、ありましたら、教えて頂けると助かります。
>(GridViewのデータ自体を渡そうとも考えましたが、そもそもページ分しか取得していないので却下でした。)

「画面で条件変更」の時点から誰かが DB を変更する可能性があって、「CSV出力ボタン」をクリックで
出力する CSV は「画面で条件変更」の時点のものでかつ全ページが必要ということであれば、ViewState
なり Session なりにその時点のデータを保持しておくほか現実的な手段はなさそうです。

でも、そういうことをすると、一番上に書いた想像「表示するページの部分のみ DB からレコードを取
得」が意味のないものになってしまいますけど、どうします?

引用返信 編集キー/
■77728 / inTopicNo.3)  Re[2]: ObjectDataSourceのSELECT文を取得
□投稿者/ ???イ (1回)-(2015/11/19(Thu) 13:31:57)
情報が不足しており申し訳ございませんでした。

> 以下の記事にあるように表示するページの部分のみ DB からレコードを取得するためのクラス/メ
> ソッドを実装しているということですか?
>
> ObjectDataSource でページング
> http://surferonwww.info/BlogEngine/post/2010/08/26/Paging-with-ObjectDataSource.aspx
>
> 違うのであれば、どういう意味か具体的に書いてください。 

⇒ はい。まさにこのやり方です。この例の「GetDataByIndexメソッド」にパラメータを追加し、
 検索ボタンクリック時に、このパラメータに画面で入力した条件をInputParametersで動的に追加して渡してます。



> 「画面で条件変更」して表示される内容をユーザーが確認した後「CSV出力ボタン」をクリックする
> のですよね。
>
> で、「画面で条件変更」で DB からデータを抽出した時点から「CSV出力ボタン」をクリックして再度
> DB からデータを取得するまでの間に、誰かが DB を変更する可能性のことをリスクと言ってますか?
>
> そうだとするとページングの際にも変更される可能性はあるのですが、それは気にしない?
>
> 違うのであれば、どういうリスクか具体的に書いてください。

⇒ 「画面で条件変更」は入力値を変える動作になります。
  「検索ボタンのクリック」を行わずに「CSV出力ボタンのクリック」でポストが発生した場合、
  ページの見た目上、「条件は変わっている」のに「CSVの内容と違う」という状況を恐れております。


> 「画面で条件変更」の時点から誰かが DB を変更する可能性があって、「CSV出力ボタン」をクリックで
> 出力する CSV は「画面で条件変更」の時点のものでかつ全ページが必要ということであれば、ViewState
> なり Session なりにその時点のデータを保持しておくほか現実的な手段はなさそうです。

⇒ この状況は想定していなかったのですが、DBについては今回、最新内容がCSVに出れば大丈夫です。
  といっても、GridViewの内容と違うという意味では同じですので、
  「検索ボタンのクリック時」のパラメータをViewStateかSessionに保存するのが現実的ということでしょうか。


検索ボタンクリック時に一度は設定した、ObjectDataSourceのInputParametersでしたので、
どこかに保持されているかと思い、質問させて頂きました。

やはりViewStateで保持してSessionで渡すというのが常道なのでしょうか。
引用返信 編集キー/
■77732 / inTopicNo.4)  Re[3]: ObjectDataSourceのSELECT文を取得
□投稿者/ WebSurfer (707回)-(2015/11/19(Thu) 15:12:10)
No77728 (???イ さん) に返信

「きゅう」さん=「???イ」さんですよね?

名前には特別注意を払っていただきたいです。ときどき捨てアカを使って匿名で書き込む人
がいて、自分はそういう人は相手にしたくないので。

> 「画面で条件変更」は入力値を変える動作になります。
> 「検索ボタンのクリック」を行わずに「CSV出力ボタンのクリック」でポストが発生した場合、
> ページの見た目上、「条件は変わっている」のに「CSVの内容と違う」という状況を恐れております。

最初の質問では、

> 画面で条件指定 ⇒ 検索ボタン ⇒ 画面で条件変更 ⇒ CSV出力ボタン

ということでしたが、「画面で条件指定」の時点で既に「CSV出力ボタン」が表示されていて、
ユーザーは「検索ボタン」と「画面で条件変更」のステップをスキップでき、「画面で条件指
定」のページでユーザーが条件を入力後即「CSV出力ボタン」をクリックすると、ユーザーが入
力した条件と CSV の内容が違ってしまうと言ってますか?

そういうのは Web アプリの作り方でなんとでも対応できるので「リスク」という言い方は変な
のですか・・・

例えば、

(1) ユーザーが「検索ボタン」をクリックした後なら問題ないのなら、それまで「CSV出力ボタ
  ン」は非表示にしておく。

(2) 上記が NG なら、「CSV出力ボタン」では必ずポストバックがかかるようにしておき、サー
  バー側でユーザーが入力した条件を取得し、ハンドラには条件をクエリ文字列で渡す。

(3) ポストバックしないで、例えば window.open('download.aspx' ...) とかでハンドラを呼び
  出すなら、クライアントスクリプトでユーザーが入力した条件を取得し、ハンドラには条件
  をクエリ文字列で渡す。

で対応できると思います。


> 「検索ボタンのクリック時」のパラメータをViewStateかSessionに保存するのが現実的ということでしょうか。

ユーザーが「検索ボタン」をクリックしないで「CSV出力ボタン」をクリックしてしまうから
発生する問題なのではないのですか? であれば、「パラメータをViewStateかSessionに保存」
はできませんよね????

引用返信 編集キー/
■77736 / inTopicNo.5)  Re[4]: ObjectDataSourceのSELECT文を取得
□投稿者/ きゅう (2回)-(2015/11/19(Thu) 16:31:41)
申し訳ありません。「きゅう」=「???イ」でした。
以後、注意します。

そして、さらに情報不足ですみません。
検索項目、検索ボタン、GridView、CSV出力ボタン、全て同ページ内に配置しております。

> ユーザーは「検索ボタン」と「画面で条件変更」のステップをスキップでき、「画面で条件指
> 定」のページでユーザーが条件を入力後即「CSV出力ボタン」をクリックすると、ユーザーが入
> 力した条件と CSV の内容が違ってしまうと言ってますか?

⇒ はい。おっしゃるとおりです。「画面で条件変更」という言い方が悪かったのかもしれません。
  例としては、 ”あ”という文字をテキストボックスに入力し、検索ボタンを押して、GridViewに”あ”で検索した結果が反映されます。
  次にテキストボックスの”あ”を、”い”に変更し、検索ボタンを押さずにCSV出力ボタンをクリックします。
  GridViewは”あ”の検索結果のまま、CSVは”い”の検索結果が出力されます。

 

> (1) ユーザーが「検索ボタン」をクリックした後なら問題ないのなら、それまで「CSV出力ボタ
>   ン」は非表示にしておく。
>
> (2) 上記が NG なら、「CSV出力ボタン」では必ずポストバックがかかるようにしておき、サー
>   バー側でユーザーが入力した条件を取得し、ハンドラには条件をクエリ文字列で渡す。
>
> (3) ポストバックしないで、例えば window.open('download.aspx' ...) とかでハンドラを呼び
>   出すなら、クライアントスクリプトでユーザーが入力した条件を取得し、ハンドラには条件
>   をクエリ文字列で渡す。

⇒ ありがとうございます。
  (1)は、前提がお伝えできてなく申し訳なかったのですが、全て同一ページ内ですので、最初の検索で「CSV出力ボタン」を表示した後、「CSV出力ボタン」を非表示にするタイミングが無いので、難しいかと思います。
  (2)は、上記例でいうところの、テキストボックスに”い”が入った状態でポストバックがかかるので、
  結果、”あ”の状態が取れないと思われます。
  (3)も(2)と同様に、CSV出力ボタンを押したときは、テキストボックスは”い”なので、”あ”の状態が取れないと思います。

  理解力が無くすみません。認識が違ってますでしょうか・・・?
 


> ユーザーが「検索ボタン」をクリックしないで「CSV出力ボタン」をクリックしてしまうから
> 発生する問題なのではないのですか? であれば、「パラメータをViewStateかSessionに保存」
> はできませんよね????

⇒ これも前提をお伝えしてなかったのがいけないのですが、直近の検索ボタンクリック時のパラメータですので、
  例えばViewStateを使うとしたら、
  @検索文字”あ”を入力 ⇒ A「検索ボタン」をクリック⇒ BViewStateに”あ”を保存
   C検索文字”い”を入力 ⇒ D「CSVボタン」をクリック ⇒ EViewStateの文字(=”あ”)でDBから抽出しCSV出力処理
  となります。
  Cの後に「検索ボタン」をクリックしていれば、ViewStateには”い”が入り、Eで”い”のCSVが問題なく出力されます。
  と考えておりました。

CSV出力時に、この”あ”を取得する方法がhiddenやViewStateやSession以外であればと思ったのですが。。。
それでObjectDataSourceのプロパティから取れないかなと思った次第です。

文章の羅列になってしまいましたが、伝わりますでしょうか?
検索結果に対する処理はめずらしくないように思えるのですが、みなさんどのように対処しているのでしょう・・・




引用返信 編集キー/
■77742 / inTopicNo.6)  Re[5]: ObjectDataSourceのSELECT文を取得
□投稿者/ WebSurfer (708回)-(2015/11/19(Thu) 18:11:35)
No77736 (きゅう さん) に返信
> 文章の羅列になってしまいましたが、伝わりますでしょうか?

ぜんぜん分かりません。すみませんが今日はもうギブアップ。明日気力が戻ってきたら
もう一回読んで理解できたら返答します。
引用返信 編集キー/
■77748 / inTopicNo.7)  Re[5]: ObjectDataSourceのSELECT文を取得
□投稿者/ WebSurfer (709回)-(2015/11/20(Fri) 11:35:17)
No77736 (きゅう さん) に返信

[CSV出力ボタン] クリックで DB からデータを抽出し CSV ファイルを作って
ダウンロードする。その際のデータの抽出条件は:

(1) [CSV出力ボタン] クリック時点での TextBox へのユーザー入力を使う、or

(2) [CSV出力ボタン] クリック時点で表示されている GridView のデータを抽出
  した条件と同じものを使う、or

(3) その他(その場合は詳しく書いてください)

のどれなんでしょう? 自分は (1) だと思ったのですが、質問者さんの "あ" と
か "い" とかの説明から見ると (2) なのですかね?

で、(2) であるとして、隠しフィールド、ViewState、Session などを使って (2)
の条件を保持する方法は質問者さんは知っているので聞く必要はない。

なので、要するに今回の質問は、

他にもっと簡単・スマートな方法(例えば、ObjectDataSource のプロパティから
取得するなど)があれば教えてくれ。

・・・と言うことですか?

それなら、私の答えは「私の知る限りですが、そういう方法はありません」です。

ウラワザ的なことをすれば(例えば TextBox を継承したカスタムコントロールを
作って LoadViewState メソッドを override してそれで取得するとか)可能かも
しれませんが、そんなのは簡単でもスマートでもないです。

素直に ViewState を使うのが良いと思います。
引用返信 編集キー/
■77749 / inTopicNo.8)  Re[6]: ObjectDataSourceのSELECT文を取得
□投稿者/ きゅう (1回)-(2015/11/20(Fri) 12:10:38)
No77748 (WebSurfer さん) に返信
> ■No77736 (きゅう さん) に返信
>
> [CSV出力ボタン] クリックで DB からデータを抽出し CSV ファイルを作って
> ダウンロードする。その際のデータの抽出条件は:
>
> (1) [CSV出力ボタン] クリック時点での TextBox へのユーザー入力を使う、or
>
> (2) [CSV出力ボタン] クリック時点で表示されている GridView のデータを抽出
>   した条件と同じものを使う、or
>
> (3) その他(その場合は詳しく書いてください)
>
> のどれなんでしょう? 自分は (1) だと思ったのですが、質問者さんの "あ" と
> か "い" とかの説明から見ると (2) なのですかね?
>
> で、(2) であるとして、隠しフィールド、ViewState、Session などを使って (2)
> の条件を保持する方法は質問者さんは知っているので聞く必要はない。
>
> なので、要するに今回の質問は、
>
> 他にもっと簡単・スマートな方法(例えば、ObjectDataSource のプロパティから
> 取得するなど)があれば教えてくれ。
>
> ・・・と言うことですか?
>
> それなら、私の答えは「私の知る限りですが、そういう方法はありません」です。
>
> ウラワザ的なことをすれば(例えば TextBox を継承したカスタムコントロールを
> 作って LoadViewState メソッドを override してそれで取得するとか)可能かも
> しれませんが、そんなのは簡単でもスマートでもないです。
>
> 素直に ViewState を使うのが良いと思います。


⇒ ありがとうございます。仰るとおり、(2)の動きを希望しておりました。
  やはり、ViewStateを使うのが定石ということですかね。
  今回は、ViewStateでやってみようと思います。

  説明下手ですみませんでした。ありがとうございました。







引用返信 編集キー/
■77774 / inTopicNo.9)  Re[7]: ObjectDataSourceのSELECT文を取得
□投稿者/ WebSurfer (711回)-(2015/11/22(Sun) 11:41:46)
No77749 (きゅう さん) に返信

解決したようですし、他の回答者の方からのより良い提案もなさそうです
ので「解決済み」マークを付けておきます。
解決済み
引用返信 編集キー/
■77823 / inTopicNo.10)  Re[8]: ObjectDataSourceのSELECT文を取得
□投稿者/ きゅう (3回)-(2015/11/24(Tue) 13:35:01)
No77774 (WebSurfer さん) に返信
> ■No77749 (きゅう さん) に返信
>
> 解決したようですし、他の回答者の方からのより良い提案もなさそうです
> ので「解決済み」マークを付けておきます。

恐れ入ります。ありがとうございました。

引用返信 編集キー/
■77824 / inTopicNo.11)  Re[9]: ObjectDataSourceのSELECT文を取得
□投稿者/ とっちゃん (310回)-(2015/11/24(Tue) 13:59:07)
No77823 (きゅう さん) に返信
> ■No77774 (WebSurfer さん) に返信
>>■No77749 (きゅう さん) に返信
>>
>>解決したようですし、他の回答者の方からのより良い提案もなさそうです
>>ので「解決済み」マークを付けておきます。
>
> 恐れ入ります。ありがとうございました。
>
老婆心ながら。。。
解決済みのスレッドでそのままコメントしてしまうと
チェックが外れてしまうので、左下にある解決済みチェックを確認しましょう。

ということで、再びチェック。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -