您好我正在尝试使用更新查询来更新列甚至整行,但是当我只更新某个列时,我得到“没有给出一个或多个必需参数的值”。我如何使用代码同时更新列和行?
这是我的代码:
protected void updateButtn_Click(object sender, EventArgs e)
{
using (var myConnection = GetConnection())
{
myConnection.Open();
// You should be using a parameterized query here
using (var cmd = new OleDbCommand("Update client set username = ?, [name] = ?, surname = ?, [email] = ?, [password] = ? where id = ?", myConnection))
{
cmd.Parameters.AddWithValue("username", txt_uname.Text);
cmd.Parameters.AddWithValue("[name]", txt_name.Text);
cmd.Parameters.AddWithValue("surname", txt_sname.Text);
cmd.Parameters.AddWithValue("[email]", txt_email.Text);
cmd.Parameters.AddWithValue("[password]", txt_password.Text);
cmd.Parameters.AddWithValue("[id]", txt_id.Text);
cmd.ExecuteNonQuery();
} myConnection.Close();
}
}
答案 0 :(得分:3)
您忘记为[health issues]
添加参数,这是错误对您大喊大叫的缺失列。
protected void clientUpdate_Click(object sender, EventArgs e)
{
using (var myConnection = GetConnection())
{
myConnection.Open();
using (var cmd = new OleDbCommand("Update client set [name] = ?, surname = ?, [date of birth] = ?, [health issues] = ?, [yoga experience] = ?, [email] = ?, [phone number] = ?, [home address] = ?, [password] = ? where id = ?", myConnection))
{
cmd.Parameters.AddWithValue("[name]", txt_name.Text);
cmd.Parameters.AddWithValue("surname", txt_sname.Text);
cmd.Parameters.AddWithValue("[date of birth]", txt_dob.Text);
cmd.Parameters.AddWithValue("[health issues]", txt_HealthIssues.Text); \\ <---- This was missing.
cmd.Parameters.AddWithValue("[yoga experience]", txt_exp.Text);
cmd.Parameters.AddWithValue("[email]", txt_email.Text);
cmd.Parameters.AddWithValue("[phone number]", txt_phone.Text);
cmd.Parameters.AddWithValue("[home address]", txt_address.Text);
cmd.Parameters.AddWithValue("[password]", txt_password.Text);
cmd.Parameters.AddWithValue("id", txt_id.Text);
cmd.ExecuteNonQuery();
}
}
}
如果您只想更新1列,则需要编写一个不包含查询中其他参数的新查询。传统上,人们将使用类似于https://basarat.gitbooks.io/typescript/content/docs/types/lib.d.ts.html的实体框架来使这更容易。您需要检查并查看是否可以找到与OleDb连接对象兼容的ORM库。
另外,如果你不使用ORM ORM library,它必须假设您的代码是什么数据类型,并且由于索引在错误猜测时没有正确使用,有时会出现大的性能问题
答案 1 :(得分:0)
问题是,如果其中一个文本框为空,则您将提供空值作为参数。这就是为什么你得到没有给定值的错误。
您可以通过执行以下操作来解决此问题:
cmd.Parameters.AddWithValue("[name]", string.IsNullOrEmpty(txt_name.Text) ?
(object)DBNull.Value : txt_name.Text);
如果文本框为空,这将把列值设置为null。
如果您只想更新已填写的字段,则可以执行以下操作:
string cmd = "update blah set ";
bool shouldUpdate = false;
if (!string.IsNullOrEmpty(name_textbox))
{
shouldUpdate = true;
cmd += "name = ?,"; don't add the comma for the last one
command.Parameters.AddWithValue("name",name_textbox.Text);
}
... do this for each of your text boxes
if (shouldUpdate)
{
cmd += "where id = ?";
command.Parameters.AddWithValue("id",id);
command.ExecuteNonQuery();
}
但这有点难看,我建议您在加载页面时确保文本框中填充了当前数据。