【问题标题】:OleDbDataReader reader = command.ExecuteReader(); System.Data.OleDb.OleDbException: 'No value given for one or more required parameters.'OleDbDataReader reader = command.ExecuteReader(); System.Data.OleDb.OleDbException:“没有为一个或多个必需参数提供值。”
【发布时间】:2018-12-07 11:14:24
【问题描述】:
private void btnLogin_Click(object sender, EventArgs e)
    {
        connection.Open();
        OleDbCommand command = new OleDbCommand();
        command.Connection = connection;
        command.CommandText = "select * from Cafelist where Username = '" + txtUsn.Text + "' and Password = '" + txtPass.Text + "'";
        OleDbDataReader reader = command.ExecuteReader();

        int count = 0;

        while (reader.Read())
        {
            count = count + 1;
        }
        if(count ==1)
        {
            MessageBox.Show("Username and password is correct");
        }
        else if (count > 1)
        {
            MessageBox.Show("Duplicate Found");
        }
        else
        {
            MessageBox.Show("Username/Password Incorrect");
        }


        connection.Close();
    }

尝试使用此代码拉取 usn 并通过登录,并收到此错误,尝试四处寻找解决方案,但没有找到与我的问题类似的问题,我知道这可能是非常基本的事情,但请放轻松因为我只玩了几个星期的 c#,这是我第一次尝试使用数据库。

没有尝试做任何安全功能只是想弄清楚为什么当我输入文本并单击登录时出现此错误,我一直在关注 youtube 视频尝试和自学(尽可能多地使用这个主题)但是他没有遇到这个错误,我用谷歌搜索自己被遗忘了。

在此先感谢,因为这是我第一次发帖,所以需要更多信息让我知道。

【问题讨论】:

  • 如果你得到的错误信息真的来源于这段代码,那么它一定与运行时文本框的内容有关。您需要为用户名和密码使用参数,而不是将它们的值注入 SQL 字符串:这称为sql injection vulnerability,这可能是 SQL 查询最常见的初学者错误。 “发现重复”的逻辑没有实际意义,应用程序不应该关心多个用户是否具有相同的密码。唯一的用户名可以由唯一的密钥强制执行。
  • 我真的希望您不要将密码存储为纯文本。在将其存储在数据库中之前,您应该对加盐密码进行哈希处理,以获得任何体面的安全级别。
  • 我运行程序,它让我输入 usn 和密码,然后立即弹出错误。 Tbacon 我目前存储为纯文本,因为这只是我在家里玩的东西,以便在开始为密码添加安全措施之前习惯他的基础知识。 @mjwills OleDbDataReader reader = command.ExecuteReader();是什么让我出错
  • stackoverflow.com/questions/7528302/… 可能会帮助您找到引发异常的行。

标签: c#


【解决方案1】:

您需要在查询中插入要替换的参数以获取实际值,查询和参数在OleDbCommand上是分开的,尝试像这样替换您的cmd.CommandText

 command.CommandText = "select * from Cafelist where Username = @UserName and Password = @UserPass";

然后你需要像这样给cmd提供参数:

cmd.Parameters.AddRange(new OleDbParameter[]
{
     new OleDbParameter("@UserName", txtUsn.Text),
     new OleDbParameter("@UserPass", txtPass.Text),
               ...
});

【讨论】:

  • 抱歉刚刚发现我的回复没有发布,谢谢,马上解决了问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多