2017-03-09 97 views
0

我试图在数据库中替换“上次登录日期”。 至于数据库不显示一个字符串,说'第一届会议'。已打开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。

我应该怎么做?

+0

在关闭它之前不要丢弃您的阅读器。反过来这样做。关闭然后处理。我不确定这是否能解决您的问题,但绝对值得注意。你也应该处理你的命令。看看实现'使用'处理所有这些给你。 – Bugs

+0

我知道你可能是初学者。请考虑阅读https://msdn.microsoft.com/en-us/library/ee658109.aspx在与“ExecuteReader”相同的代码中看到“button_clicks”是一个糟糕的设计。至少,你需要一个DataLayer和一个表示层。或谷歌“dotnet分层开发” – granadaCoder

+0

我会给你一个学习的提示。了解如何将您的数据读取器行/列放入基本的DTO对象。有一个例程返回对象。请勿将数据采集器放置在您的表示层中。在这里看到我的答案是一个基本的例子。 http://stackoverflow.com/questions/16523501/return-objects-with-populated-list-properties-from-stored-procedure/16523983#16523983 – granadaCoder

回答

0

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

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

+0

更改排序,关闭和显示方法为我工作的顺序。非常感谢。 – Reviyee

相关问题