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 的返回值可以为空

类型:System.Object

结果集中第一行的第一列,如果结果集为空,则为空引用(在 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如果 ExecuteScalar() 没有返回值,则 .ToString() 将无法正常工作并抛出空异常就是你得到的。您需要像“select * from user where username = @username”一样,而不是通过密码搜索。然后将该用户名的密码与用户提供的密码匹配。

于 2012-10-12T05:18:24.473 回答