0

SQLを使用して単純なユーザー名/パスワードログインを作成しようとしていますが、常に無効として表示されます。フィードバックをいただけますか?

 SqlConnection cn;
        cn = new SqlConnection();
        cn.ConnectionString = "Data source=(local); Initial Catalog=INT422Assignment1; Integrated Security=SSPI;";
        cn.Open();
        SqlCommand cmd;
        cmd = new SqlCommand();
        cmd.Connection = cn;
        cmd.CommandText = "SELECT username, pwd FROM myLogin WHERE userNameTB = @username AND passWordTB = @pwd";

        SqlParameter param;
        param = new SqlParameter("@username", SqlDbType.VarChar);
        param.Direction = ParameterDirection.Input;
        param.Value = userNameTB;
        cmd.Parameters.Add(param);

        param = new SqlParameter("@pwd", SqlDbType.VarChar);
        param.Direction = ParameterDirection.Input;
        param.Value = passWordTB;
        cmd.Parameters.Add(param);

        try
        {
            cmd.ExecuteNonQuery();
            cn.Close();
            MessageBox.Show("Login"); 
        }
        catch (Exception ex)
        {
            MessageBox.Show("Invalid");
        }           
    }

実行され、コマンドテキスト行の直後にブレーカーを挿入したので、テキストフィールドからの入力を受け取っていることがわかりますが、どういうわけか、データベース内のユーザー名とパスワードとは比較されません。

よろしくお願いします。

乾杯、

エッシ

4

5 に答える 5

2

常に無効として表示される場合は、例外がキャッチされた場合にのみ「無効」ボックスが表示されるため、クエリが例外をスローしていることを示しているはずです。例外の詳細は?

のドキュメントを読むSqlCommand.ExecuteNonQuery()と、あなたのケースでは何の役にも立たないことに気付くでしょう:

UPDATE、INSERT、および DELETE ステートメントの場合、戻り値はコマンドの影響を受けた行数です。挿入または更新されるテーブルにトリガーが存在する場合、戻り値には、挿入または更新操作の両方によって影響を受ける行の数と、トリガーまたはトリガーによって影響を受ける行の数が含まれます。他のすべてのタイプのステートメントの場合、戻り値は -1 です。ロールバックが発生した場合、戻り値も -1 です。

したがってExecuteNonQuery()、正しい方法ではありません。あなたの例外がスローされているのは、select ステートメントを実行したために、処理されていない結果セットが生成されたという事実に関連していると思われますExecuteNonQuery()

余談ですが、制御フローのプログラム ロジックに例外を使用することは、不適切な方法と見なされていることに注意してください。例外は...例外的な条件であり、通常のプログラムロジックではありません。さらに、例外をキャッチするときは、できるだけ具体的にする必要があります。そうしないと、発見したように、キャッチされるべきではない例外がキャッチされ、他の問題が発生します。)

代わりに次のようにします。

static bool IsAuthenticated( string uid , string pwd )
{
    if ( string.IsNullOrWhiteSpace(uid) ) throw new ArgumentNullException("uid") ;
    if ( string.IsNullOrWhiteSpace(pwd) ) throw new ArgumentNullException("pwd") ;

    bool authenticated ;

    using ( SqlConnection cn = new SqlConnection("Data source=(local); Initial Catalog=INT422Assignment1; Integrated Security=SSPI;") )
    using ( SqlCommand    cmd = cn.CreateCommand() )
    {

        cmd.CommandType = CommandType.Text ;
        cmd.CommandText = @"
SELECT authenticated = count(*)
FROM myLogin
WHERE userNameTB = @username
AND passWordTB = @pwd"
        ;

        cmd.Parameters.AddWithValue( "@username" , uid ) ;
        cmd.Parameters.AddWithValue( "@pwd"      , pwd ) ;

        cn.Open() ;

        authenticated = ((int)cmd.ExecuteScalar()) > 0 ? true : false ;
    cmd.ExecuteNonQuery();

        cn.Close() ;

    }

    return authenticated ;

}
于 2012-11-10T00:44:00.347 に答える
0
try
        {
            cmd.ExecuteNonQuery();  //this is for inserting or updating db
            cn.Close();
            MessageBox.Show("Login"); 
        }
        catch (Exception ex)
        {
            MessageBox.Show("Invalid");
        }     

代わりに SqlDataReader を使用してこれを試してください

try{
     SqlDataReader dr = cmd.ExecuteReader()
     While dr.Read() {

      string password = dr("pwd").ToString();
      string username = dr("username").ToString();
      }  
     }

編集:

 try{
     SqlDataReader dr = cmd.ExecuteReader();
     If dr.HasRows() {
         //Here is your code for good login
      }
     }
于 2012-11-09T23:45:02.120 に答える
0

結果のない SQL クエリは、例外をスローしません。結果を取得し、それらが空かどうかを確認する必要があります: if (res.MoveNext())。

于 2012-11-10T00:26:53.663 に答える
0

使用ExecuteScalar()executenonquery は何も返しません。または、SqlDataAdapter を使用して DataTable に入力し、DataTable に行があるかどうかを確認するか、ExecuteScalar() を使用してデータベースから返された最初の項目を取得します。データベースから返されたデータが必要です。

一方、ユーザーのログイン/ログアウト機能が既に組み込まれている ASP.NET メンバーシップを使用します。独自のログイン ログアウト Web ページは作成しません。

于 2012-11-09T23:37:46.607 に答える
-2

このコードに @ 記号は必要ないと思います。

 SqlParameter param;
    param = new SqlParameter("username", SqlDbType.VarChar);
    param.Direction = ParameterDirection.Input;
    param.Value = userNameTB;
    cmd.Parameters.Add(param);

私が信じているパラメータ名は、pwdと同じユーザー名である必要があります

于 2012-11-09T23:38:15.303 に答える