已经打开了一个必须先关闭的 DataReader

Already a DataReader opened which must be closed first

我正在尝试替换数据库中的 "last time logged in date"。 至于不是数据库显示一个字符串 'first session'.

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

这是我创建的连接函数,可以在程序的任何位置调用它:

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

这是当您 'login' 使用您的用户名和密码时发生的情况(不要介意 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

每当我 运行 我得到一个

已经有一个与此连接关联的打开的 DataReader,必须先将其关闭。

我该如何进行?

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

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