Sql事务c#-在运行ExecuteOnQuery()时退出并重试

Sql事务c#-在运行ExecuteOnQuery()时退出并重试,c#,sql,C#,Sql,我正在尝试实现一个sql事务,但是,我遇到了一些麻烦。我有一个简单的数据库,它有三个表。用户、帖子和评论。我希望实现一个delete按钮,它将从Users表中删除一个用户。我遇到的最初问题是,我需要从post和comment表中删除users FK,然后从user表中删除user。我在网上查了一下,有人建议使用transaction进行多个服务器调用。这是我的密码: public void DeleteUser(int UserId) { using (SqlConnec

我正在尝试实现一个sql事务,但是,我遇到了一些麻烦。我有一个简单的数据库,它有三个表。用户、帖子和评论。我希望实现一个delete按钮,它将从Users表中删除一个用户。我遇到的最初问题是,我需要从post和comment表中删除users FK,然后从user表中删除user。我在网上查了一下,有人建议使用transaction进行多个服务器调用。这是我的密码:

public void DeleteUser(int UserId)
    {
        using (SqlConnection con = new SqlConnection(connectionString))
        {
            con.Open();

            SqlTransaction sqlTran = con.BeginTransaction();

            try
            {
                using (SqlCommand command = new SqlCommand("DELETE FROM Comment WHERE UserId = " + @UserId, con))
                {
                    SqlParameter userid = new SqlParameter("@UserId", SqlDbType.Int);
                    userid.Value = UserId;
                    command.ExecuteNonQuery();
                }

                using (SqlCommand command = new SqlCommand("DELETE FROM Post WHERE UserId = " + @UserId, con))
                {
                    SqlParameter userid = new SqlParameter("@UserId", SqlDbType.Int);
                    userid.Value = UserId;
                    command.ExecuteNonQuery();
                }

                using (SqlCommand command = new SqlCommand("DELETE FROM Users WHERE UserId = " + @UserId, con))
                {
                    SqlParameter userid = new SqlParameter("@UserId", SqlDbType.Int);
                    userid.Value = UserId;
                    command.ExecuteNonQuery();
                }

                sqlTran.Commit();
            }
            catch
            {
                sqlTran.Rollback();
            }
        }
    }
我遇到的问题是,当DeleteUser方法运行时,程序在第一个using块中到达command.ExecutyNonQuery,然后跳转到catch。从而使变化倒退。没有显示任何错误代码,因此我不确定出了什么问题


在此问题上的任何帮助都将不胜感激。

您缺少
command.Transaction=sqlTran


不要使用
尝试{}catch{}
。至少使用
try{}catch(Exception ex){}
->这将为您提供足够的信息,以便您自己解决问题。

您缺少
command.Transaction=sqlTran


不要使用
尝试{}catch{}
。至少使用
try{}catch(Exception ex){}
->这将为您自己解决问题提供足够的信息。

如果退出
try
,您是否中断了
catch
?将您的代码更改为
catch(Exception ex)
,并调试您的代码。如果您使用
catch(Exception ex ex)
然后您就可以告诉我们
例如ToString()的内容了。
。不要接受例外情况:(在捕获的末尾插入一个
throw;
,以确保异常被传播。但是,也许更好,尽管它有一些怪癖,但可以使用自动处理回滚。@user2246674,我建议避免TransactionScope,除非真的需要。当与类混合时,它可能会产生难以调试的问题。@user2246674ic事务,您需要在所有计算机(服务器+客户端)上运行DTC,有时它不工作。如果它退出
try
,您是否中断了
catch
?将代码更改为
catch(Exception ex)
并调试代码。如果您使用
catch(Exception ex)
然后您就可以告诉我们
例如ToString()的内容了。
。不要接受例外情况:(在捕获的末尾插入一个
throw;
,以确保异常被传播。但是,也许更好,尽管它有一些怪癖,但可以使用自动处理回滚。@user2246674,我建议避免TransactionScope,除非真的需要。当与类混合时,它可能会产生难以调试的问题。@user2246674ic事务,您需要在所有计算机上运行DTC(服务器+客户端),它有时不起作用。此外,
sqlConnection.CreateCommand
将自动与事务关联。感谢@Yossarian,我做了建议的更改,它起了作用。此外,
sqlConnection.CreateCommand
将自动与事务关联。感谢@Yossarian,我做了建议的更改它成功了。