我目前在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
答案 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的建议将其拆分为代码,然后检查确定 用户名和密码