已经有一个与此Connection关联的开放DataReader

时间:2014-05-03 17:26:56

标签: vb.net

我需要一些帮助,我无法解决这个错误...我看了其他主题,但我不明白。

“已经有一个与此Connection相关联的开放DataReader ......”

这是我的代码:

Private Sub btnCautaNumeClient_Click(sender As Object, e As EventArgs) Handles btnCautaNumeClient.Click
    MySqlConn = New MySqlConnection
    MySqlConn.ConnectionString = "server=localhost; userid=root; password=root; database=multimedia_rent_project"
    Dim SDA As New MySqlDataAdapter
    Dim dbDataSet As New DataTable
    Dim bSource As New BindingSource

    Try
        MySqlConn.Open()
        Dim Query As String = "select ... bla bla bla;"
        myCommand = New MySqlCommand(Query, MySqlConn)

        If txtIntroducetiNumeleClientului.Text.Length = 0 Then
            MessageBox.Show("No input!")
        Else
            Dim myReader As MySqlDataReader
            myReader = myCommand.ExecuteReader
            Dim nr As Integer = 0
            While myReader.Read
                nr += 1
            End While

            If nr = 0 Then
                MessageBox.Show("No client find!")
            Else
                MessageBox.Show("Client found!")
                SDA.SelectCommand = myCommand
                SDA.Fill(dbDataSet)
                bSource.DataSource = dbDataSet
                cautaClientiDupaNume.dgwCautaClientiDupaNume.DataSource = bSource
                SDA.Update(dbDataSet)

                cautaClientiDupaNume.Show()
            End If
        End If

        MySqlConn.Close()
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    Finally
        MySqlConn.Dispose()
    End Try
End Sub

1 个答案:

答案 0 :(得分:0)

在计算记录的循环结束时,添加对Close

的调用
        While myReader.Read
            nr += 1
        End While
        myReader.Close()

出现此错误的原因是,当DataReader使用连接时,在关闭阅读器之前,它不能用于其他数据库命令。
在您的代码中,您打开阅读器来计算检索到的记录数,然后继续使用相同的连接(与命令关联)来填充数据集而不关闭阅读器。

说,我认为您应该更改代码以避免使用MySqlDataReader,因为您只是用它来计算检索到的记录。如果这是您唯一的要求,那么最好使用SQL函数COUNT()

    Dim Query As String = "select COUNT(*) FROM table where .."
    myCommand = New MySqlCommand(Query, MySqlConn)
    Dim nr = Convert.ToInt32(myCommand.ExecuteScalar())

当然,更改了命令的命令文本以仅计算记录,然后您需要将commandtext重置为其先前的值(.... bla bla bla part ...)