我的错误'已经有一个与此命令关联的打开DataReader,必须先关闭它。' [重复]

问题描述 投票:-1回答:2

请帮我做作业。由于这个错误,我无法完成

已经有一个与此命令关联的打开DataReader,必须先关闭它

这是我的代码:

    con.Open()

    Dim rs As New MySqlCommand("select * from account where username='" & txtu.Text & "' and password='" & txtp.Text & "' ", con)
    Dim sqlRead As MySqlDataReader = rs.ExecuteReader

    If sqlRead.HasRows Then
        If sqlRead.Read = True Then
            If sqlRead("level") = "admin" Then
                MessageBox.Show("Can't Delete.")

            ElseIf sqlRead("level") = "staff" Then
                Dim query As String = "delete from account where username='" & txtu.Text & "'"
                Dim cmd As New MySqlCommand(query, con)
                cmd.ExecuteNonQuery()
                sqlRead.Close()
            End If
        End If
    End If
End If
con.Close()
vb.net datareader
2个回答
0
投票

要按照您尝试的方式执行此操作,您还需要创建一个新连接以与新命令一起使用,在这种情况下,您将导致可避免的连接。

    Private Sub DReader()
    Using Con As New MySql.Data.MySqlClient.MySqlConnection("ConnectionString")
        Con.Open()
        Using MySqlReader As MySql.Data.MySqlClient.MySqlDataReader =
                New MySql.Data.MySqlClient.MySqlCommand("Command", Con).ExecuteReader
            While MySqlReader.Read
                Select Case MySqlReader.GetString(MySqlReader.GetOrdinal("level")).ToUpper
                    Case "ADMIN"
                        MessageBox.Show("Can't Delete.")
                    Case "STAFF"
                        Dim query As String = "delete from account where username='" & txtu.Text & "'"
                        DelRow(query)
                End Select
            End While
        End Using
        Con.Close()
    End Using
End Sub

Private Sub DelRow(ByVal Qry As String)
    Using Con As New MySql.Data.MySqlClient.MySqlConnection("ConnectionString")
        Con.Open()
        Using DelCmd As New MySql.Data.MySqlClient.MySqlCommand(Qry, Con)
            DelCmd.ExecuteNonQuery()
        End Using
        Con.Close()
    End Using
End Sub

我相信这会回答你的问题,但是,你真的应该问如何实现这个例程的目标。参数和“ExecuteScalar”将是一种更好的做法


0
投票

我认为你只需要在最后一个结束后放置这个代码:sqlRead.Close(),因为当这个“内部if”代码正确时,将有很大的机会运行代码:如果sqlRead(“level”)= “admin”然后还需要关闭。

简而言之,只有在执行此代码时,您的读者才会被关闭:ElseIf sqlRead(“level”)=“staff”然后

所以,将其更新为:

If sqlRead.HasRows Then
    If sqlRead.Read = True Then
        If sqlRead("level") = "admin" Then
            MessageBox.Show("Can't Delete.")
        ElseIf sqlRead("level") = "staff" Then
            Dim query As String = "delete from account where username='" & txtu.Text & "'"
            Dim cmd As New MySqlCommand(query, con)
            cmd.ExecuteNonQuery()
        End If
    End If
End If
End If
sqlRead.Close()
con.Close()

我希望这能帮到你们所有人,

© www.soinside.com 2019 - 2024. All rights reserved.