QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

SqlReaderに格納された行データの数

初投稿させていただきました。今後ともよろしくお願いします。
[環境]
VB.NET
SQL Server2000

Sql文を発行し
SqlReaderで
------------------------
'SQL文
sqlCmd = New SqlClient.SqlCommand(xxxxxxxxxx where xxxx= xxxxx, sqlCn)

sqlReader = sqlCmd.ExecuteReader()

'テキストボックスに貼り付ける
Do While (sqlReader.Read)
textBox_Id(i).Text = sqlReader("利用者ID")
i = i + 1
loop

↑doで回す前に、Readerに格納されている数を知りたいのですがどうすればよろしいでしょうか?
例えばArrayListを使用した場合は、「.count」格納数がわかるのですが、それと同じようにReaderに格納されている数の値を取得したいです。

プログラム暦がまだ浅いのでよろしくお願いします。

質問者:オベ

回答

対象のレコードが存在するかどうかならHasRowsプロパティで分かりますが、件数までは残念ながら無理です。
事前にSELECT COUNTを発行して件数を取得する位でしょうか。
SqlDataReaderクラスを拡張しようと思っても継承できませんしね。

投稿者:いーた

編集 履歴 (0)

SqlDataReaderは件数取得が出来ないので、最初にCount文で確認するしかないと思います。


-----------------------------
'SQL文
sqlCmd = New SqlClient.SqlCommand("select count(*) xxxxxxxxx where xxxx= xxxxx", sqlCn)

'件数取得
RecCnt = sqlCmd.ExecuteScalar
-----------------------------

投稿者:fizzy

編集 履歴 (0)

ご返答ありがとうございます。
Readerのプロパティになかったので無理かなと思いまして、いろいろ探っていました。皆さんが書き込まれたようにやはり無理そうですね。教えていただいたCount文のロジックでなんとか対処してみようと思います。

投稿者:オベ

編集 履歴 (0)

 SqlReaderは、「格納」されているのではなく、その名の通り、「読み込む」という動作をすることが仕事なんですよね。

 で、「なんのために個数が必要」なのでしょう。単に個数だけが必要なら、Readerを作るまでもなく、ExecuteScularでCOUNTだけ取ってくれば間に合います。データも個数も必要なら、データをストアしてしまってから個数を出しても、遅くはないでしょう。データをストアするために確保する領域、という意味であれば、ArrayList, DataTableなどは自動的に拡張してくれます。
 
 COUNTだけのSQLを発行しその後にデータを取る、ということをすると、プログラムとデータベースの間の情報のやりとり(ラウンドトリップ)が2回発生します。これは、あまりいい方法ではありません。


投稿者:Jitta

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。