ADO.NETのSqlDataReaderをADOのRecordSetのように使いたい

このQ&Aのポイント
  • SqlDataReaderについての質問なのですが、ADOでのレコードセットであった、EOFプロパティ(それに該当するものも)が見当たらず困っています。
  • レコードを最後まで書き出すことは、while(DataReader.read = True)でもできますが、ループの中に判定を入れて、条件次第ではレコードを進めないということができません。
  • ADO.NETのときはDO UNTIL RecordSet.Eof = True と、RecordSet.nextを組みせて柔軟に書き出しができていた分、ちょっと不便に感じています。
回答を見る
  • ベストアンサー

ADO.NETのSqlDataReaderをADOのRecordSetのように使いたい

いつもお世話になっております。 SqlDataReaderについての質問なのですが、ADOでのレコードセットであった、EOFプロパティ(それに該当するものも)が見当たらず困っています。 レコードを最後まで書き出すことは、while(DataReader.read = True)でもできますが、ループの中に判定を入れて、条件次第ではレコードを進めないということができません。 ADO.NETのときはDO UNTIL RecordSet.Eof = True と、RecordSet.nextを組みせて柔軟に書き出しができていた分、ちょっと不便に感じています。 EOFと同様のプロパティというのもあるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

お世話になります。 RecordSet.Eof = True DataReader.Read = False と同じです。 > ループの中に判定を入れて、条件次第ではレコードを進めないということができません。 以下の例では、SQL Server 2000 の Northwind データベースの Cusomers テーブルから値を取得し、 標準出力に 1 列目の値を出力します。 ただし、 1 列目の値が "ANTON" の場合、読み込み及び出力の処理を中断しています。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click   Dim con As SqlClient.SqlConnection = New SqlClient.SqlConnection(My.Settings.NorthwindConnectionString)   Try     con.Open()     Dim sc As SqlClient.SqlCommand = New SqlClient.SqlCommand("SELECT * FROM Customers", con)     Try       Dim reader As SqlClient.SqlDataReader = sc.ExecuteReader()       Try         While (reader.Read())           Dim str As String = reader.GetString(0)           Console.WriteLine(str)           If str = "ANTON" Then             reader.Close()             Exit While           End If         End While       Finally         If Not reader Is Nothing Then reader.Close()       End Try     Finally       If Not sc Is Nothing Then sc.Dispose()     End Try   Finally     If Not con Is Nothing Then con.Close() : con.Dispose()   End Try End Sub

