SqlConnection 卡在命名管道上

Posted

技术标签:

【中文标题】SqlConnection 卡在命名管道上【英文标题】:SqlConnection stuck on Named Pipes 【发布时间】:2013-07-11 22:01:13 【问题描述】:

尝试从我的 C# 应用程序中打开数据库连接时,我看到以下错误。我意识到这个错误之前可能已经出现在 100 个问题上。但是,在这种情况下,错误只会出现在 我的特定台式电脑上运行的 C# 应用程序上。我已经通过谷歌和这个网站搜索了互联网,但我找不到解决方案。

错误:

“在建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。找不到或无法访问服务器。请验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)"

为什么这个场景是独一无二的:

我能够从 SQL Server Management Studio (SSMS) 连接到 SQL Server。此应用程序在另一台计算机上运行,并且能够从那里建立到 SQL 服务器的连接。所以这个错误场景是特定于在我的特定桌面 PC 上运行的 C# 应用程序。其他应用程序工作(SSMS)。其他 PC 的工作。

当我使用 WireShark “嗅探电线”时,跟踪显示我的应用程序正在尝试通过 NamedPipes(即 \Server\IPC$)进行连接。我似乎无法强制它使用 TCP/IP。

我尝试过的事情:

重新安装.NET Framework 重新安装 Visual Studio(C# - Express 版本 2010) 在 cliconfg.exe 中创建了别名。

我错过了什么吗?

这是我尝试过的连接字符串...

Data Source=<servername>;Initial Catalog=HIE;Integrated Security=true
Server=tcp:10.240.11.81;Integrated Security=SSPI; database=HIE
Data Source=10.240.11.81,1433;Network Library=DBMSSOCN;Initial Catalog=HIE;User ID=<SqlUserIdThatISetUpAsSysAdmin>;Password=<password>

这里是sn-p的代码:

_conn = new SqlConnection();    // _conn declared globally
_conn.ConnectionString = <the connection string above>;
_conn.Open();

【问题讨论】:

tcp: 也放入Data Source。将连接字符串硬编码到 C# 源代码中。您的wireshark调试非常好,因为它表明它没有使用tcp。 感谢@usr 的快速回复。伙计..你们太快了!我尝试了“Data Source=TCP:;Initial Catalog=HIE;Integrated Security=True”和“Data Source=TCP:10.240.11.81;Initial Catalog=HIE;Integrated Security=True”并得到了新消息:(provider :TCP Provider,错误:0 - 在数据库查找期间发生不可恢复的错误。)和(提供者:TCP Provider,错误:0 - 提供了无效的参数。)谷歌在这些错误消息中没有给我任何信息。服务器上确实存在“HIE”数据库。 这太疯狂了。根据谷歌的说法,该错误指向非常奇怪的情况。您可以使用该 IP 和端口 1433 远程登录 SQL Server 吗?应用程序是否以管理员身份运行?请关闭 UAC 或运行提升。请再次运行 Wireshark。结果如何? @usr - 我可以远程登录到该服务器上的端口 1433。 Wireshark 在网络上表现出一些奇怪的行为。当我尝试使用 TCP 提供程序 (Network Library=DBMSSOCN or Data Source=TCP:HHVSVTSQL01) 打开 SqlConnection 时,没有网络活动。可以肯定的是,我切换回原来的 ConnectionString 并且 WireShark 再次显示 NamedPipes 访问尝试(SMB 协议)。这太疯狂了。 .NET 甚至没有尝试使用 TCP 提供程序进行连接。我将运行 .NET Framework 更新 (Windows Update) 只是为了排除 .NET Framework 问题。如果有任何其他想法,我将不胜感激。 @JayLee:我强烈建议您在您的机器上运行 cliconfg 以确保启用 tcp/ip 库。您还应该中断代码中连接字符串的分配,以便 100% 确定连接字符串不会被其他代码覆盖。要知道的另一件重要事情是正在运行什么类型的应用程序。如果它是桌面应用程序,那么它应该没问题;如果是 IIS,那么集成安全性可能是个问题。 【参考方案1】:

最可能的情况是 Windows 防火墙阻止了 SQL Server 通信。来自 MSDN(一篇关于命名管道的文章,但仍然相关):

Microsoft Windows XP Service Pack 2 启用了 Windows 防火墙,它 默认关闭 445 端口。因为 Microsoft SQL Server 通信 通过端口 445,如果 SQL Server 配置为 使用命名管道侦听传入的客户端连接。为了 有关配置防火墙的信息,请参阅“如何:配置 SQL Server 访问防火墙”在 SQL Server 联机丛书中或查看 您的防火墙文档。

另一种情况是本地机器上的客户端配置没有正确配置。在运行提示符下,您可以执行cliconfg(SQL Server 客户端配置实用程序)来查看启用的协议和用于协议的别名。

【讨论】:

是的。被445端口关闭了几次,每次似乎都需要顿悟才能意识到防火墙需要更新。 这并不能解释第一个错误(甚至没有尝试 TCP 连接)。其次,我认为与 OP 收到的新错误消息没有任何关系。它不像“连接被拒绝”或类似的东西。 我已经解决了防火墙和 cliconfg 问题。这不是防火墙问题 - 因为我机器上的 SSMS(我的程序无法连接)能够连接到 SQL 服务器(它是远程的,而不是在我的机器上)。 ADO.NET 似乎没有使用 cliconfg 设置。为了让 ADO.NET 使用它,我必须明确命名 TCP 提供程序(网络库=DBMSSOCN 或数据源=TCP:HHVSVTSQL01)。但我开始收到一条不同的错误消息,但线路上没有显示流量。 有错误消息:(提供者:TCP 提供者,错误:0 - 在数据库查找期间发生不可恢复的错误。)和(提供者:TCP 提供者,错误:0 - 无效参数已提供。)【参考方案2】:

要么按照 usr 的评论重新定义您的数据源,要么将您的 SQL Server 配置为允许 TCP 连接(为什么您仍然不允许 TCP 连接?)。

这是在您的 SQL Server 上启用 TCP 的链接(接受的答案是您要查看的位置):

Enable remote connections for SQL Server Express 2012

【讨论】:

根据 Wireshark,客户端库甚至没有使用 TCP。服务器的 TCP 端点不可能是问题。 @usr 很奇怪。我之前遇到过这个错误,我总是通过正确配置 SQL Server 来解决它。 @usr 请看一下链接。另一个用户遇到了完全相同的问题,显然通过正确配置 SQL Server 解决了这个问题。 他有同样的错误信息,但不是同样的问题。他需要重新配置服务器以允许 TCP 连接。 Wireshark 表明这不是这里的问题。 ADO.NET 甚至不尝试连接。 顺便说一句,错误消息还说正在使用命名管道。不是 TCP。【参考方案3】:

您是在本地磁盘还是网络驱动器上运行代码?我遇到了一个非常类似的问题,即我的网络驱动器在 .Net 中不受信任,这就是我的连接失败的原因。

【讨论】:

以上是关于SqlConnection 卡在命名管道上的主要内容,如果未能解决你的问题,请参考以下文章

在命名管道上选择

命名管道问题

Docker Windows 容器挂载命名管道

命名管道

网络上的命名管道

打开命名管道时,构造函数上的 FileInputStream 块