2015-04-01 131 views
0

我必须做一个简单的登录,当您插入浏览器时不会崩溃a(“),所以我需要参数化查询字符串,但由于某种原因,我得到一个错误说:必须声明标量变量“@ UserName”

必须声明标量变量 “@用户”

这里是代码

private void DoSqlQuery() 
{ 
    try 
    { 
     SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["RolaConnectionString"].ConnectionString); 
     conn.Open(); 
     string checkUser = "select * from UserData where UserName = @UserName"; 
     SqlCommand com = new SqlCommand(checkUser, conn); 
     com.Parameters.AddWithValue("@Username", txtUserName.Text.Trim()); 

     int temp = Convert.ToInt32(com.ExecuteScalar().ToString()); 
     conn.Close(); 
     if (temp == 1) 
     { 
      conn.Open(); 
      string checkPassword = "select Password from UserData where UserName = @UserName"; 
      SqlCommand passConn = new SqlCommand(checkPassword, conn); 
      com.Parameters.AddWithValue("@Username", txtUserName.Text.Trim()); 
      string password = passConn.ExecuteScalar().ToString(); 
      conn.Close(); 
      if (password == txtPassword.Text) 
      { 
       Session["New"] = txtUserName.Text; 
       Response.Write("Password is correct"); 
       Response.Redirect("~/LoggedIn.aspx"); 
      } 
      else 
      { 
       Response.Write("Password is not correct"); 
      } 
     } 
     else 
     { 
      Response.Write("Username is not correct"); 
     } 
    } 
    catch(Exception e) 
    { 
     Response.Write(e.ToString()); 
    } 
} 
+1

检查拼写非常密切 - 你犯了一个错字。 – 2015-04-01 16:51:29

+1

具体来讲,要注意每个角色的情况。 – Servy 2015-04-01 16:52:04

+0

'@ Username''不等于''UserName'' – 2015-04-01 16:52:18

回答

0

您在内引用了错误的命令if声明:

string checkPassword = "select Password from UserData where UserName = @UserName"; 
SqlCommand passConn = new SqlCommand(checkPassword, conn); 
com.Parameters.AddWithValue("@Username", txtUserName.Text.Trim()); 
^^^-- should be passConn 

其结果是,你的第二个命令从来没有得到补充,所以你得到你提到的错误参数。区分大小写可能也是一个问题,但它取决于数据库的排序规则 - 默认情况下,SQL Server不区分大小写。

不相关的问题,其他一些建议:

  • 裹命令,并在using声明
  • 连接查询的一个查询(WHERE UserName = @UserName AND Password = @Password)的用户名和密码。黑客将首先搜索有效的用户名,然后尝试使用字典攻击破解密码。试图找到匹配的组合太多更难。
  • 请勿以纯文本格式存储您的密码 - 请使用salted hash
  • 或者只是使用内置安全提供程序而不是自行滚动。
+0

好的,谢谢,我现在开始工作。我会做出这些改变,感谢您的建议和帮助。 – user2740978 2015-04-01 17:20:53