我试图在数据库中替换“上次登录日期”。 至于数据库不显示一个字符串,说'第一届会议'。已打开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
这是会发生什么,当你“登陆”使用用户名和密码(请不要介意的SQL注入攻击的问题):
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。
我应该怎么做?
在关闭它之前不要丢弃您的阅读器。反过来这样做。关闭然后处理。我不确定这是否能解决您的问题,但绝对值得注意。你也应该处理你的命令。看看实现'使用'处理所有这些给你。 – Bugs
我知道你可能是初学者。请考虑阅读https://msdn.microsoft.com/en-us/library/ee658109.aspx在与“ExecuteReader”相同的代码中看到“button_clicks”是一个糟糕的设计。至少,你需要一个DataLayer和一个表示层。或谷歌“dotnet分层开发” – granadaCoder
我会给你一个学习的提示。了解如何将您的数据读取器行/列放入基本的DTO对象。有一个例程返回对象。请勿将数据采集器放置在您的表示层中。在这里看到我的答案是一个基本的例子。 http://stackoverflow.com/questions/16523501/return-objects-with-populated-list-properties-from-stored-procedure/16523983#16523983 – granadaCoder