当我调试控制台时,我的阅读器没有行。您可以在下面找到代码。
public ActionResult Login(LoginViewModel loginViewModel)
{
bool isSucces = false;
if (ModelState.IsValid)
{
SqlConnection conn = new SqlConnection(@"Data Source=DESKTOP-9DG53HKTOMSQL;Initial Catalog=Webshop;Integrated Security=True");
conn.Open();
string username = loginViewModel._username;
string password = HashPassword(loginViewModel._username, loginViewModel._password);
SqlCommand cmd = new SqlCommand("SELECT * FROM [User] WHERE Username = @Username and Password = @Password;", conn);
cmd.Parameters.AddWithValue("@Username", username);
cmd.Parameters.AddWithValue("@Password", password);
SqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
int Role = Convert.ToInt32(reader["Role"]);
}
}
else
{
Console.WriteLine("No rows found.");
}
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
bool loginSuccessful = ((ds.Tables.Count > 0) && (ds.Tables[0].Rows.Count > 0));
if (loginSuccessful)
{
//return View(new LoginViewModel(isSucces, Role));
}
else
{
Console.WriteLine("Invalid username or password");
}
}
return View();
}
程序完全跳过 while 循环。我一直在寻找一段时间,但找不到答案,也许你们看到了问题所在。
首先,当你使用SqlDataAdapter
为什么需要SqlDataReader
?我推荐SqlDataAdapter
因为它还可以管理Connection
更好的方法,然后SqlDataReader
。你必须跟进很多事情SqlDataReader
Reader.Close()
、Reader.Dispose()
、Connection.Open()
和Connection.Close()
,当它不异步时Reader
很可能在多次命中时失败。
您可以像这样简单地执行代码:
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
int Role = 0;
bool loginSuccessful = false;
if(ds != null && ds.tables[0].Rows.Count > 0)
{
Role = Convert.ToInt32(ds.tables[0].Rows[0]["Role"]);
loginSuccessful = true;
}
else
{
// No rows found
}
其次(针对您的实际问题(: 因此,必须与传递的参数不匹配0
行。
您是否确定从 SELECT 查询接收数据?尝试将其替换为如下查询:
SELECT * FROM Users WHERE id = 1;
我也会替换你的如果读者。HasRows带有一个简单的trycatch作为更全面的错误处理。