none
SqlDataReaderをCloseしなくても例外が発生しない RRS feed

  • 質問

  • 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を取得している箇所はありますが
    問題となっている現象は上の処理と同じ流れで発生します。

    問題の原因と対処方法等、教えて頂けると幸いです。

    2010年6月24日 10:47

回答