- PR -

OleDbCommandもしくはOleDbDataReaderでのレコード数

1
投稿者投稿内容
ナツメ
会議室デビュー日: 2004/09/16
投稿数: 4
投稿日時: 2004-09-16 17:46
初めて投稿させて頂きます。
今練習で勉強しているのですが、Access データベースの
レコード数の習得方法がわかりません。
以前なら、「RecordCount」などでレコード総数を習得
できていましたが.NETになってからはSQLで抽出したデータの
レコード数は習得できないのでしょうか。

また、タイトルの用にOleDbCommandもしくはOleDbDataReader
で習得できるのでしょうか。

PS:使用したいのはデータグリッドやデータービュー、
データセットなどを他のコンポーネントを使用しないで
プログラム上でのレコード数が知りたいんです。
(レコード数分、For文やDoでループさせたいんです。)

よろしくお願いします。

とっと
大ベテラン
会議室デビュー日: 2004/03/25
投稿数: 197
投稿日時: 2004-09-16 18:05
どうもです。

引用:

ナツメさんの書き込み (2004-09-16 17:46) より:

(レコード数分、For文やDoでループさせたいんです。)




Dim dr As OleDb.OleDbDataReader

DataReaderでレコードが取得できたら、

Do While (dr.Read())

 〜 処理 〜

Loop

です。

詳しくはヘルプ等でお調べください。
ナツメ
会議室デビュー日: 2004/09/16
投稿数: 4
投稿日時: 2004-09-17 09:02
とっと様 即レスだったみたいでありがとうございます。

「Read」 のヘルプには
 次の行がある場合は true 。それ以外の場合は false 。

とありましたのでループで利用できるとは思いませんでした
とりあえず「Read」を使って色々試してみます。

gorisaku
ベテラン
会議室デビュー日: 2004/04/17
投稿数: 95
投稿日時: 2004-09-17 11:57
ナツメさん どうもです。

引用:

今練習で勉強しているのですが、Access データベースの
レコード数の習得方法がわかりません。
以前なら、「RecordCount」などでレコード総数を習得
できていましたが.NETになってからはSQLで抽出したデータの
レコード数は習得できないのでしょうか。

また、タイトルの用にOleDbCommandもしくはOleDbDataReader
で習得できるのでしょうか。

PS:使用したいのはデータグリッドやデータービュー、
データセットなどを他のコンポーネントを使用しないで
プログラム上でのレコード数が知りたいんです。
(レコード数分、For文やDoでループさせたいんです。)



For文やDoをどうしても使用しないといけないのであれば
どうしようもありませんが、レスポンスのことを
考えるとSQL文でCOUNT()を使用したほうが早いと思われます。
DataSetを使用しても簡単に取得できると思います。
がんばってください!
ナツメ
会議室デビュー日: 2004/09/16
投稿数: 4
投稿日時: 2004-09-17 11:57
すみません。もう一つお聞きします。
ヘルプに乗っていたんですが、
「結果セットを返すデータ コマンドの実行」のVBの項目を参照

 Dim s As String = ""
 While dreader.Read()
  s &= dreader("au_id").ToString() _
  & vbTab & dreader("au_fname").ToString() _
 & " " & dreader("au_lname").ToString & ControlChars.CrLf
 End While
 TextBox1.Text = s
 dreader.Close()

と例があったので同じように

 Dim aaa As Integer
aaa = 0
While oDataReader.Read()
aaa = aaa + 1
End While

ってやってみたのです。確かにレコード数をカウントしてくれるのですが
最終行以降がエラーになってしまいます。
 エラー内容「行および列にデータが存在しません」

カウントを行いその後の処理に繋げたかったのですが、
DB接続のTry Catch のエラーに行ってしまいます。

 If oDataReader.Read() then

を付けてしまうと最初の行で終わってしまうんですが、
なにか方法ございませんでしょうか。


とっと
大ベテラン
会議室デビュー日: 2004/03/25
投稿数: 197
投稿日時: 2004-09-17 13:04
引用:

ナツメさんの書き込み (2004-09-17 11:57) より:

なにか方法ございませんでしょうか。




ご自分で調べて見てください。

存在しない行まで読みにいってエラーになっているんでしょう?

ループ文を変えてみるとか、レコード数がいくらで実際には何回ループしているのかとか。

レコード数はSQL変えたら分かるわけだし、Accessを使ってらっしゃるんでしたらクエリでレコード数が分かるわけだし・・・。

では、頑張ってみてください。^^

PS:

あと、エラーが起ったらその前後のコードも書きましょう。そのコードのどこでエラーが起ったのかを書かないと見る側は分からないですよ。

[ メッセージ編集済み 編集者: とっと 編集日時 2004-09-17 13:28 ]
nodera
大ベテラン
会議室デビュー日: 2003/09/08
投稿数: 200
投稿日時: 2004-09-17 14:21
こんにちは。

DataReaderについて理解されていないようなのでコメントしておきます。
このクラスはヘルプにも記述されているように「データベースから行の前方向ストリームを読み取る方法を提供」となっています。これの意味するところは「一度通った場所へは戻れない」です。
Read()メソッドを発行すると、カーソルのようなものが1レコード分次へ進みます。このカーソルはバックすることができません。最後まで読み出し(Read()=false)てしまったら、もう次は無いし最初にも戻れません。

もしその後の処理で最初から再びレコードを取得したいのであれば、再度DataReaderに同じものを読み返す必要があります。

他にもいろいろ(更新とか)やりたいのであれば、他の方も言っているようにDataSetを利用するほうがよいです。
ナツメ
会議室デビュー日: 2004/09/16
投稿数: 4
投稿日時: 2004-09-17 15:31
レス付けてくれた方々申し訳ありませんでした。
デバッグをよく確認してみましたら、Whileはうまくいっていました。
ただその後に、またOleDbDataReaderの値を参照しようとしていたので
エラーで弾かれていただけでした。

とっと様、こんな初歩的な凡ミスだったのにレス付けてくれて
感謝です。

それとgorisaku様、nodera様も情報色々と有り難うございます。
とりあえず、更新処理以前に、既存のデータを参照する方法
を調査していたのでReaderのみという形だったんです。

皆様有り難うございました
1

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