我在尝试从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)
{
...
}
真让我难过。谢谢你的帮助
答案 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)
从代码中可以看出,您正在使用已经打开的连接。可能是先前在同一连接上有待处理的交易。