Phi*_*795 5 c# mysql transactions
我想更新 ~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());
}
}
Run Code Online (Sandbox Code Playgroud)
如果我打印查询字符串并在 SQL-Bash 上运行它,它就可以正常工作。
您不应在参数中使用单引号。使用单引号,您的查询将它们视为字符串文字,而不是参数。
cmd.CommandText = "UPDATE products SET title=@title, quantity=@quantity WHERE itemId LIKE @itemId";
Run Code Online (Sandbox Code Playgroud)
此外,由于您尝试参数化LIKE部分,因此您需要%..%在参数部分中使用部分或类似 '%' + @itemId + '%'。
prd顺便说一句,如果您的 中有多个参数prdList,则需要在循环顶部清除所有参数foreach。
foreach (product prd in prdList)
{
cmd.Parameters.Clear();
...
...
}
Run Code Online (Sandbox Code Playgroud)
最后一点,不要AddWithValue再使用了。有时可能会产生意想不到的结果。使用.Add()方法重载来指定参数类型及其大小。并且不要忘记使用using语句来自动处理您的连接和命令。