gpt4 book ai didi

C# SQL 分布式事务已完成。在新事务或 NULL 事务中登记此 session

转载 作者:太空狗 更新时间:2023-10-30 01:28:05 28 4
gpt4 key购买 nike

尝试从 C# 在 SQL Server 2005 数据库上运行存储过程时,出现此错误(分布式事务已完成。要么在新事务或 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(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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com