使用更新查询c#时丢失信息

时间:2015-12-08 22:54:31

标签: c# asp.net c#-4.0

您好我正在尝试使用更新查询来更新列甚至整行,但是当我只更新某个列时,我得到“没有给出一个或多个必需参数的值”。我如何使用代码同时更新列和行?

这是我的代码:

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();
    }
}

2 个答案:

答案 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();
}

但这有点难看,我建议您在加载页面时确保文本框中填充了当前数据。