2017-05-28 9 views
0

最初に投稿してください。まず、このサイトの存在を感謝します。フォームに導入されたユーザーとパスワードがSQLデータベースに存在するかどうかを調べる

今私は、ユーザーのログインが必要なプロジェクト(C#)を作っています。プロファイルはSQLベースに格納されており、ログインを許可するには資格情報(ユーザー/パス)が正しいかどうかを確認する必要があります。

私は非常にSQLを理解していますので、間違いがないようにしてください。

フォームは非常にうまく動作しています。何がうまくいかないのは、私のデータベースのデータチェックです。

パブリックブールValidacaoLogin(文字列のユーザー、文字列のパス)

 cn.Open(); 
     cmd = new SqlCommand("select * from BDPerfil left join BDPerfilTecnico on BDPerfil.USER = BDPerfilTecnico.USER where BDPerfil.USER = @USER;", cn); 
     cmd = new SqlCommand("select * from BDPerfil where NIF = '" + user + "' AND PASSWORD = '" + pass + "';", cn); 
     cmd.Parameters.AddWithValue("@USER", user); 
     cmd.Parameters.AddWithValue("@PASSWORD", pass); 
     dr = cmd.ExecuteReader(); 
     if (dr.HasRows) 
     { 
      while (dr.Read()) 
      { 
       if ("@USER" == user) 
       { 
        if ("@PASSWORD" == pass) 
         dr.Close(); 
        cn.Close(); 
        return true; 
       } 
      } 
     } 
      dr.Close(); 
      cn.Close(); 
      return false; 
    } 

私は別のプロファイルを格納するための2つのテーブルがあります:私は、フォームには、次の関数を呼び出すのログイン押したときに、BDPerfilTecnicoとBDPerfilAssistをので、私は自分の欲しいですBDPerfilAssistを使用する必要はありませんが、私のすべてのテストプロファイルはBDPerfilTecnico上にあるので、私はプログラムを両方とも(結合を通じて)チェックします。

ヘルプ? ありがとうございます。

+0

この方法でパスワードを確認すると、クリアテキストとして保存されます。通常これは嫌にされます(軽く置くために) –

+0

与えられたユーザー名とパスワードを持つ行だけを取得します。したがって、行=未知の組み合わせはありません。任意の行=成功。行をもう一度チェックする必要はありません( 'if(" @USER "== user)など)。 –

+0

@Hans Kesting "パスワードをこのようにチェックすると、クリアテキストとして保存されていることを意味します。通常は気をつけます(軽く置く)" 私は知っています。しかし、これはクラスのためであり、私たちはデータを暗号化する方法について教えられていないので、これで十分です。 私はあなたが言ったことをかなり得ていませんでした。これは、 "@USER" ==ユーザと "@PASSWORD" == passのブール値を行う必要はないということですか? –

答えて

0

少なくとも、クエリのパラメータが必要です。私は期待しています:

cmd = new SqlCommand("select * from BDPerfil where NIF = @USER AND PASSWORD = @PASSWORD'", cn); 

クエリのパラメータを使用して適切なパスにいます。クエリ自体にそれらを必要とするだけです。

注:コードにも他の問題がある可能性があります。

+0

"注:コードにも他の問題がある可能性があります。 私はそこにいると確信しています。初めてSQLを使って作業する。私はそれについて多くのことを知らないので、私は多くの間違いをする傾向があります。 しかし、すばやく返信いただきありがとうございます。それが示唆されたように動作するかどうかチェックします。 EDIT - "AND 'キーワードの近くに誤った構文があるというエラーが表示される –

+0

私の間違いですが、今は実行されますが、依然として資格情報を受け入れません –

0

結果は、変数drに格納され、テーブル内の列の内容によって異なります。 *の代わりに、必要なテーブルの列、つまりユーザー、パスワードをリストする必要があります。次に、dr変数を使用してdr.getString(0)やpasswordのdr.getString(1)などの文を使用してこれらの値を取得できます。ユーザーとパスワードの変数は、コード内のクエリによって変更されることはありません。また、リテラル文字列 "@user"と "@password"はクエリから出てこないので、なぜあなたがそれらと比較するのかわかりません。代わりに、あなたは何かのようにしたいです。 If(dr.getString(0)== user)

データベースのパスワードを暗号化してください。ユーザーが入力した内容を暗号化し、暗号化されたパスワードと暗号化されたパスワードを比較することができます。

幸運

+0

私は、 "オブジェクト参照がオブジェクトのインスタンスに設定されていません" –

+0

'code'cn.Open(); cmd = new SqlCommand(" select * from BDPerfil from BDPerfilTecnico on BDPerfilTecnico on BDPerfil.USER = 0; BDPerfil.USER = @USER; "); cmd = new SqlCommand(" BDPerfilからのNIF、PASSWORDの選択 "、cn); dr.GetString(0); dr.GetString(1) ; dr = cmd.ExecuteReader(); if (dr.HetRows) { while(dr.Read()) { if(dr.GetString(0)== user && dr.GetString(1)== pass) はtrueを返します。 –

+0

私はそれをコードのように見せることはできません。 :( –

関連する問題