C# MySQL 事务提交

13 浏览
0 Comments

C# MySQL 事务提交

我想更新约50行数据,所以我使用foreach循环来实现。

代码运行没有任何错误,但数据库中没有任何更改。

public void updateItems(List 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
0 Comments

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事务提交时的问题,我们需要改变命令语句,使用参数化查询,确保参数被正确设置,并在每次循环中清除参数。通过这些步骤,我们可以成功解决这个问题。

0
0 Comments

C# MySQL事务提交问题的原因是使用了单引号,使得查询将参数视为字符串字面量而不是参数。解决方法是不使用单引号,并在参数部分使用%..%或者'%' + 参数 + '%'来参数化LIKE部分。

此外,如果在prdList中有多个prd,需要在foreach循环的顶部清除所有参数。

最后,不再使用AddWithValue方法,因为它可能会产生意外结果。可以使用.Add()方法重载来指定参数类型和大小,并且不要忘记使用using语句来自动释放连接和命令。

示例中的数据库包含两个itemID:0001和00001。如果搜索%itemId,会返回2个结果。

如果使用Parameters.Add()而不是display.....Add(),那么display.....Add()是过时的,请使用AddWithValue()。

0