2

このようなパスワード認証クエリを実行しています。

if exists(select UserID from users where UserName=@UserName and Password=@Password) 
    select UserID from users where UserName=@UserName and Password=@Password
else 
    select 0

しかし、1 つの結果に対して 2 回クエリを実行しているように思えます。

Select UserID Where Username = @UserName and Password = @Password

結果を取得したら、リーダーで結果の数を確認するだけですか?

if (!myReader.HasRows)
    MessageBox.Show("UserName not found or Password invalid");
else
    //do login stuff

私が求めているのは、どちらが優れているか、または同じかということです。

4

1 に答える 1

4

これを使って:

SELECT  ISNULL
        (
        (
        SELECT  userId
        FROM    users
        WHERE   userName = @userName
                AND password = @password
        ),
        0
        )

もちろん、レコード数をチェックするソリューションも機能します。

常に 1 つのレコードのみが返され、 がuserName一意ではなく、 の重複がある場合は失敗することに注意してください@userName

@Andriy M が指摘したように、同じ問題が発生しやすいようCOALESCEに内部的に書き直されているため、ここでは役に立ちません。CASE

あなたの質問に答える: はい、元のバッチはusers2 回アクセスします。

于 2012-05-31T14:23:33.747 に答える