1

私が取り組んでいるプロジェクトの新しいアプローチを試みており、Access データベースについて学び始めたところです。私はVB.netを使用していますが、私の質問は次のとおりです。データベースのテーブルにレコードが存在するかどうかを確認するにはどうすればよいですか。理解できたと思っていたのですが、そうではありません。ログインを作成していますが、入力したユーザー名とデータベースの内容を比較する前に、入力したユーザー名が存在するかどうかを確認したいと考えています。これを行う方法について多くの質問があります...しかし、VB.netおよびMS Accessについてはそうではありません

これが私のコードです:

Imports System.Data.OleDb
Public Class LoginForm1
    Dim provider As String
    Dim dataFile As String
    Dim connString As String
    Public myConnection As OleDbConnection = New OleDbConnection
    Public dr As OleDbDataReader
    Dim Errors As String
    Public Sub AccessAccountDatabase()
        provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source ="
        dataFile = "C:\Users\Richard\Documents\Visual Studio 2010\Projects\CybSol Journal Database\CybSol Journal Database\cgi-bin\Data.mdb"
        connString = provider & dataFile
        myConnection.ConnectionString = connString
        Errors = ""
        Try
            myConnection.Open()
            Dim str As String
            str = "SELECT * FROM Accounts WHERE Username='" & UsernameTxt.Text & "' AND Password='" & PasswordTxt.Text & "'"
            Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)
            dr = cmd.ExecuteReader
            dr.Read()

            If UsernameTxt.Text = dr("Username").ToString AndAlso PasswordTxt.Text = dr("Password").ToString Then
                Dim Welcome As String = "SELECT * FROM Accounts WHERE Real_Name=" & "Username"
                MsgBox("Welcome back " & dr("Real_Name") & "!")
            Else
                MsgBox("Login Failure")
            End If
            myConnection.Close()
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub

    Private Sub OkayBtn_Click(sender As System.Object, e As System.EventArgs) Handles OkayBtn.Click
        AccessAccountDatabase()
    End Sub
End Class

だから今私の質問は...正しい情報(データベースに存在する正しいユーザー名とパスワード)を入力すると、ようこそとすべてが表示されるため、データベースにレコードが存在するかどうかを確認するにはどうすればよいですか。ただし、間違ったユーザー名やパスワードを入力すると機能しません。「Try Catch」ステートメントがないと、プログラムはフリーズするだけです。try catch を使用すると、次のように記述されます。

System.InvalidOperationException: No data exists for the row/column.
   at System.Data.OleDb.OleDbDataReader.DoValueCheck(Int32 ordinal)
   at System.Data.OleDb.OleDbDataReader.GetValue(Int32 ordinal)
   at System.Data.OleDb.OleDbDataReader.get_Item(String name)
   at CybSol_Journal_Database.LoginForm1.AccessAccountDatabase() in c:\users\richard\documents\visual studio 2010\Projects\CybSol Journal Database\CybSol Journal Database\LoginForm1.vb:line 36

追加情報: 36 行目は次のとおりです。If UsernameTxt.Text = dr("Username").ToString AndAlso PasswordTxt.Text = dr("Password").ToString Then

4

5 に答える 5

7

最初の問題:

PASSWORD はAccess の予約済みキーワードです。角括弧でカプセル化する必要があります。

"SELECT * FROM Accounts WHERE Username='" & UsernameTxt.Text & _
"' AND [Password]='" & PasswordTxt.Text & "'" 

2番目の問題:

文字列連結を使用して SQL テキストを作成しないでください。常にパラメータを使用する

 str = "SELECT * FROM Accounts WHERE Username=? AND [Password]=?"   
 Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)   
 cmd.Parameters.AddWithValue("user", UserNameTxt.Text)
 cmd.Parameters.AddWithValue("pass", PasswordTxt.Text)
 dr = cmd.ExecuteReader   

なんで?ユーザー入力から文字列を連結するとどうなるかを見てください

3 番目の問題: コマンドが行を返すかどうかをテストする

 If dr.Read() Then
    ......

 End if  
于 2012-07-16T20:02:50.127 に答える
2

