1

ユーザーが古いパスワードをテキストボックスに入力し、新しいパスワードを別のテキストボックスに入力してパスワードを更新できるプログラムがあります。

その後、更新クエリによってデータベースが新しいパスワードで更新されます。

Try
            If tbOldPassword.Text <> "" Then
                For Each Row In ds.Tables("sqlAddNewDetails").Rows
                    If Row.Item(0) = gblstrUserID Then
                        If Row.Item(1) = tbOldPassword.Text Then
                            If tbPassword.Text = tbRePassword.Text Then

                                'Updates the database
                                sqlUpdate = ("UPDATE Users SET Password = '" & tbPassword.Text & "' WHERE userID = " & Row.Item(0))
                                Dim cmd As New OleDbCommand(sqlUpdate, con)
                                cmd.ExecuteNonQuery()
                                MsgBox("Password successfully changed")
                            Else : MsgBox("The passwords are not the same")
                            End If
                        Else : MsgBox("Invalid old password")
                        End If
                    End If
                Next
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

ただし、コードが cmd.ExecuteNonQuery() に到達するたびに、Update クエリに構文エラーがあることを示すエラーがスローされます。ただし、Microsoft Access でこのクエリを使用すると、正常に動作するため、Update クエリ自体は正しく記述されます。何が間違っている可能性がありますか?

注: 同じ Sub ルーチン内の別のコードで UPDATE クエリを使用していますが、そこで動作します。このクエリについての何か。

注: Update クエリを UPDATE Users SET EMAIL = '" & tbPassword.Text & "' WHERE userID = " & Row.Item(0)" に変更すると、機能します。そのエラーをスローするパスワードに関する何か。

4

3 に答える 3

4

パスワードはキーワードなので、以下のように角かっこで囲みます。

UPDATE Users SET [Password] =.....

于 2012-04-15T14:41:25.713 に答える
1

実行が行われる前に、sqlUpdate変数に何が含まれているかを確認することになるでしょう。あなたが思っていることを含んでいない可能性があります。文字列の値をコピーしてSQLServerManagement Studioに貼り付け、直接実行して確認します。

そうは言っても、文字列連結を使用してこのコードを作成することは実際にはありません。あなたはSQLインジェクション攻撃に自分自身を開放しています。ユーザーのパスワードに一重引用符が含まれているとどうなりますか?代わりに、次のようなSQLパラメータを使用してください。

sqlUpdate = "UPDATE Users SET Password = ? WHERE userID = ?"
cmd.Parameters.Add(tbPassword.Text)
cmd.Parameters.Add(Row.Item(0))

うーん...私もおそらくOleDbを使用しないでしょう。ネイティブクライアントを使用します。

もちろん、私は古典的なXKCDボビーテーブルにリンクする必要があります。

于 2012-04-15T14:55:41.937 に答える
1

2 つのことに気付くまで、エラー メッセージを表示する必要があります。

1 - con.Open() が存在しません!!!、opend ではない可能性があります 2 - クエリで UserId が数値の場合、クエリ文字列は次のようになります。 "' WHERE userID = " & CStr(Row.Item(0))

UserID が文字列の場合、クエリ文字列は次のようになります。 "' WHERE userID = '" & Row.Item(0) & "'"

于 2012-04-15T14:21:00.410 に答える