【问题标题】:C# MySQL Transaction commitC# MySQL 事务提交
【发布时间】:2015-06-08 14:39:37
【问题描述】:

我想更新大约 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 上运行它,它工作正常。

【问题讨论】:

  • 你引用了你的参数。那是错的。参数进入“裸体”,从不引用。 set title=@title,不是set title='@title'
  • 不要使用AddWithValue,具体说明您要添加的类型。

标签: c# mysql transactions


【解决方案1】:

您不应在参数中使用单引号。使用单引号,您的查询会将它们视为string literal,而不是参数。

cmd.CommandText = "UPDATE products SET title=@title, quantity=@quantity WHERE itemId LIKE @itemId";

此外,由于您尝试参数化LIKE 部分,您需要使用%..% part in your parameter part or like '%' + @itemId + '%'

顺便说一句,如果您的prdList 中有多个prd,则需要清除foreach 循环顶部的所有参数。

foreach (product prd in prdList)
{
    cmd.Parameters.Clear();
    ...
    ...
}

最后一点,不要再使用AddWithValueIt may generate unexpected results sometimes。使用.Add() 方法重载来指定您的参数类型和它的大小。并且不要忘记使用using statement 来自动处理您的连接和命令。

【讨论】:

  • Example DB: itemID - 0001 itemID - 00001 现在如果我搜索 %itemId 我会得到 2 个结果?
  • *如果我使用Parameters.Add() VS display .....Add() is veraltet: Use AddWithValue()
【解决方案2】:

像这样改变你的命令语句

来自

"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();

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

【讨论】:

    猜你喜欢
    • 2012-05-22
    • 2014-07-19
    • 2023-03-27
    • 2012-12-24
    • 2013-11-22
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多