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

本文关键字:用户 查找 密码 何使用 SQL | 更新日期: 2023-09-27 18:29:53

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

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

我的桌子只有一排:

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

我正在使用以下代码来搜索该表。我取用户名(实际上是电子邮件)并将其拆分,以便进行测试。然后,我尝试选择具有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和测试。我没有得到任何异常,reader的对象中有三个列值,但它找不到表中唯一与用户名匹配的行。我对SQL查询很陌生,所以很可能我在那里做错了什么。我的问题是,它从来没有进入while循环,用用户名检查电子邮件,用密码检查密码。我是否为此使用了适当的数据类型?

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

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

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

您的查询语法有问题:你在写它,就好像你在里面传递一个参数,结果如下:

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()) {
    ....
}

试试这个:

你正在像这个一样查询数据库

从用户中选择用户名、电子邮件和密码

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; 
     }
} 

编辑:

稍后理解您的结果集只返回一行,这不是最佳做法您必须按照@Serv的建议将其拆分到代码中,然后检查
用户名和密码