更新命令不工作ms访问c#

时间:2017-04-13 22:16:36

标签: c# sql asp.net ms-access

我有一个gridview,它连接到一个数据源从那里获取值。我创建了一个selectedindexchanged函数,当click被单击时工作。它显示ID,orderID,From,To和Price值并打开面板,其中有4个文本框和如果用户想要更改这些值,则下拉列表。在此之前一切正常。当用户更改某些值并单击时,不提交数据库中的任何更改。我使用id获取值; “string id = orderGrid.SelectedRow.Cells [1] .Text;”

这是我的提交按钮代码;

protected void submitButton_Click(object sender, EventArgs e)
    {      
        string id = orderGrid.SelectedRow.Cells[1].Text;
        OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("db.mdb") + ";Persist Security Info=False");
        string query = "update ordersTable set orderID=@testID,fromLocation=@from,toLocation=@to,price=@price WHERE ID = @id ";
        OleDbCommand cmd = new OleDbCommand(query, con);
        cmd.Parameters.AddWithValue("@id", id);
        cmd.Parameters.AddWithValue("@testID", orderBox.Text);
        cmd.Parameters.AddWithValue("@from", fromText.Text);
        cmd.Parameters.AddWithValue("@to", toList.SelectedItem.Text);
        cmd.Parameters.AddWithValue("@price", priceBox.Text);
        try
        {        
            con.Open();
            cmd.ExecuteNonQuery();
            con.Close();
            Response.Write("Edit Complete !");

        }
        catch (Exception ex)
        {
            Response.Write("Error : " + ex);
        }
        orderGrid.DataBind();
    }

id string在我的selectedindexchanged函数中运行得非常好。

1 个答案:

答案 0 :(得分:1)

在OleDb参数中,它们的位置不是通过名称来识别的 您的参数占位符 @ID 是查询中的最后一个,但您将其添加为集合中的第一个。
这导致您的WHERE条件完全错误 (您搜索ID等于priceBox内容的记录)

只需移动ID的插入作为最后一个参数

cmd.Parameters.AddWithValue("@testID", orderBox.Text);
cmd.Parameters.AddWithValue("@from", fromText.Text);
cmd.Parameters.AddWithValue("@to", toList.SelectedItem.Text);
cmd.Parameters.AddWithValue("@price", priceBox.Text);
cmd.Parameters.AddWithValue("@id", id);

这是主要问题,但我可以看到另一个因使用AddWithValue而导致的问题。这是一个方便的捷径,但有时它会让你付出代价 在您的情况下,您将 @price 参数传递给字符串,如果您的 price 字段是小数(应该是),那么数据库引擎将尝试转换从字符串到小数,如果小数分隔符不相同,则在数据库中以错误的值结束。更好地检查priceBox中的值并将其自己转换为小数。

请参阅Can we stop to use AddWithValue already