我想更新~50行。所以我在foreach中做到这一点 代码运行时没有任何错误,但数据库中没有任何更改。
public void updateItems(List<product> prdList)
{
MySqlTransaction tr = null;
try
{
tr = this.con.BeginTransaction();
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = con;
cmd.Transaction = tr;
foreach (product prd in prdList)
{
cmd.CommandText = "UPDATE products SET title='@title', quantity='@quantity' WHERE itemId LIKE '@itemId'";
cmd.Parameters.AddWithValue("@title", prd.title);
cmd.Parameters.AddWithValue("@quantity", prd.quantity);
cmd.Parameters.AddWithValue("@itemId", prd.itemId);
cmd.ExecuteNonQuery();
}
tr.Commit();
}
catch (MySqlException ex)
{
try
{
tr.Rollback();
}
catch (MySqlException ex1)
{
MessageBox.Show(ex1.ToString());
}
MessageBox.Show(ex.ToString());
}
}
如果我打印查询字符串并在SQL-Bash上运行它,它可以正常工作。
答案 0 :(得分:2)
您不应该在参数中使用单引号。使用单引号,您的查询会将其视为string literal,而不是参数。
cmd.CommandText = "UPDATE products SET title=@title, quantity=@quantity WHERE itemId LIKE @itemId";
此外,由于您尝试参数化LIKE
部分,因此您需要使用%..%
part in your parameter part or like '%' + @itemId + '%'。
顺便说一下,如果prd
中有多个prdList
,则需要清除foreach
循环顶部的所有参数。
foreach (product prd in prdList)
{
cmd.Parameters.Clear();
...
...
}
最后一点,不要再使用AddWithValue
了。 It may generate unexpected results sometimes。使用.Add()
方法重载来指定参数类型及其大小。并且不要忘记使用using
statement自动处理您的连接和命令。
答案 1 :(得分:0)
像这样更改命令语句
这
"UPDATE products SET title='@title', quantity='@quantity' WHERE itemId LIKE '@itemId'";
到
"UPDATE products SET title=@title, quantity=@quantity WHERE itemId LIKE @itemId";
并且不要忘记添加
cmd.Parameters.Clear();
你应该清除每个循环的参数。