我正在尝试替换数据库上的“上次登录日期”。 至于数据库,不会显示一个表示“第一个会话”的字符串。
我为这个应用程序做了很多。创建一个帐户,验证它是否已存在,等等。
这是我的连接函数,我创建了从程序的任何地方调用它:
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必须先关闭。
我该怎么办?
答案 0 :(得分:0)
在第二个代码段中,您调用ExecuteReader
,然后在关闭该数据阅读器之前调用CharacterManager.Show()
。显示表单会引发其Load
事件,并且在该表单的Load
事件处理程序中,您正在调用ExecuteNonQuery
...而数据阅读器仍处于打开状态。看到这个问题?
也许您应该做的是使用数据适配器填充DataTable
,编辑其中的数据,然后通过一次调用该数据适配器的Update
方法保存所有更改。