System.Data.OleDb.OleDbException:'没有给出一个或多个必需参数的值。'错误

时间:2018-04-09 11:57:18

标签: c#

我有一个学校项目,我想在visual studio中创建一个登录表单。出现此错误。我怎么解决这个问题? 在OleDbDataReader上rdr = cmd.ExecuteReader();我得到了System.Data.OleDb.OleDbException:'没有给出一个或多个必需参数的值。错误,我不知道为什么,因为它与另一个有效的项目相同。我的数据库位于项目的bin文件夹中。帮帮我

    OleDbConnection con = new OleDbConnection();
    public Autentificare()
    {
        InitializeComponent();
        con.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + Environment.CurrentDirectory + @"\Librarie.accdb";
    }

    private void buttonautentificare_Click(object sender, EventArgs e)
    {
        if (textBoxparola.Text != "" && textBoxid.Text != "")
        {

            con.Open();
            int ct = 0, id = 0;
            string sql = "select ID_client from Clienti where Parola='" + textBoxparola.Text + "' and E-mail='" + textBoxid.Text + "'";
            OleDbCommand cmd = new OleDbCommand(sql, con);
            OleDbDataReader rdr = cmd.ExecuteReader();

            while (rdr.Read())
            {
                ct++;
                id = int.Parse(rdr[0].ToString());
            }
            if (ct>0)
            {
                MessageBox.Show("Autentificare cu succes!");
                Optiuni f = new Optiuni(id);
                this.Hide();
                f.ShowDialog();

                con.Close();

            }

            else
            {
                MessageBox.Show("Date incorecte!");
                textBoxid.Text = textBoxparola.Text = "";
                con.Close();
            }
        }
    }

} }

1 个答案:

答案 0 :(得分:2)

您的问题是由名为电子邮件的字段引起的。 这被Jet引擎解析为表达式: E减去邮件,因为您没有任何名为 E mail 的字段, Jet引擎希望你为这两个单词提供一些参数。

您应该将查询更改为

string sql = @"select ID_client from Clienti 
               where Parola=@parola
                 and [E-mail]=@mail";
OleDbCommand cmd = new OleDbCommand(sql, con);
cmd.Parameters.Add("@parola", OleDbType.VarWChar).Value = textBoxparola.Text;
cmd.Parameters.Add("@mail", OleDbType.VarWChar).Value = textBoxid.Text;

using(OleDbDataReader rdr = cmd.ExecuteReader())
  .....

应在数据库表中更改有问题的字段名称,或者需要将其封装在方括号之间以避免解析错误。
另请注意,您应该永远不会连接字符串以形成sql命令。这是一种众所周知的允许Sql Injection hack的方法,虽然Access更难以利用,但始终使用参数化查询是一种很好的做法。如果有人在用于查询文本的两个文本框中插入单引号,那么如果没有参数,您的查询将会失败。