尝试在 SQL Server 2005 数据库上从 C# 运行存储过程时,出现此错误(分布式事务已完成。在新事务或 NULL 事务中登记此 session 。)。我没有主动/有目的地使用交易或任何东西,这就是让这个错误变得奇怪的原因。我可以从管理工作室运行存储过程,它工作正常。其他存储过程也可以从 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)
  {
    ...
  }

这真的让我难住了。谢谢你的帮助

最佳答案

听起来好像某处有一个不愉快的 TransactionScope_DBManager.CheckConnection_DBManager.SqlConnection 听起来像是你在保留一个 SqlConnection,我希望这会对此有所贡献。

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

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

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

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

关于C# SQL 分布式事务完成。在新事务或 NULL 事务中登记此 session ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1518379/

10-16 14:52