没有为一个或多个必需参数提供值。时间:2019-03-08 标签:c#oledb
No value given for one or more required parameters. c# oledb
不确定问题出在哪里。没有为一个或多个参数指定值。我试过将代码从 if 语句中移出,但没有用。不确定数据适配器是否要求我输入所有列值。
int ID = Convert.ToInt32(txtStudent.Text);
string grade = "A";
int result = Convert.ToInt32(txtResult.Text);
string sql = "UPDATE Student SET grade=@grade WHERE ID = ?";
OleDbCommand command = new OleDbCommand(sql, connectionString);
if ((result >= 70) && (result <= 100))
{
grade = "A";
MessageBox.Show("Result is: A");
command.Parameters.Add("@grade", OleDbType.VarChar).Value = grade;
command.Parameters.Add("@ID", OleDbType.VarChar).Value = ID;
}
else if ((result >= 60) && (result < 70))
{
grade = "B";
MessageBox.Show("Result is: B");
command.Parameters.Add("@grade", OleDbType.VarChar).Value = grade;
command.Parameters.Add("@ID", OleDbType.VarChar).Value = ID;
}
else if ((result >= 50) && (result < 60))
{
grade = "C";
MessageBox.Show("Result is: C");
command.Parameters.Add("@grade", OleDbType.VarChar).Value = grade;
command.Parameters.Add("@ID", OleDbType.VarChar).Value = ID;
}
else if (result < 50)
{
grade = "F";
MessageBox.Show("Result is: F");
command.Parameters.Add("@grade", OleDbType.VarChar).Value = grade;
command.Parameters.Add("@ID", OleDbType.VarChar).Value = ID;
}
else
{
MessageBox.Show("Incorrect data entered");
}
OleDbDataAdapter dataadapter = new OleDbDataAdapter(command);
DataSet ds = new DataSet();
dataadapter.Fill(ds, "Student");
dataGridView1.DataSource = ds;
dataGridView1.DataMember = "Student";
我觉得问题就在那一行;
OleDbDataAdapter dataadapter = new OleDbDataAdapter(sql, connectionString);
您在命令中添加了参数,但您仍然使用sql
字符串,该字符串需要OleDbDataAdapter
构造函数中的参数及其值。
使用您的命令而不是您的 sql 查询;
OleDbDataAdapter dataadapter = new OleDbDataAdapter(command, connectionString);
并使用 using
statement 自动处理你的 OleDbConnection
、OleDbCommand
和 OleDbDataAdapter
。
作为你的第二个问题,来自OleDbCommand.Parameters
的文档:
The OLE DB .NET Provider does not support named parameters for passing parameters to an SQL statement or a stored procedure called by an OleDbCommand when CommandType is set to Text.
实际上,它确实支持命名参数,但名称可以忽略不计。唯一重要的是您的参数顺序。由于您首先添加 @ID
参数您的命令,这将被添加到您定义的命令中的第一个参数,即 @grade
。如您所见,这会产生一个问题。
同时更改参数顺序;
command.Parameters.Add("@grade", OleDbType.VarChar).Value = grade;
command.Parameters.Add("@ID", OleDbType.VarChar).Value = ID;
不确定问题出在哪里。没有为一个或多个参数指定值。我试过将代码从 if 语句中移出,但没有用。不确定数据适配器是否要求我输入所有列值。
int ID = Convert.ToInt32(txtStudent.Text);
string grade = "A";
int result = Convert.ToInt32(txtResult.Text);
string sql = "UPDATE Student SET grade=@grade WHERE ID = ?";
OleDbCommand command = new OleDbCommand(sql, connectionString);
if ((result >= 70) && (result <= 100))
{
grade = "A";
MessageBox.Show("Result is: A");
command.Parameters.Add("@grade", OleDbType.VarChar).Value = grade;
command.Parameters.Add("@ID", OleDbType.VarChar).Value = ID;
}
else if ((result >= 60) && (result < 70))
{
grade = "B";
MessageBox.Show("Result is: B");
command.Parameters.Add("@grade", OleDbType.VarChar).Value = grade;
command.Parameters.Add("@ID", OleDbType.VarChar).Value = ID;
}
else if ((result >= 50) && (result < 60))
{
grade = "C";
MessageBox.Show("Result is: C");
command.Parameters.Add("@grade", OleDbType.VarChar).Value = grade;
command.Parameters.Add("@ID", OleDbType.VarChar).Value = ID;
}
else if (result < 50)
{
grade = "F";
MessageBox.Show("Result is: F");
command.Parameters.Add("@grade", OleDbType.VarChar).Value = grade;
command.Parameters.Add("@ID", OleDbType.VarChar).Value = ID;
}
else
{
MessageBox.Show("Incorrect data entered");
}
OleDbDataAdapter dataadapter = new OleDbDataAdapter(command);
DataSet ds = new DataSet();
dataadapter.Fill(ds, "Student");
dataGridView1.DataSource = ds;
dataGridView1.DataMember = "Student";
我觉得问题就在那一行;
OleDbDataAdapter dataadapter = new OleDbDataAdapter(sql, connectionString);
您在命令中添加了参数,但您仍然使用sql
字符串,该字符串需要OleDbDataAdapter
构造函数中的参数及其值。
使用您的命令而不是您的 sql 查询;
OleDbDataAdapter dataadapter = new OleDbDataAdapter(command, connectionString);
并使用 using
statement 自动处理你的 OleDbConnection
、OleDbCommand
和 OleDbDataAdapter
。
作为你的第二个问题,来自OleDbCommand.Parameters
的文档:
The OLE DB .NET Provider does not support named parameters for passing parameters to an SQL statement or a stored procedure called by an OleDbCommand when CommandType is set to Text.
实际上,它确实支持命名参数,但名称可以忽略不计。唯一重要的是您的参数顺序。由于您首先添加 @ID
参数您的命令,这将被添加到您定义的命令中的第一个参数,即 @grade
。如您所见,这会产生一个问题。
同时更改参数顺序;
command.Parameters.Add("@grade", OleDbType.VarChar).Value = grade;
command.Parameters.Add("@ID", OleDbType.VarChar).Value = ID;