我有一个表单,可以使用SQL查询将数据从listview
传输到listbox
。我没有错误,SQL代码正在读取查询并将数据从listview
传输到listbox
正在运行,但似乎我的SqlCommand
未运行/更新我的datagridview
。我不知道这是否适合放置SqlCommand
- 请帮我解决这个问题。
for (int intCount = 0; intCount < listViewOrders.Items.Count; intCount++)
{
listBoxInvoice.Items.Add(listViewOrders.Items[intCount].Text);
listBoxInvoice.Items.Add(" x" + listViewOrders.Items[intCount].SubItems[2].Text +
" @ " + listViewOrders.Items[intCount].SubItems[1].Text);
connect.Open();
SqlCommand cmd = new SqlCommand("UPDATE tblProducts SET productQuantity = productQuantity - " +
listViewOrders.Items[intCount].SubItems[2].Text + "WHERE productName = '" + listViewOrders.Items[intCount].Text + "'", connect);
connect.Close();
}
dataGridProd.Update();
dataGridProd.Refresh();
提前谢谢你。任何类型的回应都表示赞赏。
答案 0 :(得分:1)
我认为这是查询中的间距,特别是WHERE
子句。
所以这样做:
SqlCommand cmd = new SqlCommand("UPDATE tblProducts SET productQuantity = productQuantity - " + listViewOrders.Items[intCount].SubItems[2].Text + " WHERE productName = '" + listViewOrders.Items[intCount].Text + "'", connect);
cmd.ExecuteNonQuery();
或者如果您使用C#6 +,则使用字符串插值。
var cmd = new SqlCommand($@"UPDATE tblProducts SET productQuantity = productQuantity - {listViewOrders.Items[intCount].SubItems[2].Text} WHERE productName = '{listViewOrders.Items[intCount].Text}'", connect);
cmd.ExecuteNonQuery();
不要忘记使用
ExecuteNonQuery
执行它,因为你是 更新数据。
确保listViewOrders.Items[intCount].Text
有值。您可以添加一个断点来检查它。
=============== UPDATE =====
如果使用SQL参数来避免SQL注入,那就好多了。
SqlCommand cmd = new SqlCommand("UPDATE tblProducts SET productQuantity = productQuantity - @quantity WHERE productName = @productName", connect);
cmd.Parameters.AddWithValue("@quantity", listViewOrders.Items[intCount].SubItems[2].Text);
cmd.Parameters.AddWithValue("@productName", listViewOrders.Items[intCount].Text);
cmd.ExecuteNonQuery();