【问题标题】:Error when using SqlTransaction使用 SqlTransaction 时出错
【发布时间】:2014-04-30 14:47:02
【问题描述】:

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

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

此 SqlTransaction 已完成;它不再可用。

我到处寻找(包括堆栈溢出)如何解决这个问题,但一切正常。

我正在尝试向 db 插入一条记录(我正在使用 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 上设置 IMPLICIT_TRANSACTIONS ON, 重写代码(使用,不使用数据库方法和其他东西,但我看不出哪里有问题)。

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

编辑:

变量“rows”在执行后等于1,所以记录被正确插入,但是在它之后,程序在“Commit”处抛出异常,所以它会catch语句,在这里它在调用a时再次抛出异常回滚方法。在这次崩溃之后,数据库被回滚并且没有任何改变。

EDIT2:

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

【问题讨论】:

  • 您正在使用该捕获抑制所有错误,因此您永远不会发现是否存在错误。
  • 我在没有 try/catch 的情况下尝试过,它会引发相同的异常,但是在提交部分的回滚部分
  • 代码看起来没问题。这意味着错误(显然存在)位于此处未发布的部分代码中。要么发布所有相关的部分,要么创建一个小型的、独立的复制品。通过执行后者,您可能会自己发现错误。你能在 10 行内重现这个错误吗?我打赌你不能。
  • 我发现了问题...Database.ExecuteNonQuery 的最后部分有 Close() 方法,它自动将此事务转换为 null,所以后来当我尝试使用它时引发异常...
  • 是的,我认为这将是一些微不足道的错误。将程序减少到 10 行总能发现这些问题,因为没有隐藏的余地。

标签: c# asp.net sql .net transactions


【解决方案1】:
public void EndTransaction()
    {
        mSqlTransaction.Commit();
        Close();
    }

为什么使用 Close() 他们是没有方法的。可能是 obj.close();是他们的。

【讨论】:

  • 它调用内部方法:public void Close() { mConnection.Close(); } mConnection 只是 SqlConnection 属性
猜你喜欢
  • 1970-01-01
  • 2013-10-17
  • 2013-10-17
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多