2016-09-23 70 views
1

SQLConnection使用随机命名管道(445)而不是tcp(1433)。 namedpipes端口被我们的防火墙阻止,但不是tcp。这只发生在试图连接到我们的一台sql服务器时。大多数情况下应用程序使用tcp,但随机尝试使用namedpipes端口。我们的sql连接非常简单,我们不会对它做任何事情。SQLConnection使用随机命名管道而不是tcp

我们不想硬编码连接字符串上的tcp端口。我们已经尝试解决这个问题。该问题仅在上周出现,而我们的Web应用程序尝试连接时会有一段时间。

为什么sql连接有时试图连接445而不是1433?它是由.net最新更新引入的错误还是服务器可以规定下一个要使用的端口?

UPDATE 2016年9月23日11:00

下面的代码的示例中,我们使用连接

string connectionString = "Data Source=SERVERNAME;Initial Catalog=DATABASE;uid=username;pwd=mypass;MultipleActiveResultSets=True"; 
using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    try { 
     connection.Open(); 
… 
+0

您可以发布您的连接字符串代码 – Ashu

+0

如果这个连接是从最终用户的个人电脑,网络服务器,其他数据库服务器等制成,你从来不提然而,无论是命名管道使用TCP或者是在本地连接设置启动连接的PC。有关更多详细信息,请参阅https://msdn.microsoft.com/en-us/library/ms181035.aspx。 – Igor

+0

无论是Web服务器还是客户端到sql服务器的PC连接。 – sebascomeau

回答

2

我们不想硬编码的TCP端口我们的连接字符串

您不必在连接字符串中输入IP地址/端口号。

但是,你可以强制连接字符串中的网络协议

Network Library=DBMSSOCN; 

​​

但是,当我有随机命名管道的问题是缓慢的表现,我做连接字符串为“特定”成为可能。这是...指定网络库和IP地址以及端口号。

顺便说一下,我真的很希望你实际上没有在编译代码中编写你的连接字符串,下面的代码并不是你的实际代码。

string connectionString = "Data Source=SERVERNAME;Initial Catalog=DATABASE;uid=username;pwd=mypass;MultipleActiveResultSets=True"; 

附加:

你可以在 “鱼” 周围的问题此机注册表的设置。

HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的MSSQLServer \客户端\ ConnectTo \

如果DSQUERY设置或不设置我特别期待。

https://support.microsoft.com/en-us/kb/328306

检查在下面的注册表子项中指定的协议: HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的MSSQLServer \客户端\ ConnectTo \ DSQUERY该值通常反映了CNU中的设置,但有时 它不是。

如果该值为DBNETLIB,则使用其中一个协议 启用CNU的协议列表。如果列出了特定的协议 ,则使用该协议。

如果是这样的问题......... 最终,任何其他程序可以改变这个值。所以你没有完全控制。同样,更好的解决方案是将网络库放在连接字符串中,所以“外部力量”不能在游戏中期改变游戏。我知道这个的原因是因为我在客户端烧毁了......其他一些程序改变了DSQUERY的值,并且使用我们的应用程序的1/3的客户端机器进入爬行状态。因此,我没有与之对抗,而是将网络库放入连接字符串中,以便永久解决问题。

+0

我们知道,我们不想指定使用的协议,因为一切正常,因为Web应用程序是活的(2年前)。为什么突然之间sql连接有这种奇怪的行为来使用445. – sebascomeau

+0

这只是测试代码,我们没有编译我们的连接字符串btw。 – sebascomeau

+0

我附加了我的答案和一个新建议。 – granadaCoder

1

您从不提及此连接是否由最终用户PC,Web服务器,其他数据库服务器等构成。但是,是使用命名管道还是TCP作为主协议是创建连接的PC上的设置。这可以使用SQL Server Native Client Configuration配置,也可以在连接字符串中重写。

要更改默认协议或协议顺序为客户端计算机

  1. 在SQL Server配置管理器,展开SQL Server Native Client配置,右键单击客户端协议,然后单击属性。
  2. 在启用的协议框中,单击上移或下移,尝试连接到SQL Server时更改尝试协议的顺序。启用协议框中的顶层协议是默认协议。

将客户端配置为使用TCP/IP

  1. 在SQL Server配置管理器,展开SQL Server Native Client配置,右键单击客户端协议,然后单击属性。
  2. 在“已启用协议”框中,单击向上和向下箭头可尝试连接到SQL Server时更改尝试协议的顺序。启用协议框中的顶层协议是默认协议。

Configure Client Protocols

+0

我们验证了订单,并且一切都很顺利 – sebascomeau

+0

@sebascomeau - 问题是持续的还是不错的,如该问题是否解决? – Igor

+0

对不起,这个问题依然存在。这是好的秩序。(我的坏) – sebascomeau

0

怎么样的服务器端?

什么,我会在服务器上翻一番SQL Server实例配置检查:

  • 该协议上的服务器表现为有望启用
  • 该协议是真实显示出意想不到的服务器上启用行为

我的猜测是,'破'的服务器已命名管道启用,而其他服务器不这样做时,.NET客户端正在选择连接原型科尔有时会做出错误的选择。

这是一个疯狂的猜测,因为我不知道.NET如何选择连接协议...

+0

我们检查了SQL服务器配置和一切都是正确的顺序。我们的应用程序和Web服务器采用tcp协议一段时间,并突然取出命名管道,并收到错误消息。在我们再次尝试之后,它需要tcp。 – sebascomeau

+0

这并不包括我的建议。配置与“正常工作”的服务器相同吗? – Paolo

+0

如何禁用服务器上存在问题的命名管道? – Paolo