C#SQL分布式事务已完成。在新事务或NULL事务中登记此会话

时间:2009-10-05 05:25:22

标签: c# sql transactions

我在尝试从SQL Server 2005数据库上的C#运行存储过程时收到此错误(分布式事务已完成。请在新事务或NULL事务中登记此会话。)我没有主动/有目的地使用交易或任何东西,这使得这个错误很奇怪。我可以从管理工作室运行存储过程,它工作正常。其他存储过程也可以在C#中运行,它似乎就是这个问题。错误立即返回,因此它不能是超时问题。代码如下:

  SqlCommand cmd = null;
  try
  {
      // Make sure we are connected to the database
      if (_DBManager.CheckConnection())
      {
        cmd = new SqlCommand();

        lock (_DBManager.SqlConnection)
        {
          cmd.CommandText = "storedproc";
          cmd.CommandType = System.Data.CommandType.StoredProcedure;
          cmd.Connection = _DBManager.SqlConnection;

          cmd.Parameters.AddWithValue("@param", value);

          int affRows = cmd.ExecuteNonQuery();

          ...
        }
      }
      else
      {
        ...
      }
  }
  catch (Exception ex)
  {
    ...
  }

真让我难过。谢谢你的帮助

2 个答案:

答案 0 :(得分:4)

听起来有一个TransactionScope某处不愉快。 _DBManager.CheckConnection_DBManager.SqlConnection听起来像是在保持SqlConnection,我希望这会对此产生影响。

老实说,在大多数常见情况下,您最好只使用内置连接池,并在本地using建立连接 - 即

using(var conn = new SqlConnection(...)) { // or a factory method
    // use it here only
}

在这里你得到一个干净的SqlConnection,它将通过池映射到一个非托管连接,即它不会每次都创建一个实际的连接(但是会做一个逻辑重置以清理它。)

这也允许从多个线程更灵活地使用。例如,在Web应用程序中使用static连接对于阻止是非常可怕的。

答案 1 :(得分:0)

从代码中可以看出,您正在使用已经打开的连接。可能是先前在同一连接上有待处理的交易。