我正在使用MS Access,想要如何正确更新数据…这是我在我的按钮点击事件上使用的代码,没有运气
OleDbCommand cmd = new OleDbCommand("SELECT * FROM ItemTemp WHERE ITEM='" + txtItemname.Text + "'", GetConnection());
OleDbDataReader reader = cmd.ExecuteReader();
//check if this item exist on the table ItemTemp
if (reader.HasRows == true)
{
// item exists, do below action
OleDbCommand cmde = new OleDbCommand("UPDATE ItemTemp SET QUANTITY=QUANTITY + @QUANTITY, PRICE=PRICE + @PRICE WHERE ITEM='" + txtItemname.Text + "'", GetConnection());
cmde.Parameters.AddWithValue("@QUANTITY", txtItemquantity.Value); //numericupdown control
cmde.Parameters.AddWithValue("@PRICE", txtItemprice.Text); //textbox control
cmde.ExecuteNonQuery();
}
data on database BEFORE update:
ID | ITEM | QUANTITY | PRICE
1 | ITEM1 | 1 | 400
数据库数据更新后:
ID | ITEM | QUANTITY | PRICE
1 | ITEM1 | 11 | 400400
数据库的数据,我希望它是更新后:
ID | ITEM | QUANTITY | PRICE
1 | ITEM1 | 2 | 800
我相信我的命令是正确的,如果不是我的错。在我的按钮点击事件中只有这段代码。什么好主意吗? 首先,您应该确保数据库字段Quantity和Price为数字类型。如果它们是Text,则查询将作为参数传递的字符串值与数据库列中存在的字符串连接起来。
第二,当您使用AddWithValue传递参数时,框架会根据所传递值的数据类型为您推断数据类型。在您的示例中,您传递一个字符串和,数据库引擎将看到一个将连接到现有值的字符串。您需要在传递给适当的数据类型
之前进行转换。最后,对传递给数据库引擎的所有内容使用always参数化查询,特别是当传递的值来自输入文本框时。
OleDbCommand cmd = new OleDbCommand("SELECT * FROM ItemTemp WHERE ITEM=@item", GetConnection());
cmd.Parameters.AddWithValue("@item", txtItemName.Text);
OleDbDataReader reader = cmd.ExecuteReader();
//check if this item exist on the table ItemTemp
if (reader.HasRows == true)
{
OleDbCommand cmde = new OleDbCommand("UPDATE ItemTemp SET QUANTITY=QUANTITY + @QUANTITY," +
"PRICE=PRICE + @PRICE WHERE ITEM=@item, GetConnection());
cmde.Parameters.AddWithValue("@QUANTITY", Convert.ToInt32(txtItemquantity.Value));
cmde.Parameters.AddWithValue("@PRICE", Convert.ToDecimal(txtItemprice.Text));
cmde.Parameters.AddWithValue("@item", txtItemName.Text);
cmde.ExecuteNonQuery();
}
好了,现在好像搞定了。我只需要改变
cmde.Parameters.AddWithValue("@QUANTITY", txtItemquantity.Value); //numericupdown control
cmde.Parameters.AddWithValue("@PRICE", txtItemprice.Text); //textbox control
cmde.Parameters.AddWithValue("@QUANTITY", Convert.ToInt32(txtItemquantity.Value));
cmde.Parameters.AddWithValue("@PRICE", Convert.ToInt32(txtItemprice.Text));