1

ログインページを作っています。そのために、データベースからユーザー名とパスワードを認証します。プログラムを実行すると、クエリが実行され、-1 の値が返されます。ユーザー名とパスワードが正しいため。私を助けてください。私のプログラムコードは次のとおりです。

public partial class Home : System.Web.UI.Page
{
    SqlConnection objcon;
    String query;
    SqlCommand cmd;
    int num;
    //SqlDataAdapter DataAdapter;

    protected void Page_Load(object sender, EventArgs e)//db open in page load.
    {
        objcon = new SqlConnection("Data Source String");
        objcon.Open();
    }
    //query execution and authentication on button click 

    protected void Button1_Click(object sender, EventArgs e)
    {
        query = "select * from tbl_user where UserName='" + txtUname.Text + "' and Password='" + txtPwd.Text + "'";

        cmd = new SqlCommand(query,objcon);

        num = cmd.ExecuteNonQuery();

        //Label3.Text = num.ToString();
        if (num == -1)
            Label3.Text = "Correct";
        else
            Label3.Text = "Incorrect";
        objcon.Close();
    }
}
4

2 に答える 2

5

このコードを見てください:

num = cmd.ExecuteNonQuery();

という変数に基づいてコマンドを作成しているとしたら、 non-queryqueryという語句を含むメソッドを呼び出すことに本当に意味があると思いますか? まだ確信が持てない場合は、 のドキュメントから:ExecuteNonQuery

UPDATE、INSERT、および DELETE ステートメントの場合、戻り値はコマンドによって影響を受けた行の数です。[...] 他のすべてのタイプのステートメントの場合、戻り値は -1 です。

あなたのステートメントはSELECTクエリであるため、文書化されているとおりに -1 を返しています。

ExecuteScalarまたはを使用する必要があると思いますExecuteReader。たとえば、一致を取得しようとしている場合は、次を使用する必要があります。

SELECT COUNT(*) ... (rest of query, parameterized of course)

個人的には、James の回答によると -1 または null を取るよりも好きですが、それは好みの問題です。

一致の数を取得しようとしていない場合、そもそもなぜint変数に割り当てているのかが明確ではありません。

編集:追加の問題:(コメントですでに述べたように

  • SqlConnectionコンストラクターではなく、必要なときにのみ作成して開きます
  • usingの両方にディレクティブを使用して、例外が発生した場合でもそれらを閉じますSqlConnectionSqlCommand
  • SQL にユーザー入力を直接含めないでください。代わりにパラメーター化された SQL を使用して、SQL インジェクション攻撃を回避し、コードとデータの分離を改善し、変換エラーを回避します。
  • ユーザーのパスワードをプレーンテキストでデータベースに直接保存しないでください。これは、どの Web サイトにとっても非常に恐ろしいことです。
  • そもそも独自のユーザー認証コードを書こうとしないでください。多くの異なる場所で既に行われています。
于 2012-04-20T21:59:00.070 に答える
0

必要なのは、スカラー クエリを実行することです。つまり、単一の値を返します。クエリの場合、ユーザー名とパスワードが一致する場合は、次を選択するだけです-1

SELECT -1 FROM tblUser WHERE Username = 'James' AND Password = 'Johnson'

値が返された場合、その値は になり-1、一致していることがわかります。値 ( null) が返されない場合は、一致していません。

編集

質問に答えるだけでなく、対処する必要があるコードの主要な問題がいくつかあります。

  1. ページが読み込まれるたびに新しい接続を開いています。それは大したことではありません!ページが読み込まれるたびに新しい接続を開くだけでなく、クエリが実行された後に接続を閉じることもありません。

  2. 連結を使用してクエリを作成する代わりに、パラメーター化されたクエリを使用して、SQL インジェクションのリスクを回避します。SQL の知識が少しでもあれば、クエリを簡単に回避して、データに大混乱をもたらす可能性があります。

于 2012-04-20T22:04:45.200 に答える