C# MySQL 事务提交
C# MySQL 事务提交
我想更新约50行数据,所以我使用foreach循环来实现。
代码运行没有任何错误,但数据库中没有任何更改。
public void updateItems(ListprdList) { 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上运行它,它可以正常工作。
C#MySQL事务提交问题的原因和解决方法
在处理C#与MySQL数据库交互时,有时会遇到事务提交的问题。这篇文章将讨论这个问题的原因以及如何解决它。
问题的原因是在执行更新语句时,命令语句中的参数没有正确设置。在给定的示例中,更新语句是这样的:
"UPDATE products SET title='', quantity='' WHERE itemId LIKE ''";
这会导致错误,因为参数没有正确设置。为了解决这个问题,我们需要将命令语句更改为以下形式:
"UPDATE products SET title=@title, quantity=@quantity WHERE itemId LIKE @itemId";
在这个新的命令语句中,我们使用了参数化查询的方式,将参数用占位符(@)代替。这样可以确保参数被正确设置,并且可以避免潜在的安全问题。
此外,还需要在每个循环中清除参数。为了做到这一点,我们可以使用以下代码:
cmd.Parameters.Clear();
这样可以确保在每次循环中都清除参数,以便正确设置新的参数。
要解决C#MySQL事务提交时的问题,我们需要改变命令语句,使用参数化查询,确保参数被正确设置,并在每次循环中清除参数。通过这些步骤,我们可以成功解决这个问题。
C# MySQL事务提交问题的原因是使用了单引号,使得查询将参数视为字符串字面量而不是参数。解决方法是不使用单引号,并在参数部分使用%..%或者'%' + 参数 + '%'来参数化LIKE部分。
此外,如果在prdList中有多个prd,需要在foreach循环的顶部清除所有参数。
最后,不再使用AddWithValue方法,因为它可能会产生意外结果。可以使用.Add()方法重载来指定参数类型和大小,并且不要忘记使用using语句来自动释放连接和命令。
示例中的数据库包含两个itemID:0001和00001。如果搜索%itemId,会返回2个结果。
如果使用Parameters.Add()而不是display.....Add(),那么display.....Add()是过时的,请使用AddWithValue()。