我有一个学校项目,我想在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();
}
}
}
} }
答案 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更难以利用,但始终使用参数化查询是一种很好的做法。如果有人在用于查询文本的两个文本框中插入单引号,那么如果没有参数,您的查询将会失败。