データベースの「最後にログインした日時」を置き換えようとしています。 データベースには、「最初のセッション」という文字列が表示されません。すでに開かれている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が既にありますを取得します。
どうすればよいですか?
読者は、読者を閉じた後に廃棄しないでください。それ以外の方法でやり直してください。 'Close'から' Dispose'を実行します。それがあなたの問題を解決するかどうかは分かりませんが、注目に値することは間違いありません。あなたはまたあなたのコマンドを処分するべきです。あなたのためにこれをすべて扱う 'Using'を実装してください。 – Bugs
私はあなたが初心者かもしれないことを知っています。 https://msdn.microsoft.com/en-us/library/ee658109.aspxを読むことを検討してください。「ExecuteReader」と同じコードの「button_clicks」が見苦しいデザインです。少なくとも、DataLayerレイヤーとPresentationレイヤーが必要です。またはGoogleの "ドットネット層の開発" – granadaCoder
私はあなたに学習のヒントを与えるつもりです。データウェアハウスの行/列を基本的なDTOオブジェクトに配置する方法を学びます。ルーチンはdtoオブジェクトを返す。プレゼンテーションレイヤーにデータレアを配置しないでください。基本的な例は私の答えを見てください。 http://stackoverflow.com/questions/16523501/return-objects-with-populated-list-properties-from-stored-procedure/16523983#16523983 – granadaCoder