已打开DataReader,必须先关闭

时间:2017-03-09 07:15:26

标签: mysql vb.net datareader

我正在尝试替换数据库上的“上次登录日期”。 至于数据库,不会显示一个表示“第一个会话”的字符串。

我为这个应用程序做了很多。创建一个帐户,验证它是否已存在,等等。

这是我的连接函数,我创建了从程序的任何地方调用它:

Function ServerConnection()
    Try
        MyConnection.ConnectionString = "server=127.0.0.1;user=root;password=password;database=titulo"
        MyConnection.Open()
        Return True
    Catch ex As Exception
        Return False
    End Try
End Function

当您使用您的用户名和密码登录时会发生这种情况(永远不要理解SQLInjection问题):

Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
    ServerConnection()
    Try
        Dim MyCommand As New MySqlCommand("select * from titulo.accounts where accountName='" & txtUsername.Text & "' and accountPassword='" & Hash512(txtPassword.Text, txtUsername.Text) & "'", MyConnection)
        Dim MyReader As MySqlDataReader
        MyReader = MyCommand.ExecuteReader
        If Not MyReader.HasRows Then
            MsgBox("No se ha encontrado ninguna cuenta con estas credenciales.")
        Else
            MyReader.Read()
            connectedAccount.Accounts(MyReader.GetInt32("id"), MyReader.GetString("accountName"), MyReader.GetString("accountMail"), MyReader.GetString("accountLogon"))
            CharacterManager.Show()
        End If
        MyReader.Dispose()
        MyReader.Close()
        MyConnection.Close()
    Catch ex As Exception
        MsgBox(ex.Message)
    Finally
        MyConnection.Dispose()
    End Try
End Sub

到目前为止它可以工作,我可以登录,在下一个表格中,我可以看到存储在'connectedAccount'对象上的数据。

这是一切都停止工作的地方:

Private Sub CharacterManager_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Try
        ServerConnection()
        Dim MyCommand As New MySqlCommand("update titulo.accounts set accountLogon='" & lastLogon & "' where id= '" & connectedAccount.GetAccountId & "'", MyConnection)
        MyCommand.ExecuteNonQuery()
        lblAccountName.Text = connectedAccount.GetAccountName
        lblAccountLogon.Text = connectedAccount.GetAccountLogon
        MyConnection.Close()
    Catch ex As MySqlException
        MsgBox(ex.Message)
    Finally
        MyConnection.Dispose()
    End Try
End Sub

每当我跑步时,我都会得到一个

已经有一个与此Connection关联的开放DataReader必须先关闭。

我该怎么办?

1 个答案:

答案 0 :(得分:0)

在第二个代码段中,您调用ExecuteReader,然后在关闭该数据阅读器之前调用CharacterManager.Show()。显示表单会引发其Load事件,并且在该表单的Load事件处理程序中,您正在调用ExecuteNonQuery ...而数据阅读器仍处于打开状态。看到这个问题?

也许您应该做的是使用数据适配器填充DataTable,编辑其中的数据,然后通过一次调用该数据适配器的Update方法保存所有更改。