Using手動で接続を閉じる必要がないように、いくつかのステートメントを追加しました。また、SQL インジェクションを防ぐために SQL ステートメントをパラメーター化しました。

 Public Class LoginForm1
      Dim provider As String
      Dim dataFile As String
      Dim connString As String
      'Public myConnection As OleDbConnection = New OleDbConnection
      'Public dr As OleDbDataReader
      Dim Errors As String
      Public Sub AccessAccountDatabase()
        provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source ="
        dataFile = "C:\Users\Richard\Documents\Visual Studio 2010\Projects\CybSol Journal Database\CybSol Journal Database\cgi-bin\Data.mdb"
        connString = provider & dataFile
        myConnection.ConnectionString = connString
        Errors = ""
        Try
          Using myConnection As OleDbConnection = New OleDbConnection(connString)
            myConnection.Open()
            Dim str As String
            str = "SELECT * FROM Accounts WHERE Username=@USER AND [Password]=@PWD "
            Using cmd As OleDbCommand = New OleDbCommand(str, myConnection)
              cmd.Parameters.AddWithValue("@USER", UsernameTxt.Text)
              cmd.Parameters.AddWithValue("@PWD", PasswordTxt.Text)
              Using dr As OleDbDataReader = cmd.ExecuteReader
                If dr.HasRows Then
                  dr.Read()
                  If UsernameTxt.Text = dr("Username").ToString AndAlso PasswordTxt.Text = dr("Password").ToString Then
                    Dim Welcome As String = "SELECT * FROM Accounts WHERE Real_Name=" & "Username"
                    MsgBox("Welcome back " & dr("Real_Name") & "!")
                  Else
                    MsgBox("Login Failure")
                  End If
                Else
                  MsgBox("Login Failure")
                End If
              End Using
            End Using
          End Using
        Catch ex As Exception
          MsgBox(ex.ToString)
        End Try


      End Sub

      Private Sub OkayBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OkayBtn.Click
        AccessAccountDatabase()
      End Sub
    End Class
于 2012-07-16T20:03:50.830 に答える
1

あなたは正しい軌道に乗っています。はOleDbDataReader.Read、既存の行を正常に読み取ったかどうかを示すブール値を返します。Trueしたがって、レコードを読み取ろうとする前に、返されたかどうかを確認できます。例えば:

If dr.Read() Then
    If UsernameTxt.Text = dr("Username").ToString AndAlso PasswordTxt.Text = dr("Password").ToString Then
    Dim Welcome As String = "SELECT * FROM Accounts WHERE Real_Name=" & "Username"
        MsgBox("Welcome back " & dr("Real_Name") & "!")
    Else
        MsgBox("Login Failure")
    End If
End If

また、パスワードをプレーンテキストで保存することは決して良い考えではないことを少なくとも言及する必要があると思います.

于 2012-07-16T20:03:17.627 に答える
0

DataReader で Read() メソッドを使用します (これにより、データベースへの接続が開いたままになり、DataReader がまだ読み取り中の間、データベースで他のコマンドを実行できなくなることに注意してください。

If String.Compare(dr("Username").ToString(), UsernameTxt.Text, true) AndAlso String.Compare(dr("Password").ToString(), PasswordTxt.Text.ToString() Then
    ' The username and password for the record match
    ' the input from the login form
    ProcessLogin()
Else
    ' Invalid username or password, send an error
End If
于 2016-04-21T01:28:59.900 に答える
0

データベースで一致しない場合は行が返されないため、コードでユーザー名とパスワードを再度確認する必要はありません。

あなたは簡単に行うことができます

dr = cmd.ExecuteReader
If dr.HasRows Then
   //it matched
Else
   //it didn't match. could not log in
End If

それでも保持したいが必要ではない場合のアプローチは以下のとおりです

dr = cmd.ExecuteReader
If dr.HasRows Then

    dr.Read()

    If UsernameTxt.Text = dr("Username").ToString AndAlso PasswordTxt.Text = dr("Password").ToString Then

    Else

    End If

End If
于 2012-07-16T19:59:53.077 に答える