从listview转移到列表框并更新SQL Server数据库

时间:2017-09-03 05:00:33

标签: c# sql-server winforms listview listbox

我有一个表单,可以使用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();

提前谢谢你。任何类型的回应都表示赞赏。

1 个答案:

答案 0 :(得分:1)

我认为这是查询中的间距,特别是WHERE子句。

enter image description here

所以这样做:

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