C# MySQL 事务提交

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 上运行它,它就可以正常工作。

Son*_*nül 4

您不应在参数中使用单引号。使用单引号,您的查询将它们视为字符串文字,而不是参数。

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语句来自动处理您的连接和命令。