错误:“已经有一个与此Connection关联的打开DataReader,必须先关闭”

时间:2014-08-19 07:45:56

标签: 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 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

2 个答案:

答案 0 :(得分:2)

由于连接不是方法的一部分,因此它似乎是您班级中的一个字段。我不鼓励这样做。而是使用局部变量并在需要时打开/关闭它。实际上连接池不会真正打开/关闭物理连接,所以你不必害怕这是低效的。

您可以使用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-parameters来阻止sql-injection。

答案 1 :(得分:0)

制作读者的新实例

rdr = new comm.ExecuteReader();

由于