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:最可能的情况是 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 卡在命名管道上的主要内容,如果未能解决你的问题,请参考以下文章