如何使用C#在SQL表中查找用户名和密码

时间:2014-11-10 07:23:59

标签: c# .net sql-server

我目前在sql server上有一个名为" users"分别使用以下列/数据类型:

username/nvarchar(max)
email/nvarchar(max)
password/nvarchar(max)

我的桌子有一行:

[test][test@gmail.com][test]

我使用以下代码搜索表格。我取用户名(实际上就是电子邮件)并拆分它以便它成为测试。然后我尝试选择已测试的行作为用户名。一旦我创建了阅读器,我就会尝试将表中的电子邮件与表中的用户名和密码进行比较:

  using (SqlConnection conn = new SqlConnection())
  {
        conn.ConnectionString ="connectionstring";
        conn.Open();
        //grab the username and password from the request
        string username = req.Form[0]; //test@gmail.com
        string password = req.Form[1]; //test

        if (!String.IsNullOrEmpty(username) && !String.IsNullOrEmpty(password))
        {
            //hash the password
            //lookup the password and username in the table
            SqlCommand command = new SqlCommand(String.Format("SELECT username, email, password FROM users WHERE username = '@{0}'", username.Split('@')[0]), conn);
            SqlDataReader reader = command.ExecuteReader();

            while(reader.Read())//THIS always evaluates to false
            {
                if (reader[1] == username && reader[2] == password) { return true; }
            } 
        }
        return false;
    }

我已经使用Visual Studio 2013对其进行了调试,因此我确信我的用户名和密码是test@gmail.com并且测试。我没有得到任何例外,读者在其对象中有三列值,但它无法找到表中唯一与用户名匹配的行。我是SQL查询的新手,所以我很可能在那里做错了。我的问题是它永远不会进入while循环来检查电子邮件的用户名和密码与密码。我也使用适当的数据类型吗?

调试器显示阅读器具有以下内容:

 Depth: 0
 FieldCount: 3
 HasRows: false
 IsClosed: false
 RecordsAffected: -1
 VisibleFieldCount: 3

2 个答案:

答案 0 :(得分:5)

您的查询语法有问题: 您正在编写它,就好像您在其中传递参数一样,这会产生以下结果:

SELECT username, email, password FROM users WHERE username = '@test'

你真正想要的是这个字符串

SELECT username, email, password FROM users WHERE username = 'test'

要执行此操作,您必须将SQL命令更改为:

 SqlCommand command = new SqlCommand(String.Format("SELECT username, email, password FROM users WHERE username = '{0}'", username.Split('@')[0]), conn);

你的问题如下:因为你正在检查'@test',你没有得到结果。在此之后,您的读者没有读取任何数据,因为没有数据,因此reader.Read()永远不会返回true并且您的while循环失败。

在此之后,由于原因,您将参数化您的查询!

SqlCommand command = new SqlCommand("SELECT username, email, password FROM users WHERE username = @usern", conn);
command.Parameters.Add('usern', username.Split('@')[0]);
SqlDataReader reader = command.ExecuteReader();
while(reader.Read()) {
    ....
}

答案 1 :(得分:1)

试试这个:

您正在使用Quering DataBase

  

SELECT用户名,电子邮件,密码FROM users

SqlCommand cmd = new SqlCommand();
cmd.connection = con;

cmd.CommandText = "SELECT username, email, password FROM users";
SqlDataReader reader = cmd.ExecuteReader();

while(reader.Read())//THIS always evaluates to false
{
     if (reader.GetString(0) == username &&
         reader.GetString(2) == password) 
     {
         return true; 
     }
} 

编辑:

后来理解你的ResultSet只返回一行,这不是最佳做法       您必须按照@Serv的建议将其拆分为代码,然后检查确定       用户名和密码