C# 使用SqlTransaction时出错

C# 使用SqlTransaction时出错,c#,asp.net,sql,.net,transactions,C#,Asp.net,Sql,.net,Transactions,我在ASP.NET中使用事务时遇到问题 每次我使用下面的代码时,都会出现异常: 此事务已完成;它不再可用 我到处寻找,包括堆栈溢出如何解决这个问题,但任何东西都可以 我正在使用SQL Server尝试将记录插入数据库。请参见下面的代码: Database db = new Database(); db.Connect(); SqlCommand command = new SqlCommand(SQL_UPDATE_ADRESA, db.Connection); command.Paramete

我在ASP.NET中使用事务时遇到问题

每次我使用下面的代码时,都会出现异常:

此事务已完成;它不再可用

我到处寻找,包括堆栈溢出如何解决这个问题,但任何东西都可以

我正在使用SQL Server尝试将记录插入数据库。请参见下面的代码:

Database db = new Database();
db.Connect();
SqlCommand command = new SqlCommand(SQL_UPDATE_ADRESA, db.Connection);
command.Parameters.Add(new SqlParameter("@pPersonID", SqlDbType.Int)).Value = personID;
command.Parameters.Add(new SqlParameter("@pStreet", SqlDbType.VarChar, 30)).Value = street;
command.Parameters.Add(new SqlParameter("@pCity", SqlDbType.VarChar, 30)).Value = city;

db.BeginTransaction();
command.Transaction = db.SqlTransaction;

int rows = 0;

try
{
    rows = db.ExecuteNonQuery(command);
    db.EndTransaction();
}
catch 
{
    rows = -1;
    db.Rollback();
}

db.Close();

return rows;
在类数据库中调用的方法和属性有:

财产:

private SqlTransaction mSqlTransaction = null;

public SqlTransaction SqlTransaction
{
    get { return mSqlTransaction; }
}
方法:

public void BeginTransaction()
{
    mSqlTransaction = mConnection.BeginTransaction(IsolationLevel.Serializable);
}

public void EndTransaction()
{
    mSqlTransaction.Commit();
    Close();
}

public void Rollback()
{
    mSqlTransaction.Rollback();
}
我尝试在SQL Server上设置隐式_事务, 重新编写代码,不要使用数据库方法和其他东西,但我看不出哪里有问题

每次尝试使用该命令时都会引发此异常

编辑:

变量行在执行后等于1,所以记录被正确插入,但就在它之后,程序在提交时抛出异常,所以它将捕获语句,在这里它在调用回滚方法时再次抛出异常。在此崩溃之后,数据库被回滚,并且没有任何更改

编辑2:

它能和命令有关吗?就像只有一个更新,所以它是自动提交的,或者类似的东西

public void EndTransaction()
    {
        mSqlTransaction.Commit();
        Close();
    }

为什么要用封闭的方法呢。可能是obj.close;是它们的。

它调用内部方法:public void Close{mConnection.Close;}mConnection只是SqlConnection属性您正在使用该catch抑制所有错误,因此您永远不会发现是否有错误。我在没有try/catch的情况下尝试了它,它将引发相同的异常,但是,在提交部分的回滚部分,代码看起来还可以。这意味着明显存在的错误存在于未发布在此处的部分代码中。要么张贴所有相关作品,要么制作一个小型、独立的复制品。通过执行后者,您可能会自己发现错误。你能在10行中重现这个错误吗?我打赌你不能。我发现了问题。。。在Database.ExecuteOnQuery的最后一部分有一个Close方法,它会自动将该事务转换为null,所以稍后当我尝试使用它时,会引发异常…是的,我认为这可能是一个像这样的小错误。将程序减少到10行总是会发现这些问题,因为没有隐藏的空间。