C#MySQL事务提交

时间:2015-06-08 14:39:37

标签: 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());
        }
    }

如果我打印查询字符串并在SQL-Bash上运行它,它可以正常工作。

2 个答案:

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

你应该清除每个循环的参数。