- PR -

【質問】DataReader 使用中の DB検索について

投稿者投稿内容
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-08-25 16:41
例えば、以下のような処理をしているとします。
コード:
Dim oCommand As OracleCommand = Nothing
Dim oReader As OracleDataReader = Nothing
Dim sSql As String

Dim oConn As New OracleConnection(System.Configuration.ConfigurationManager.AppSettings("ConnectString"))

Try
  oConn.Open()
    Try
    sSql = 複雑なSQL文
    oCommand = New OracleCommand(sSql, oConn)
    oReader = oCommand.ExecuteReader

    Do Until oReader.Read() = False
      処理
      ★A★
      処理
    Loop
  Finally
    If Not oReader Is Nothing Then oReader.Close()
    If Not oCommand Is Nothing Then oCommand.Dispose()
  End Try
Finally
  If Not oConn Is Nothing Then oConn.Close()
  If Not oConn Is Nothing Then oConn.Dispose()
End Try


「★A★」の箇所で、読み込んだある列のデータを元に、別テーブルから値を取得したいような場合、みなさんはどのような手法を取られますか?

本当なら、SQL文を変更し、同時に取得するようにしてしまえば1番簡単だと思いますが、それが出来ない場合と仮定します。

上記処理はあるクラス内で行なわれている処理なのですが、私は上記処理の前に事前に必要なテーブルの全データ(必要な列のみ)を取得しておき、それを ArrayList にセットし、クラスに渡し、クラス内で ArrayList 内から検索して取得する、という回りくどい(というか、非効率な)方法しか思いつきませんでした。

きっと、もっと効率的な方法があるのだろうと思い、質問させていただきました。
よろしくお願い致します。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-08-25 16:48
どのようなやり方が効率的かはそれぞれのデータの量などによって変わってくるとは
思いますが。。。

データベースへの問い合わせを行いたい状況だったら、もう1つDataReader作って
そのDataReader使ってデータをとってくるかな。
コネクションプーリングが効いてるならデータベースへの接続はそれほど高価な
処理にならないだろうし。
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2006-08-25 16:55
さかもとです。
以前同じ質問を
私の投稿

したところ、

ひろれいさんの???

を参考にさせていただきました。(別件??)

リンク先とはちょっと違いますけど、どっとねっとふぁんさんがおっしゃる方法を一番多く利用しています。

ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-08-25 16:55
ごめん。スレとあんま関係ないけどさ。
引用:

Do Until oReader.Read() = False


ここさ。めっちゃキモいとか思わない?
俺ならこう書く。
While (oReader.Read())
'略
End While
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-08-25 17:09
引用:

ひろれいさんの書き込み (2006-08-25 16:41) より:

「★A★」の箇所で、読み込んだある列のデータを元に、別テーブルから値を取得したいような場合、みなさんはどのような手法を取られますか?


別テーブルがどのような内容なのか?、によると思います。
単純に、SQL で都度1レコードずつアクセスさせるのもアリだと思います。

それなりの物量があって、同じレコードが繰り返しアクセスされるような性質のものなら、上記の方法で取得したデータをキャッシュとして hashtable に置いて、常に hashtable になければテーブルを読みに行くようにしても良いかも知れませんね。

全般的にアクセスするなら、全部 hashtable に入れちゃうとか、dataset に読み込んで where する方法も考えられるかな・・・

結局、皆さんどうしてるんでしょう、って僕も質問したくなってきましたw
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-08-25 17:16
>どっとねっとふぁんさん

なるほど!
DataReader を2個用意するという手もありますね。
どうして思いつかなかったんだろう・・・orz

>さかもとさん

別件ですね(^_^;)
あの時は、今よりも初心者の時で、更新→検索のやり方や、Try の括り方が分からずに教えていただいておりました。
どっとねっとふぁんさんのやり方に気付けば、確かに同じですね・・・

>ぶさいくろうさん

やはりキモいですか。そうですよね。
自分でもそう思ったので、修正しました。
 <While 文を知らなかったわけではありません。柔軟な思考が足らなかったと思います(自己弁護)>
↑センスがねーだけだろ!な!(はい、その通りです・・・orz

ご指摘ありがとうございますm(_ _)m
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-08-25 17:33
そんな餌に俺がこんにちはクマー(AA略)。

私の場合は ExecuteReader を使ったことがないので(本当)基本的には
DataTable などに一度入れたものを使いまわします。
もう少し詳しく書くと、DataTable に Fill したあとで、ループの外で
DataView を作成し、ループ中は RowFilter を設定することで存在確認を行
う、というパターンが主です。
# ハマちゃ…R・田中一郎さんと同じ考えでしょうか

こんな感じですが、どうでしょうか。

Do Until はともかく、If は1行にせずに EndIf で囲もうぜ!と林晴比古先生も
言っておられました(サンプルだから削っただけかも)。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2006-08-25 18:20
引用:

ぶさいくろうさんの書き込み (2006-08-25 16:55) より:
俺ならこう書く。
While (oReader.Read())


しまった。こう書いてる。
Do While oReader.Read()

更に関係ないけど、False である事を期待する場合は
式 = False
じゃなくて
(Not 式)
って書いてます。

スキルアップ/キャリアアップ(JOB@IT)