【问题标题】:Opening SqlConnection inside TransactionScope error在 TransactionScope 错误中打开 SqlConnection
【发布时间】:2023-04-04 21:19:02
【问题描述】:

我们一直在尝试在TransactionScope 中使用SqlConnection。当我们构建站点并尝试这个数据库调用时,我们遇到了一个错误:

从服务器接收结果时发生传输级错误。 (提供者:TCP Provider,错误:0 - 现有连接被远程主机强行关闭。)

所涉及的错误发生在cnn.Open()这一行。

using (var scope = new TransactionScope())
using (var cnn = new SqlConnection(connectionString))
{
    cnn.Open();
    int result = cnn.QuerySingle<int>("SELECT 1");
    Console.WriteLine(result);
}

我们创建了一个控制台应用程序来找出问题所在,并发现通过将连接字符串关键字“Pooling”从“false”更改为“true”,它可以在控制台应用程序中运行并成功返回我们的结果。

我们对站点连接字符串进行了相同的更改,返回的错误与之前相同。

这段代码不工作有什么原因吗?

【问题讨论】:

  • 首先,为什么要关闭池?其次,这听起来像是池化导致相同的物理连接被重用于多个逻辑连接。这是不确定的,可以随时中断。发布更完整的代码。可能有多个查询或多个 Open。​​
  • Azure 门户提供给我们的连接字符串中的池已关闭。我们尝试打开它,它在我的本地机器上工作,但在部署到我们的网络应用程序时却不行。当有一个或多个查询或连接时没有区别,它在第一次打开时失败

标签: azure ado.net transactionscope sqlconnection


【解决方案1】:

我假设 web.config 是合法的,因为通过 Kudu 服务查看文件显示了我预期的连接字符串,但显然在 Azure 中并非如此。

我发现 Azure Publish Profile 正在覆盖我们的 web.config 连接字符串,这个覆盖仍然包含“Pooling=false”。

现在删除它可以让我们的代码按预期运行。

This blog post 解释更多:

“当此代码在开发人员的本地计算机上运行时,返回的值将是 web.config 文件中的值。但是,当此代码在 Windows Azure 网站中运行时,返回的值将被输入的值覆盖在门户中”

【讨论】:

    猜你喜欢
    • 2018-11-21
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2010-10-10
    • 1970-01-01
    相关资源
    最近更新 更多