- - PR -
【質問】DataReader 使用中の DB検索について
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-08-25 16:41
例えば、以下のような処理をしているとします。
「★A★」の箇所で、読み込んだある列のデータを元に、別テーブルから値を取得したいような場合、みなさんはどのような手法を取られますか? 本当なら、SQL文を変更し、同時に取得するようにしてしまえば1番簡単だと思いますが、それが出来ない場合と仮定します。 上記処理はあるクラス内で行なわれている処理なのですが、私は上記処理の前に事前に必要なテーブルの全データ(必要な列のみ)を取得しておき、それを ArrayList にセットし、クラスに渡し、クラス内で ArrayList 内から検索して取得する、という回りくどい(というか、非効率な)方法しか思いつきませんでした。 きっと、もっと効率的な方法があるのだろうと思い、質問させていただきました。 よろしくお願い致します。 | ||||
|
投稿日時: 2006-08-25 16:48
どのようなやり方が効率的かはそれぞれのデータの量などによって変わってくるとは
思いますが。。。 データベースへの問い合わせを行いたい状況だったら、もう1つDataReader作って そのDataReader使ってデータをとってくるかな。 コネクションプーリングが効いてるならデータベースへの接続はそれほど高価な 処理にならないだろうし。 | ||||
|
投稿日時: 2006-08-25 16:55
さかもとです。
以前同じ質問を 私の投稿 したところ、 ひろれいさんの??? を参考にさせていただきました。(別件??) リンク先とはちょっと違いますけど、どっとねっとふぁんさんがおっしゃる方法を一番多く利用しています。 | ||||
|
投稿日時: 2006-08-25 16:55
ごめん。スレとあんま関係ないけどさ。
ここさ。めっちゃキモいとか思わない? 俺ならこう書く。 While (oReader.Read()) '略 End While | ||||
|
投稿日時: 2006-08-25 17:09
別テーブルがどのような内容なのか?、によると思います。 単純に、SQL で都度1レコードずつアクセスさせるのもアリだと思います。 それなりの物量があって、同じレコードが繰り返しアクセスされるような性質のものなら、上記の方法で取得したデータをキャッシュとして hashtable に置いて、常に hashtable になければテーブルを読みに行くようにしても良いかも知れませんね。 全般的にアクセスするなら、全部 hashtable に入れちゃうとか、dataset に読み込んで where する方法も考えられるかな・・・ 結局、皆さんどうしてるんでしょう、って僕も質問したくなってきましたw | ||||
|
投稿日時: 2006-08-25 17:16
>どっとねっとふぁんさん
なるほど! DataReader を2個用意するという手もありますね。 どうして思いつかなかったんだろう・・・orz >さかもとさん 別件ですね(^_^;) あの時は、今よりも初心者の時で、更新→検索のやり方や、Try の括り方が分からずに教えていただいておりました。 どっとねっとふぁんさんのやり方に気付けば、確かに同じですね・・・ >ぶさいくろうさん やはりキモいですか。そうですよね。 自分でもそう思ったので、修正しました。 <While 文を知らなかったわけではありません。柔軟な思考が足らなかったと思います(自己弁護)> ↑センスがねーだけだろ!な!(はい、その通りです・・・orz ご指摘ありがとうございますm(_ _)m | ||||
|
投稿日時: 2006-08-25 17:33
そんな餌に俺がこんにちはクマー(AA略)。
私の場合は ExecuteReader を使ったことがないので(本当)基本的には DataTable などに一度入れたものを使いまわします。 もう少し詳しく書くと、DataTable に Fill したあとで、ループの外で DataView を作成し、ループ中は RowFilter を設定することで存在確認を行 う、というパターンが主です。 # ハマちゃ…R・田中一郎さんと同じ考えでしょうか こんな感じですが、どうでしょうか。 Do Until はともかく、If は1行にせずに EndIf で囲もうぜ!と林晴比古先生も 言っておられました(サンプルだから削っただけかも)。 _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 | ||||
|
投稿日時: 2006-08-25 18:20
しまった。こう書いてる。 Do While oReader.Read() 更に関係ないけど、False である事を期待する場合は 式 = False じゃなくて (Not 式) って書いてます。 |