SqlConnectionとSqlDataReaderについての質問です。
環境はVB2008、SQL Server 2008、WinXP SP2です。
通常、SqlConnectionの接続文字列にMultipleActiveResultSets(MARS)について特に記述しなければ、
MARSはOFF(False)となって、同じ接続で複数のSqlDataReaderを同時に取得することはできませんよね?
ところが今開発中のプログラムで、SqlDataReaderをCloseしていないのに同じ接続で
新しくSqlDataReaderを取得できてしまっています。
正確には、同じ処理を繰り返し行っていると何度目かにようやく例外が発生します。
以下に簡略化したコードを記述します。
Public Class Form1
Private cn As New SqlClient.SqlConnection
Private cm As SqlClient.SqlCommand
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
cn.ConnectionString = (接続文字列)
cn.Open()
cm = cn.CreateCommand()
End Sub
Private Sub TextBox1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
Call GetData1() 'Closeなし
End Sub
Private Sub TextBox2_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox2.Validating
Call GetData2() 'Closeあり
End Sub
Private Sub GetData1()
Dim dr As SqlClient.SqlDataReader
cm.CommandText = "SELECT * FROM [テーブル1] WHERE [フィールド1] = '" & TextBox1.Text & "'"
dr = cm.ExecuteReader()
If dr.Read() Then
Label1.Text = dr("フィールド2")
End If
'dr.Close()
End Sub
Private Sub GetData2()
Dim dr As SqlClient.SqlDataReader
cm.CommandText = "SELECT * FROM [テーブル2] WHERE [フィールド1] = '" & TextBox2.Text & "'"
dr = cm.ExecuteReader()
If dr.Read() Then
Label2.Text = dr("フィールド2")
End If
dr.Close()
End Sub
End Class
ただ、上のコードを実行しても初回のGetData1→GetData2で必ずエラーとなります。
実際のコードは他にもcnを使用してSqlDataReaderを取得している箇所はありますが
問題となっている現象は上の処理と同じ流れで発生します。
問題の原因と対処方法等、教えて頂けると幸いです。