5

我在互联网上阅读了很多类似主题的文章和答案,但没有找到问题的原因。

我有一个 .NET 4 Windows 服务连接到同一台机器上的 SQL Server Express。只有一次在生产中碰巧看到以下错误:

“与服务器成功建立连接,但在登录过程中发生错误。(提供者:命名管道提供者,错误:0 - 管道的另一端没有进程。)”。

如果我们使用命名管道协议,则出现此错误的原因很明显,因为我们尚未在服务器上启用它们。但是我的问题是为什么可以在这里使用命名管道协议?在连接字符串中,我们使用了“ Data Source=.\SQLEXPRESS ”。考虑到 msdn 和互联网上的信息,我的理解是当“。” 始终使用“共享内存协议”。那么必须发生什么才能让 ADO.NET SqlClient 决定使用命名管道协议呢?

大多数时候一切都很好,但我需要知道这个过程,以便我们可以在需要时防止这种类型的任何进一步错误。

在此先感谢,托多

4

1 回答 1

4

您应该查看您的服务器sys.dm_exec_connections并查看您的客户实际使用的网络传输。

通常客户端在本地服务器上尝试 SM,然后尝试 NP,然后尝试 TCP。尝试连接以遵循相同的规则,如果不这样做,则如果服务器不侦听SM 协议(local),则工具和应用程序将无法连接到本地服务器!您看到指示客户端尝试 NP 的错误的事实表明 SM 尝试失败的情况,这可能是由于服务器繁忙,或者服务器正在重新启动或类似情况而发生的。发生此问题时,系统事件日志和 ERRORLOG 可能包含更多信息。

您可以通过修改连接字符串来强制客户端使用特定协议,根据如何在连接字符串中使用服务器名称参数来指定客户端网络库servername=lpc:.\SQLEXPRESS仅用于强制共享内存。

于 2011-04-15T17:29:15.300 回答