如何使用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
您的查询语法有问题:你在写它,就好像你在里面传递一个参数,结果如下:
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的建议将其拆分到代码中,然后检查
用户名和密码