簡體   English   中英

C#SQL分布式事務已完成。 在新事務或NULL事務中登記此會話

[英]C# SQL Distributed transaction completed. Either enlist this session in a new transaction or the NULL transaction

當我嘗試在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)
  {
    ...
  }

真的讓我難過。 謝謝你的幫助

聽起來有一個不愉快的TransactionScope _DBManager.CheckConnection_DBManager.SqlConnection聽起來就像是在保持一個SqlConnection ,我希望這將有助於此。

說實話,在大多數情況下,您最好只使用內置連接池,並在本地using您的連接 - 即

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

在這里,您將獲得一個干凈的SqlConnection ,它將通過池映射到非托管連接,即它不會每次都創建一個實際連接(但會進行邏輯重置以清理它)。

這也允許從多個線程更靈活地使用。 例如,在Web應用程序中使用static連接對於阻止是非常可怕的。

從代碼中可以看出,您正在使用已經打開的連接。 可能是先前在同一連接上有待處理的事務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM