SQL Server用.NETデータプロバイダを指定してADO.NETを使った場合、DataReaderでデータを1レコードづつ取得しながら同じコネクションを使ってSQL文を実行しようとすると
「このコマンドに関連付けられている DataReader が既に開かれています」
というエラーが発生します。
Using _cn As New SqlConnection
_cn.ConnectionString = String.Format(ConnectionString, UserID, Password)
_cn.Open()
Using _tr As SqlTransaction = _cn.BeginTransaction
Try
Dim dr As SqlDataReader
Using _cmd As New SqlCommand
Dim sqlString As String = String.Empty
_cmd.Connection = _cn
_cmd.Transaction = _tr
_cmd.Parameters.AddWithValue("userID", UserID.Trim)
sqlString = "SELECT * FROM hogehoge WHERE USERID=@userID"
_cmd.CommandText = sqlString
dr = _cmd.ExecuteReader
End Using
Do While dr.Read
Using _cmd As New SqlCommand
Dim sqlString As String = String.Empty
_cmd.Connection = _cn
_cmd.Transaction = _tr
_cmd.Parameters.AddWithValue("userID", dr.Item("USERID").ToString)
sqlString = "EXEC hogehoge @userID"
_cmd.CommandText = sqlString
_cmd.ExecuteNonQuery()
End Using
Loop
dr.Close()
_tr.Commit()
Catch ex As Exception
_tr.Rollback()
Throw ex
End Try
End Using
End Using
このような時は接続文字列に「MultipleActiveResultSets=true」を追加するとエラーを回避できます。