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

War*_*avy 0 .net c# sql-server

我目前在一个名为"users"的sql server上有一个表,分别包含以下列/ datatype:

username/nvarchar(max)
email/nvarchar(max)
password/nvarchar(max)
Run Code Online (Sandbox Code Playgroud)

我的桌子有一排:

[test][test@gmail.com][test]
Run Code Online (Sandbox Code Playgroud)

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

  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;
    }
Run Code Online (Sandbox Code Playgroud)

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

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

 Depth: 0
 FieldCount: 3
 HasRows: false
 IsClosed: false
 RecordsAffected: -1
 VisibleFieldCount: 3
Run Code Online (Sandbox Code Playgroud)

Mar*_*rco 5

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

SELECT username, email, password FROM users WHERE username = '@test'
Run Code Online (Sandbox Code Playgroud)

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

SELECT username, email, password FROM users WHERE username = 'test'
Run Code Online (Sandbox Code Playgroud)

为此,您必须将SQL命令更改为:

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

您的问题如下:因为您正在检查'@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()) {
    ....
}
Run Code Online (Sandbox Code Playgroud)