【问题标题】:Error: "There is already an open DataReader associated with this Connection which must be closed first"错误:“已经有一个打开的 DataReader 与此连接关联,必须先关闭”
【发布时间】:2014-08-19 07:45:55
【问题描述】:

我收到此错误消息,这是我的代码,请帮助我

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

【问题讨论】:

  • 连接在哪里?
  • 你在哪一行得到ERROR
  • rdr.read()If rdr.HasRows Then 之前
  • @TimSchmelter 他的conn 可以被声明为一个模块!!

标签: vb.net sql-server-2012


【解决方案1】:

由于连接不是方法的一部分,它似乎是您类中的一个字段。我会对此感到气馁。而是使用局部变量并在需要时打开/关闭它。实际上连接池并不会真正打开/关闭物理连接,所以你不必担心这是低效的。

您可以通过使用Try-Finally 或-更易读、更简洁- 与Using-statement 一起使用来确保即使出现错误也关闭连接:

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。

【讨论】:

    【解决方案2】:

    创建阅读器的新实例

    rdr = new comm.ExecuteReader();
    

    谢谢

    【讨论】:

    • comm.ExecuteReader 是一个方法并且已经返回了读者。顺便说一句,您不能创建方法的实例;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    相关资源
    最近更新 更多