0

次のコードを実行して、ユーザーがデータベースに存在するかどうかを確認します-標準的なものです。明らかに、コードが実行されると、結果があればブール値の true または false が返されます。結果が見つかった場合、その結果のIDを保存したいと思います。どうやってこれをやろうとしているのか誰か教えてもらえますか?

コード:

 Username = txtUserName.Text
    Password = txtPassword.Text
    dbConnInfo = "PROVIDER=Microsoft.Jet.OLEDB.4.0; Data Source = C:\Users\Dave\Documents\techs.mdb"
    con.ConnectionString = dbConnInfo
    con.Open()
    Sql = "SELECT * FROM techs WHERE userName =  '" & Username & "' AND '" & Password & "'"
    LoginCommand = New OleDb.OleDbCommand(Sql, con)
    CheckResults = LoginCommand.ExecuteReader
    RowsFound = CheckResults.HasRows
    con.Close()
    If RowsFound = True Then

        MsgBox("Details found")

        TechScreen.Show()
    Else
        MsgBox("Incorrect details")
    End If
4

1 に答える 1

2

あなたが投稿したコードスニペットには多くの問題があります。これらの問題を解決するお手伝いができれば幸いです。

結果の ID をロードするには、 SqlCommand.ExecuteScalar()を使用する必要があります。これは、Sql から 1 つの結果を取得するように最適化されているためです。

コードの何が問題なのかというと、Sql インジェクション攻撃を受けやすいため、以下のサンプルに示すように、パラメーター化されたクエリを使用する必要があります。

Public Function AddProductCategory( _
  ByVal newName As String, ByVal connString As String) As Integer 
    Dim newProdID As Int32 = 0
    Dim sql As String = _
     "INSERT INTO Production.ProductCategory (Name) VALUES (@Name); " _
       & "SELECT CAST(scope_identity() AS int);" 

Using conn As New SqlConnection(connString)
    Dim cmd As New SqlCommand(sql, conn)
    cmd.Parameters.Add("@Name", SqlDbType.VarChar)
    cmd.Parameters("@Name").Value = newName
    Try
        conn.Open()
        newProdID = Convert.ToInt32(cmd.ExecuteScalar())
    Catch ex As Exception
        Console.WriteLine(ex.Message)
    End Try 
End Using 

Return newProdID
End Function

出典: MSDN

于 2012-10-26T00:20:58.787 に答える