- - PR -
OleDbCommandもしくはOleDbDataReaderでのレコード数
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-09-16 17:46
初めて投稿させて頂きます。
今練習で勉強しているのですが、Access データベースの レコード数の習得方法がわかりません。 以前なら、「RecordCount」などでレコード総数を習得 できていましたが.NETになってからはSQLで抽出したデータの レコード数は習得できないのでしょうか。 また、タイトルの用にOleDbCommandもしくはOleDbDataReader で習得できるのでしょうか。 PS:使用したいのはデータグリッドやデータービュー、 データセットなどを他のコンポーネントを使用しないで プログラム上でのレコード数が知りたいんです。 (レコード数分、For文やDoでループさせたいんです。) よろしくお願いします。 | ||||
|
投稿日時: 2004-09-16 18:05
どうもです。
Dim dr As OleDb.OleDbDataReader DataReaderでレコードが取得できたら、 Do While (dr.Read()) 〜 処理 〜 Loop です。 詳しくはヘルプ等でお調べください。 | ||||
|
投稿日時: 2004-09-17 09:02
とっと様 即レスだったみたいでありがとうございます。
「Read」 のヘルプには 次の行がある場合は true 。それ以外の場合は false 。 とありましたのでループで利用できるとは思いませんでした とりあえず「Read」を使って色々試してみます。 | ||||
|
投稿日時: 2004-09-17 11:57
ナツメさん どうもです。
For文やDoをどうしても使用しないといけないのであれば どうしようもありませんが、レスポンスのことを 考えるとSQL文でCOUNT()を使用したほうが早いと思われます。 DataSetを使用しても簡単に取得できると思います。 がんばってください! | ||||
|
投稿日時: 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-09-17 13:04
ご自分で調べて見てください。 存在しない行まで読みにいってエラーになっているんでしょう? ループ文を変えてみるとか、レコード数がいくらで実際には何回ループしているのかとか。 レコード数はSQL変えたら分かるわけだし、Accessを使ってらっしゃるんでしたらクエリでレコード数が分かるわけだし・・・。 では、頑張ってみてください。^^ PS: あと、エラーが起ったらその前後のコードも書きましょう。そのコードのどこでエラーが起ったのかを書かないと見る側は分からないですよ。 [ メッセージ編集済み 編集者: とっと 編集日時 2004-09-17 13:28 ] | ||||
|
投稿日時: 2004-09-17 14:21
こんにちは。
DataReaderについて理解されていないようなのでコメントしておきます。 このクラスはヘルプにも記述されているように「データベースから行の前方向ストリームを読み取る方法を提供」となっています。これの意味するところは「一度通った場所へは戻れない」です。 Read()メソッドを発行すると、カーソルのようなものが1レコード分次へ進みます。このカーソルはバックすることができません。最後まで読み出し(Read()=false)てしまったら、もう次は無いし最初にも戻れません。 もしその後の処理で最初から再びレコードを取得したいのであれば、再度DataReaderに同じものを読み返す必要があります。 他にもいろいろ(更新とか)やりたいのであれば、他の方も言っているようにDataSetを利用するほうがよいです。 | ||||
|
投稿日時: 2004-09-17 15:31
レス付けてくれた方々申し訳ありませんでした。
デバッグをよく確認してみましたら、Whileはうまくいっていました。 ただその後に、またOleDbDataReaderの値を参照しようとしていたので エラーで弾かれていただけでした。 とっと様、こんな初歩的な凡ミスだったのにレス付けてくれて 感謝です。 それとgorisaku様、nodera様も情報色々と有り難うございます。 とりあえず、更新処理以前に、既存のデータを参照する方法 を調査していたのでReaderのみという形だったんです。 皆様有り難うございました |
1