2017-03-09 78 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

読者は、読者を閉じた後に廃棄しないでください。それ以外の方法でやり直してください。 'Close'から' Dispose'を実行します。それがあなたの問題を解決するかどうかは分かりませんが、注目に値することは間違いありません。あなたはまたあなたのコマンドを処分するべきです。あなたのためにこれをすべて扱う 'Using'を実装してください。 – Bugs

+0

私はあなたが初心者かもしれないことを知っています。 https://msdn.microsoft.com/en-us/library/ee658109.aspxを読むことを検討してください。「ExecuteReader」と同じコードの「button_clicks」が見苦しいデザインです。少なくとも、DataLayerレイヤーとPresentationレイヤーが必要です。またはGoogleの "ドットネット層の開発" – granadaCoder

+0

私はあなたに学習のヒントを与えるつもりです。データウェアハウスの行/列を基本的なDTOオブジェクトに配置する方法を学びます。ルーチンはdtoオブジェクトを返す。プレゼンテーションレイヤーにデータレアを配置しないでください。基本的な例は私の答えを見てください。 http://stackoverflow.com/questions/16523501/return-objects-with-populated-list-properties-from-stored-procedure/16523983#16523983 – granadaCoder

答えて

0

この2番目のコードスニペットでは、ExecuteReaderを呼び出した後、そのデータリーダーを閉じる前にCharacterManager.Show()を呼び出します。フォームを表示するとLoadイベントが発生し、そのフォームのLoadイベントハンドラでは、データリーダーがまだ開いている間にExecuteNonQuery ...を呼び出しています。問題を参照してください?

おそらく、データアダプタを使用してDataTableを入力し、そのデータを編集し、そのデータアダプタのUpdateメソッドへの1回の呼び出しですべての変更を保存することです。

+0

Disposed、Close、およびShowメソッドの順序を変更することができました。どうもありがとう。 – Reviyee

関連する問題