0

私はasp.netを初めて使用し、asp.netを学習するためのログインページを作成しています。これがスクリプトのエラーです。パスワードに英語の文字のみが含まれている場合、エラーは発生しませんが、パスワードに数字/数字のみが含まれている場合、たとえばabc123または123の場合、28行目でエラーが発生します。

ありがとう

Object reference not set to an instance of an object.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error: 


Line 26:             string cmdStr2 = "Select Password from [user] where UserName = '" + TextBox2.Text + "'";
Line 27:             SqlCommand pass = new SqlCommand(cmdStr2, con);
Line 28:             string password = pass.ExecuteScalar().ToString();
Line 29:             
Line 30:             Label1.Text = password;

Source File: c:\inetpub\web1\Login.aspx.cs    Line: 28 

Stack Trace: 


[NullReferenceException: Object reference not set to an instance of an object.]
   Login.Button1_Click(Object sender, EventArgs e) in c:\inetpub\web1\Login.aspx.cs:28
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +118
   System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +112
   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5563
4

2 に答える 2

1

ExecuteScalar の戻り値は null にすることができます

タイプ: System.Object

結果セットの最初の行の最初の列、または結果セットが空の場合は null 参照 (Visual Basic では Nothing)。最大 2033 文字を返します。

nullしたがって、何かを行う前にを確認する必要があります。ExecuteScalar()

object retVal = pass.ExecuteScalar();
string data = "";
if(retVal != null)
  data = retVal.ToString();

注意事項

  • ユーザーにログインするには、パスワードとユーザー名を同時に確認しますWHERE username=@username AND password=@password。レコードが返された場合、ユーザーの資格情報は有効です。それ以外の場合は一致しません
  • SQL インジェクションのためにパラメータ化された変数を使用する: SQL インジェクションとは?

    string cmdStr2 = "Select 1 from [user] where UserName = @Username and Password=@Password";
    SqlCommand command = new SqlCommand(cmdStr2, con);
    command.Parameters.AddWithValue("@Username", Username);
    command.Parameters.AddWithValue("@Password", Password);
    
于 2012-10-12T08:35:05.057 に答える
0

まず、パラメーターを使用して値を指定する必要があります。文字列に値を埋め込むだけではいけません。ExecuteScalar() を使用しないでください。SqlDataAdapter返されたユーザー情報を取得し、パスワードを確認しDataTableます パスワードで検索する代わりに、「select * from user where username = @username」のようにする必要があります。次に、そのユーザー名のパスワードをユーザーが指定したパスワードと照合します。

于 2012-10-12T05:18:24.473 に答える