DOBON.NET DOBON.NETプログラミング掲示板過去ログ

datareaderを2つ開く

環境/言語:[WinXp、VB.NET]
分類:[.NET]

当方MS-ACCESSからVB.NETへの移行で勉強中です。

さて、下のように1つのDataReaderを開いているときに、別のDataReaderを開くと
エラーになってしまいした。エラー内容は、
「この接続に関連付けられている DataReader が既に開いています。この DataReader を最初に閉じる必要があります。」
と出てしまいます。
この場合、もう一つ接続を開かないと(下記ではDo While内にsqlConn2、sqlCmd2を作成)いけないのでしょうか。それとも他の方法があるのでしょうか。
ほとほと悩んでおります。お知恵を貸してください。


↓↓↓↓↓↓↓↓↓↓↓↓
' オープン
sqlConn1 = New SqlConnection(strConn)
sqlConn1.Open()

sqlCmd1 = New SqlCommand
sqlCmd1.Connection = sqlConn1

sqlCmd1.CommandText = "SELECT Code1 FROM tbl_AAA"
dr1 = sqlCmd1.ExecuteReader

' ループ処理
Do While dr1.Read

  sqlCmd1.CommandText = "SELECT Code2, Name2 FROM tbl_BBB WHERE (Code2 = " & dr1.Item("Code1") & ""
  dr2 = sqlCmd1.ExecuteReader
  Do While dr2.Read

    Messagebox.Show(dr1.Item("Code1") & ":" & dr2.Item("Name2"))
  Loop
  dr2.Close

Loop


2006/06/12(Mon) 16:52:28 編集(投稿者)
2006/06/12(Mon) 16:51:32 編集(投稿者)
2006/06/12(Mon) 16:34:17 編集(投稿者)
2006/06/12(Mon) 16:34:10 編集(投稿者)
2006/06/12(Mon) 16:31:56 編集(投稿者)
2006/06/12(Mon) 16:31:43 編集(投稿者)

例えばこんなのではどうでしょうか?
Dim oleConn As New OleDb.OleDbConnection ' コネクション
Dim strSql As String ' SQL文字列

oleConn.ConnectionString = gstrConnStr
oleConn.Open()

Dim dtSetDatA As DataSet = New DataSet("tbl_AAA")
strSql = "SELECT"
strSql += " aa"
strSql += ",bb"
strSql += " FROM tbl_AAA"
Dim oleDaDatA As OleDb.OleDbDataAdapter = _
    New OleDb.OleDbDataAdapter(strSql, oleConn)
oleDaDatA.Fill(dtSetDatA, "tbl_AAA")
For i = 0 To dtSetDatA.Tables("tbl_AAA").Rows.Count - 1
  strAA = dtSetDatA.Tables("tbl_AAA").Rows(intCnt)("aa").ToString

  Dim dtSetDatB As DataSet = New DataSet("tbl_BBB")
  strSql = "SELECT"
  strSql += " cc"
  strSql += ",dd"
  strSql += " FROM tbl_BBB"
  strSql += " WHERE cc = '" & strAA & "'"
  Dim oleDaDatB As OleDb.OleDbDataAdapter = _
    New OleDb.OleDbDataAdapter(strSql, oleConn)
  oleDaDatB.Fill(dtSetDatB, "tbl_BBB")
  For j = 0 To dtSetDatB.Tables("tbl_BBB").Rows.Count - 1
    strBB = dtSetDatB.Tables("tbl_BBB").Rows(intCnt)("cc").ToString
    MsgBox ("strAA=" & strAA & " strBB=" & strBB)
  Next
  dtSetDatB.Clear()
  oleDaDatB.Dispose()
Next
dtSetDatA.Clear()
oleDaDatA.Dispose()

If oleConn.State = ConnectionState.Open Then
  oleConn.Close()
End If
oleConn = Nothing
  • 題名: Re[2]: datareaderを2つ開く
  • 著者: 夏椰
  • 日時: 2006/06/12 16:31:27
  • ID: 16224
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
SqlDataReader クラス
http://msdn2.microsoft.com/ja-jp/library/system.data.sqlclient.sqldatareader.aspx

には以下の文章が書いてあります。
>SqlDataReader の使用中は、関連付けられた SqlConnection は、
>その SqlDataReader によって使用されるためビジー状態になります。
>この間、SqlConnection に対して、閉じる以外の操作は実行できません。
>SqlDataReader の Close メソッドを呼び出すまでこの状態が続きます。
>たとえば、Close を呼び出すまでは、出力パラメータは取得できません。

よって、Readerを使いたい場合はConnectionを別途とるか、
DataReaderではなく、DataAdapterを用いて取得する方法などへ変更したほうがいいかと思います。

SqlDataAdapter クラス
http://msdn2.microsoft.com/ja-jp/library/system.data.sqlclient.sqldataadapter(VS.80).aspx
■No16222に返信(niboさんの記事)
> 当方MS-ACCESSからVB.NETへの移行で勉強中です。
>
> さて、下のように1つのDataReaderを開いているときに、別のDataReaderを開くと
> エラーになってしまいした。エラー内容は、
> 「この接続に関連付けられている DataReader が既に開いています。この DataReader を最初に閉じる必要があります。」
> と出てしまいます。

SQL server 2005と、ADO.NET 2.0が使用できる環境であれば、MARSを使うことによって、一つの接続で複数のDataReaderを開くことができます。

DOBON.NET | プログラミング道 | プログラミング掲示板