[英]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.