【问题标题】:My SqlDataReader Has No Rows?我的 SqlDataReader 没有行?
【发布时间】:2018-04-18 19:03:58
【问题描述】:

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

public ActionResult Login(LoginViewModel loginViewModel)
    {
        bool isSucces = false;


        if (ModelState.IsValid)
        {
            SqlConnection conn = new SqlConnection(@"Data Source=DESKTOP-9DG53HK\TOMSQL;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 循环。我已经搜索了一段时间,但找不到答案,也许你们看到了什么问题。

【问题讨论】:

  • 您确定为usernamepassword 发送正确的参数?你能放一个断点并确认你有正确的值并且你的选择确实返回数据吗?另外,您的查询不应该将用户名和密码作为引号字符串吗? SELECT * FROM [User] WHERE Username = '@Username' and Password = '@Password';
  • 你是说查询返回的是数据库中的实际结果吗?
  • @Veljko89 用户名和密码的值正确。
  • @Veljko89 我也尝试了引用的字符串。没用。。
  • @Veljko89 引用参数将它们转换为 text。参数确保您永远不需要引用。如果你需要使用引号,说明你使用的是字符串连接,容易受到 SQL 注入的影响

标签: c# sqldatareader sqlclient


【解决方案1】:

首先,当你用过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 Rows。

【讨论】:

  • 他说 ds.tables[0].rows.count > 0 在 if 语句中 0 是?
  • @Bogatom 真正的问题是你为什么要编写这个不安全的代码而不是使用 MVC 的身份验证?
【解决方案2】:

您确定从 SELECT 查询中接收数据吗? 尝试用如下查询替换它:

SELECT * FROM Users WHERE id = 1;

我还会用一个简单的 trycatch 替换您的 if reader.HasRows 作为更全面的错误处理。

【讨论】:

    猜你喜欢
    • 2013-07-22
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 2018-12-12
    相关资源
    最近更新 更多