【问题标题】:I keep getting "Invalid attempt to read when no data is present" even though I am sure a record exist即使我确定存在记录,我仍不断收到“不存在数据时尝试读取无效”的消息
【发布时间】:2015-11-15 15:47:42
【问题描述】:

我一直在试图弄清楚为什么我会收到此错误消息,并且它让我陷入困境,因为我认为我已经应用了所有需要的东西来获得我想要的结果。我该怎么做才能做到这一点。

private void btnLogin_Click(object sender, EventArgs e)
    {
        try
        {
            // Receive user input from login screen
            string username = txtUsername.Text;
            string password = txtPassword.Text;

            // Test if user input is null or white space aka empty
            if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password))
                MessageBox.Show("Please enter both username and password");
            else
            {
                // Establish connection with database
                SqlConnection cn = new SqlConnection(@"SERVER=KACY-PC\SQLEXPRESS2014;DATABASE=hardwareMgmt;Integrated Security=True");
                cn.Open();

                SqlCommand cmd = new SqlCommand();
                cmd.Connection = cn;

                string strSQL = "SELECT * FROM tbl_user WHERE username = '" + username + "' AND password = '" + password + "'";
                cmd.CommandText = strSQL;

                SqlDataReader dr = cmd.ExecuteReader();

                // Count number of record
                int count = 0;
                while (dr.Read())
                    count += 1; MessageBox.Show(Convert.ToString(count));
                dr.Read();

                // Validate whether user has logged in before and display appropriate 
                if (count == 1 && dr["first_login"].ToString() == "N")
                    MessageBox.Show("Welcome back '" + dr["first_name"].ToString() + "' '" + dr["last_name"].ToString() + "'", "Welcome back", MessageBoxButtons.OK);
                else if (count == 1 && dr["first_login"].ToString() == "Y")
                    MessageBox.Show("Hello " + dr["first_name"].ToString() + "' '" + dr["last_name"].ToString() +
                        "\nIt appears that you are logging in for the first time" +
                        "\nor your password got reset", "Welcome", MessageBoxButtons.OK, MessageBoxIcon.Information);
                else if (count > 1)
                    MessageBox.Show("Duplication in user account \nPlease contact System Administrator", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                else
                    MessageBox.Show("Invalid Username or Password", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

在登录窗口中输入凭据后,我不断收到以下结果。我确信在数据库中找到了该记录,但它只是没有读取它。

【问题讨论】:

  • 是的,我确定它会返回数据。我检查了数据库,甚至打印了上面代码中所述的记录数。此外,我只是为明天到期的学校作业做这件事。但可以肯定的是,我也想知道你有什么想法来缓解 SQL 注入。

标签: c# winforms desktop-application


【解决方案1】:

你的

dr.Read();

行是不必要的,因为在你之后

while (dr.Read())
    count += 1; MessageBox.Show(Convert.ToString(count));

代码,将有 no 下一条记录要读取,这就是您收到此错误的原因。

正如 Ivan 评论的那样,您无法在 while 之后读取任何数据。这就是为什么,无论您想阅读first_loginfirst_namelast_name 等列,您都必须在迭代阅读器时阅读。这就是为什么要考虑先改变你的逻辑。

对于我自己,当我想读取值而不是dr[...] 语法时,我更喜欢使用SqlDataReader 中的GetXXX methods。在我看来,这使得更具可读性。

还有一些事情;

【讨论】:

  • +1 只是为了记录,删除不必要的行将无济于事,因为他将开始获得dr[..] 语句的另一个例外。整个逻辑是错误的。
  • @IvanStoev 对。我根据您的评论更新了我的答案。谢谢。
  • 感谢这真的很有帮助。我必须首先说我在课堂上根本没有得到教学。我已经应用了以上所有内容。 parameterized queryusing statements 并重新设计了逻辑,以便在 while (dr.read()) 期间捕获所需的字段。我唯一没有应用的是不将密码作为纯文本存储在数据库中。原因是因为它不是这个学校作业的真正要求。
  • 我也没有使用 SqlDataReader 的 GetXXX 方法,因为我不太了解如何应用这个概念。
猜你喜欢
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
相关资源
最近更新 更多