我正在使用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();
}
更新前数据库的数据:
ID | ITEM | QUANTITY | PRICE
1 | ITEM1 | 1 | 400
数据库更新后的数据:
ID | ITEM | QUANTITY | PRICE
1 | ITEM1 | 11 | 400400
我希望它在更新后的数据库数据:
ID | ITEM | QUANTITY | PRICE
1 | ITEM1 | 2 | 800
我相信我的命令是正确的,如果不是我的坏......除了我的按钮点击事件上的这个代码。任何想法?
答案 0 :(得分:1)
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));
答案 1 :(得分:1)
首先,您应该确保数据库字段数量和价格是数字类型。如果它们是Text,那么您的查询将作为参数传递的字符串值与数据库列中的字符串相连接。
其次,当您使用AddWithValue传递参数时,框架会为您查看传递值的数据类型的数据类型。在您的情况下,您传递一个字符串,并且数据库引擎会看到一个字符串,该字符串将连接到现有值。您需要在传递到适当的数据类型之前进行转换
最后,对传递给数据库引擎的每件事都使用依赖参数化查询,特别是如果传递的值来自输入文本框。
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();
}