Vb.net 错误:";已经有一个打开的DataReader与此连接关联,必须先关闭该连接;

Vb.net 错误:";已经有一个打开的DataReader与此连接关联,必须先关闭该连接;,vb.net,sql-server-2012,Vb.net,Sql Server 2012,我收到这个错误信息,这是我的代码,请帮助我 Private Sub txtceknofak_Leave(sender As Object, e As EventArgs) Handles txtceknofak.Leave Dim nf As String nf = "select no_fak from terima_cucian where no_fak = '" & txtceknofak.Text & "'" comm = New SqlComm

我收到这个错误信息,这是我的代码,请帮助我

Private Sub txtceknofak_Leave(sender As Object, e As EventArgs) Handles txtceknofak.Leave

    Dim nf As String
    nf = "select no_fak from terima_cucian where no_fak = '" & txtceknofak.Text & "'"
    comm = New SqlCommand(nf, conn)
    rdr = comm.ExecuteReader()

    If rdr.HasRows Then
        btproses.Enabled = True
        btproses.Focus()
    Else
        MsgBox("Nomor faktur tidak ada")
        txtceknofak.Clear()
        txtceknofak.Focus()
    End If
    rdr.Close()

End Sub

为读者创造新的实例

rdr = new comm.ExecuteReader();

谢谢

因为连接不是方法的一部分,所以它似乎是您的类中的一个字段。我不想那样做。而是使用局部变量,并在需要时打开/关闭它。实际上,连接池不会真正打开/关闭物理连接,因此您不必担心这样做效率低下

您可以通过使用
Try Finally
或使用
using
-语句(更易读、更简洁)确保即使出现错误也能关闭连接:

Private Sub txtceknofak_Leave(sender As Object, e As EventArgs) Handles txtceknofak.Leave
    Dim nf As String = "select no_fak from terima_cucian where no_fak = @no_fak"
    Using conn = New SqlConnection(connectionstring)
        Using comm = New SqlCommand(nf, conn)
            comm.Parameters.AddWithValue("@no_fak", txtceknofak.Text)
            conn.Open()
            Using rdr = comm.ExecuteReader()
                If rdr.HasRows Then
                    btproses.Enabled = True
                    btproses.Focus()
                Else
                    MsgBox("Nomor faktur tidak ada")
                    txtceknofak.Clear()
                    txtceknofak.Focus()
                End If
            End Using
        End Using
    End Using ' *** this will also close the connection *** '
End Sub

我还使用了sql参数来阻止sql注入。

连接在哪里?在
之前的哪一行中出现
错误
rdr.read()
如果rdr.HasRows,则可以将
@TimSchmelter his
conn
声明为模块!!是一个方法,已返回读取器。顺便说一句,您不能创建方法的实例;)