関連するQ&A

  • (ADO)selectで取得できたレコードの総数

    SQL文にcount()を書かずにクエリを実行して、何レコードが得られたかを Do While Not rs.EOF  i = i + 1  rs.MoveNext Loop 以外の方法で知ることはできませんか? rsは場合によっては逆方向にrs.MovePrevみたいにできるらしいですが、今の環境では順方向しか対応していません。 環境はIIS、access、ADO、MDBです。

  • ACCESS ADOのMovePreviousについて

    毎度お世話になっております。 ACCESS2003を使用しています。 ACCESS ADOにて、レコードセットがeofになった後、 MovePreviousをし、MoveNextをし、 さらにもう一度MovePreviousをすると、 最終レコードの一つ前に戻ってしまいます。 テーブル1 フィールド1 フィールド2    1     あ    2     い    3     う    4     え    5     お コード Sub test()   Dim cn As New ADODB.Connection   Dim rs As New ADODB.Recordset   Set cn = CurrentProject.Connection   rs.Open "select * from テーブル1 order by フィールド1", cn, adOpenDynamic, adLockReadOnly   Do Until rs.EOF    rs.MoveNext   Loop   rs.MovePrevious   Debug.Print rs.Fields("フィールド1").Value   rs.MoveNext   rs.MovePrevious   Debug.Print rs.Fields("フィールド1").Value   rs.Close: Set rs = Nothing   cn.Close: Set cn = Nothing End Sub 一度目のdebug.printは5に、 二度目のdebug.printは4になります。 このような仕組みなのでしょうか。 ご教授お願いいたします。

  • レコードセットのループ処理でエラー・・・

    簡単なことだと思うのですが、解決できなくこまっております。お助けください。 以下のコーディングで、データの取得は出来ているのですが、「Do Until rs1.EOF」でエラーとなります。 SOURCE----------------------------------------- sql = "Select No from t01" Recordset.Open sql, dbc, 3 If rs1.EOF Then Response.Write "データナシ<BR>" ←表示されません。 else Do Until rs1.EOF ←この行でエラーとなります。 Response.Write "No=" & rs1("No").Value rs1.MoveNext Loop end if Error-------------------------------------------- ADODB.Field (0x80020009) BOF と EOF のいずれかが True になっているか、または現在のレコードが削除されています。要求された操作には、現在のレコードが必要です。 因みに、Do Untilを使用せず  Response.Write "No=" & rs1("No").Value  rs1.MoveNext  Response.Write "No=" & rs1("No").Value と記述すると正常にデータが表示されます。 「Do Until rs1.EOF」で発生するエラーの回避方法を御教示願います。

  • VBA ADOに関して

    お世話になります。 VBAに関して質問があります。 ADOでDBから値を取得する際、 TEXT型の値が全く取れてきません。 どなたか取得方法をご教授下さい。 宜しくお願い致します。 DB:Sybase OS: RedHat 8.0 Dim rs As ADODB.Recordset Dim sql As String sql = "select * from " & tblName //dbはADODB.Connection Set rs = db.Execute(sql) Do While Not rs.EOF //ここでTEXT型だと、取れてきません。  If IsNull(rs.Fields('Field名').Value) Then End If rs.MoveNext Loop

  • vb ado → vb2005 ado.net変換

    お世話になります。初めて投稿させていただきます。 VB6.0で下記のようなコードでコンボボックスcboMakerへフィールド値を格納しているのですがこのコードをVB2005のado.netで記述したいのですが可能でしょうか?可能であればどのようなコードを書けばよいのでしょうか。フィールドの値を1レコードづつ取得することは可能なのでしょうか? 初心者ですみません。宜しくお願いします。 Dim con As ADODB.Connection Dim rec As ADODB.Recordset Dim sql As String Dim recCnt As Long con = New ADODB.Connection con.ConnectionString "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & パス con.Open() rec = New ADODB.Recordset sql = "SELECT * FROM " & テーブル名 rec.Open(sql, con, adOpenStatic, adLockReadOnly) If rec.RecordCount < 1 Then 'レコードが存在しない MsgBox("未登録です。", G_MB_CAUTION, G_SYSTEM_NAME) Exit Function Else ReDim CboMakerId(rec.RecordCount) End If 'コンボボックスに値を挿入 ※「.List(recCnt)」から値を挿入する With Me.cboMaker .Clear() recCnt = 0 .List(recCnt) = "" .ItemData(recCnt) = 0 Do Until rec.EOF recCnt = recCnt + 1 .List(recCnt) = rec("Name") .ItemData(recCnt) = rec("ID") rec.MoveNext() Loop End With Me.cboMaker.ListIndex = 0 rec.Close() : rec = Nothing con.Close() : rec = Nothing End Function

  • BOF と EOF のいずれかが True になっ

    VBAのADOで 「BOF と EOF のいずれかが True になっているか、 または現在のレコードが削除されています。 要求された操作には、現在のレコードが必要です」 のエラーになる時に 「BOF と EOF のいずれかが True になっている」 なのか 「現在のレコードが削除されています」 なのか どちらのエラーなのか調べる方法はありますか?

  • DB2のデーターベースに、ADOで接続して、レコードを取得していますが

    DB2のデーターベースに、ADOで接続して、レコードを取得していますが、同じ事をして、取得出来るときと、できないときがあります。 できない時は、objRec.EOF=true になり、処理が終了してしまいます。 誰が、この原因の探り方や、ヒントなどわかる人がいたら、教えていただけませんでしょうか。 以下、ソースの引用 Set objCon = WScript.CreateObject("ADODB.Connection") strCon="DSN=mans;UID=admin;PWD=pass" objCon.Open strCon Set objRec=CreateObject("ADODB.Recordset") objRec.Open strSQL, objCon, adOpenStatic If objRec.EOF Then Wscript.Echo "no data!" WScript.quit End If 後の処理に進む

  • ページング処理

    すごく困っています。助けてくださいm(_ _)m VB6.0でオラクル9.0から情報をado接続でロードした時点で、全てのデータをデータグリッドに表示させています。  それを最大10件まで表示したいです。そして次へボタンをおすと次の10件を表示させたいです。戻るボタンを押すと前の10件を表示させたいです。どうしたらいいでしょうか? ado接続完了後   Set rec = cnn.Execute("select * from table") Do While Not rec.EOF 'recordsetを更新 rec.Refresh 'ADOのrecordsourceをdatagridに連結する Set DataGrid1.DataSource = rec.Recordset 見たいな感じで表示しています。  どうかよろしくお願いしますm(__)m

  • ループ処理の繰り返しについて

    お世話になっております。 単純なことで悩んでおります、どなたかわかるかたお願いいたします。 <% DO UNTIL SQLrs.EOF IF a=0 THEN %> 処理1 <% END IF SQLrs.MOVENEXT LOOP %> <% SQLrs.MOVEFIRST DO UNTIL SQLrs.EOF IF b=0 THEN %> 処理2 <% END IF SQLrs.MOVENEXT LOOP %> 上記のような処理順なのですが、問題は MoveFirstで先頭のレコードにもどらないのか、2回目のループ処理がうまく抽出できません。 原因はわかりますでしょうか?

  • Access2003(VBA)でADO接続時にルーターのセッション増加

    早速質問させていただきます。 WindowsXP上のAccess2003でDBServer(SQLSERVER2005Express)にADO接続でデータ要求を行うアプリを開発しました。 このアプリをDBServerがあるネットワークセグメント以外から実行するとルータのセッション数が見る見るうちに増加してルーターがハングアップしてしまいます。 調査してみたらADOのRecoredsetをMovenextする度にセッション数が増えるようです。そもそもADO接続では毎レコード毎?にセッションを張るような仕組みなのでしょうか? またこの現象を解消するにはどのような手法があるのでしょうか? ご教授のほどよろしくお願い致します。 -------------------------------------------------------------- Dim adoCON As New ADODB.Connection Dim adoRS As ADODB.Recordset '(1)ADOを使いSQL ServerのDBを開きます adoCON.Open "Driver={SQL Server};" & _ "server=SERVERNAME\SQLEXPRESS;          database=db_name; uid=sa; pwd=sa;" 'レコードセットの作成(SELECT文の実行) Set adoRS = adoCON.Execute("select * from 商品マスタ where 削除日=0") '//CSVデータ取り込み用配列の初期化 Erase arr() LineCount = 0 TblColCnt = 0 '最終レコードまで順読み込みを行う Do Until adoRS.EOF = True ReDim Preserve arr(ShouhinMSTMaxCol, LineCount) For cols = 1 To adoRS.Fields.Count - 1 TblColCnt = TblColCnt + 1 arr(TblColCnt, LineCount) = Trim$(adoRS(cols - 1)) Next LineCount = LineCount + 1 TblColCnt = 0 'レコードの順読み adoRS.MoveNext Loop 'レコードセットのクローズ adoRS.Close 'データベースのクローズ adoCON.Close 'オブジェクト変数のクリア Set adoRS = Nothing Set adoCON = Nothing --------------------------------------------------------------

専門家に質問してみよう