0

私は次のコードを持っています、

    OleDbCommand cmd = new OleDbCommand("SELECT * FROM Users WHERE username = ? AND password = ?",conn);

    OleDbParameter p1 = new OleDbParameter();
    OleDbParameter p2 = new OleDbParameter();
    cmd.Parameters.Add(p1);
    cmd.Parameters.Add(p2);
    p1.Value = usernametb.Text;
    p2.Value = passwordtb.Text;

    conn.Open();
    OleDbDataReader read = cmd.ExecuteReader();

        if (read.Read() == true)
        {
            conn.Close();
            MessageBox.Show("Successfully logged in!");
        }
        else
        {
            conn.Close();
            MessageBox.Show("Login failed");
        }

このコードは、ユーザーがパスワードを持っている場合は機能しますが、ユーザーがパスワードを持っていない場合は失敗し、理由がわかりません。

どこが間違っていますか?

4

2 に答える 2

1

これは、SQL 標準ではの代わりに がnull = null返されるためです。nulltrue

あなたのクエリは

SELECT * FROM Users WHERE username = ? AND (password is null or password = ?)

より良いクエリは、パスワードがnullの場合、ユーザーは空のパスワードを入力する必要があるため、次のようになることを確認することです。

SELECT * FROM Users WHERE username = ? AND 
    ? = case when password is null then '' else password end
于 2013-05-22T13:41:46.987 に答える
0

以下は機能しますか?

SELECT * FROM Users WHERE username = ? AND 
                          (password IS NULL OR password = ?)
于 2013-05-22T13:41:39.847 に答える