Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么赢了';我的事务不能对数据库进行更改吗?_C#_Mysql_Transactions - Fatal编程技术网

C# 为什么赢了';我的事务不能对数据库进行更改吗?

C# 为什么赢了';我的事务不能对数据库进行更改吗?,c#,mysql,transactions,C#,Mysql,Transactions,我正在编写一个需要更新MySQL数据库的应用程序。我现在正在做的是从表中删除行,然后插入新数据,因此我使用事务来确保我得到所有更改或没有更改。然而,没有任何改变,我也不明白为什么,因为没有抛出异常 以下是事务的代码片段: using(var conn = new MySqlConnection(connectionString)) { conn.Open(); // Use transaction to get all or nothing using(var trans

我正在编写一个需要更新MySQL数据库的应用程序。我现在正在做的是从表中删除行,然后插入新数据,因此我使用事务来确保我得到所有更改或没有更改。然而,没有任何改变,我也不明白为什么,因为没有抛出异常

以下是事务的代码片段:

using(var conn = new MySqlConnection(connectionString))
{
    conn.Open();
    // Use transaction to get all or nothing
    using(var trans = conn.BeginTransaction())
    {
        try
        {
            using(MySqlCommand cmd = new MySqlCommand())
            {
                // Clear the current summary entries
                cmd.Connection = conn;
                cmd.CommandText = "DELETE FROM summaryTable WHERE projectID = @Id";
                cmd.Parameters.AddWithValue("@Id", id);
                cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
            }

            // Write new entries
            foreach(SummaryObject record in summaryList)
            {
                using(MySqlCommand cmd = new MySqlCommand())
                {
                    cmd.Connection = conn;
                    cmd.CommandText = "INSERT INTO summaryTable VALUES(/*All values here*/)";
                    // Add With Value statements
                    cmd.ExecuteNonQuery();
                    cmd.Parameters.Clear();
                }
            }
        }
        catch(MySqlException e)
        {
            try
            {
                // try roll back
            }
            catch(MySqlException e1)
            {
                // Catch rollback fail
            }
        }
    }
    conn.Close();
}
我已经缩短了一些内容,但我知道SQL语句是有效的,因为我在将其更改为事务之前就对它们进行了测试

必须使用commit或Rollback方法显式提交或回滚事务

因此,提出

trans.Commit();
在try块的末尾

必须使用commit或Rollback方法显式提交或回滚事务

因此,提出

trans.Commit();

在try块的末尾。

您似乎没有提交事务

using(var conn = new MySqlConnection(connectionString))
{
    conn.Open();
    // Use transaction to get all or nothing
    using(var trans = conn.BeginTransaction())
    {
        try
        {
            ......
            trans.Commit();
        }
        catch(MySqlException e)
        {
            trans.Rollback();
        }
    }
    // conn.Close(); NOT NEEDED
}
请注意,在使用连接时使用try/catch需要在出现异常时显式回滚。如果您在连接的using块之外设置了try/catch,则可以避免回滚,因为在不提交的情况下关闭连接相当于自动回滚

MySqlTransaction trans;
try
{
    using(var conn = new MySqlConnection(connectionString))
    {
        conn.Open();
        using(trans = conn.BeginTransaction())
        {
            ......
            trans.Commit()
        }
    }
}
catch(MySqlException e)
{
    // NOT NEEDED => gives error 
    // trans.Rollback();
}

您似乎没有提交您的事务

using(var conn = new MySqlConnection(connectionString))
{
    conn.Open();
    // Use transaction to get all or nothing
    using(var trans = conn.BeginTransaction())
    {
        try
        {
            ......
            trans.Commit();
        }
        catch(MySqlException e)
        {
            trans.Rollback();
        }
    }
    // conn.Close(); NOT NEEDED
}
请注意,在使用连接时使用try/catch需要在出现异常时显式回滚。如果您在连接的using块之外设置了try/catch,则可以避免回滚,因为在不提交的情况下关闭连接相当于自动回滚

MySqlTransaction trans;
try
{
    using(var conn = new MySqlConnection(connectionString))
    {
        conn.Open();
        using(trans = conn.BeginTransaction())
        {
            ......
            trans.Commit()
        }
    }
}
catch(MySqlException e)
{
    // NOT NEEDED => gives error 
    // trans.Rollback();
}

您似乎错过了事务的提交。如果没有自动提交,数据库将执行回滚->不会更改任何数据。

您似乎错过了事务的提交。如果没有自动提交,数据库将执行回滚->不会更改任何数据。

是否有自动提交设置?或者您只是错过了事务结束时的提交?没有。我错过了承诺。现在可以了。(你应该回答而不是评论,@TheChaos)似乎你缺少
trans.Commit()在末尾。您正在创建事务,然后处理它。是否有自动提交设置?或者您只是错过了事务结束时的提交?没有。我错过了承诺。现在可以了。(你应该回答而不是评论,@TheChaos)似乎你缺少
trans.Commit()在末尾。您正在创建一个事务,然后处理它。谢谢。真是愚蠢的错误——这是我第一次写这样的文章,我一定是在我看的例子中忽略了这一点。谢谢。真是愚蠢的错误——这是我第一次写这些东西,我一定是在我看的例子中忽略了这一点。编辑得不错。我和你一样在连接内部有try/catch,如果连接失败,在所有连接之外也有try/catch。编辑得不错。我和您一样,在连接内部有try/catch,如果连接失败,在所有连接之外也有try/catch。