executioncalar返回null值

时间:2014-05-01 07:17:32

标签: asp.net

 string checkuserQuery = "select username from usersign where Username=' " + TextBox1.Text + " ' ";
 SqlCommand usercom = new SqlCommand(checkuserQuery, conn);
 string user1 = string.Empty;
 Object val = usercom.ExecuteScalar();
 if (val != null)
 {
     user1 = val.ToString();
     if (user1 == TextBox1.Text)
     {

         string checkpasswordQuery = "select password from usersign     where Username=' " + TextBox1.Text + " ' ";
         SqlCommand passcom = new SqlCommand(checkpasswordQuery, conn);
         string password = passcom.ExecuteScalar().ToString();
         if (password == TextBox2.Text)
         {
             Session["New"] = TextBox1.Text;
             Label5.Text = "password is correct";
             Response.Redirect("user.aspx");
         }
         else
         {
             Label5.Text = "password is not correct";

         }

     }
 }
 else
 {
     Label5.Text = "val is null";
 }
 }

2 个答案:

答案 0 :(得分:1)

如果查询没有返回值,

ExecuteScalar()将返回null。

  

返回结果集中第一行的第一列,或返回null   如果结果集为空,则为引用(在Visual Basic中为Nothing。)

Source

此行将抛出空引用异常:

passcom.ExecuteScalar().ToString();

使用字符串连接构建查询很容易出错。更重要的是,它易受SQL注入攻击。该代码表明密码以纯文本形式存储在数据库中。

SQL注入和纯文本密码是任何应用程序的一个严重问题。参数化您的查询(使用ADO.Net非常容易)并哈希密码。

缺少匹配可能是由以下行引起的:

string checkpasswordQuery = "select password from usersign     where Username=' " + TextBox1.Text + " ' ";

请注意字符串连接中添加的额外空格。 TextBox1中的任何内容都将以空格开头/后跟,导致匹配失败。

答案 1 :(得分:0)

问题可能是下面的空格字符(我把*放在空格中) 使用不当)

where Username='*" + TextBox1.Text + "*' "

因此,上述内容将意味着您的查询正在尝试获取具有的用户名 开头和结尾的空格字符,所以只需删除那些空格

另一点是,这种查询应该与参数一起使用,因为它很容易 SQL注入类型的攻击