已经打开了一个必须先关闭的 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
方法保存所有更改适配器。
我正在尝试替换数据库中的 "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
方法保存所有更改适配器。