尝试在 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/