我的 SqlDataReader 没有行



当我调试控制台时,我的阅读器没有行。您可以在下面找到代码。

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作为更全面的错误处理。

相关内容

  • 没有找到相关文章

最新更新