有时可以连接到SQL Server


100

ADO.Net应用程序有时只能连接到本地网络上的另一台服务器。给定的连接尝试成功或失败似乎是随机的。该连接使用以下形式的连接字符串:

Server = THESERVER \ TheInstance; Database = TheDatabase; User Id = TheUser; 密码=密码

返回的错误是:

连接超时已过期。尝试使用登录前握手确认时,超时时间已过。
这可能是因为登录前的握手失败或服务器无法及时回复。
尝试连接到该服务器所花费的时间为-[登录前]初始化= 42030;握手= 0;

.NET应用程序是一个小型测试应用程序,它执行以下代码:

using (SqlConnection conn = new SqlConnection(cs))
using (SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM TheTable", conn))
{
    conn.Open();
    int rowCount = (int)cmd.ExecuteScalar();
}

TheTable很小,只有78行。

但是,在.NET应用程序收到此错误的同一台计算机上,我能够使用SSMS和连接字符串中指定的用户ID /密码连接到THESERVER。

为什么连接可能会因ADO.Net应用程序而失败,但是使用来自SSMS的相同凭据成功完成?


Answers:


92

原来,已为的IPv4地址(但未为IPv6地址)启用TCP / IP THESERVER

显然,某些连接尝试最终使用IPv4结束,而其他尝试使用IPv6。

为两个IP版本都启用TCP / IP可以解决此问题。

SSMS工作的事实恰巧是偶然的(最初的几次尝试大概使用了IPv4)。稍后通过SSMS进行连接的尝试导致了相同的错误消息。

要为其他IP地址启用TCP / IP:

  • 启动Sql Server配置管理器
  • 打开节点“ SQL Server网络配置”
  • MYSQLINSTANCE的左击协议
  • 在右侧窗格中,右键单击“ TCP / IP”
  • 单击属性
  • 选择IP地址选项卡
  • 对于列出的每个IP地址,确保“活动”和“启用”均为“是”。

谢谢,这为我解决了错误。有趣的是,所有IP地址都设置为禁用(以前不是)。最好知道是什么原因导致这些功能被禁用,因为我认为在我的情况下不会手动更改配置...
Matt

我也从未手动禁用我的IPv6地址。我也想知道他们如何最终成为残疾人。
Eric J.

由于某种原因,我无法启用IPv6。它说需要重新启动服务才能使更改生效,但是它永远不会将其保留为“是”。关于如何跳下去的任何线索
Salman

5
我不确定被禁用的单个条目是否存在问题,因为“协议”选项卡具有覆盖项“全部监听”,该替代项告诉SQL侦听所有IP。请参阅以下链接以获取文档。msdn.microsoft.com/en-us/library/dd981060.aspx
ShaneH 2015年

2
我想在Azure中看到这种情况
tofutim

31

Ive出现了相同的错误,可疑地与最新一轮的Microsoft更新(09/02/2016)保持一致。我发现SSMS连接没有问题,而我的ASP.NET应用程序返回“尝试使用登录前握手确认时超时时间已过”错误

我的解决方案是在连接字符串中添加30秒的连接超时,例如:

ConnectionString="Data Source=xyz;Initial Catalog=xyz;Integrated Security=True;Connection Timeout=30;"

在我的情况下,唯一受影响的连接是使用集成安全性的连接,我在连接之前模拟了一个用户,使用SQL身份验证到同一服务器的其他连接工作正常!

2个测试系统(单独的客户端和Sql服务器)同时受到影响,导致我怀疑是Microsoft更新!


我也遇到了同样的问题,感谢您的解决方案。我通过VPN使用集成安全性进行连接,并将默认连接超时从默认的15s增加到30s,为我解决了这个问题。
Mark G

1
在setup.exe安装新应用程序并且启动过程尝试创建新数据库之后,SQL 2014 LocalDB出现了此问题。此修复程序使我免于吐出假人-谢谢Shaun!
斯科特

1
这也为我解决了这个问题。就我而言,我是通过VPN连接并在hosts文件中添加一个条目。仅在SSMS和.NET应用程序中使用主机名时,才会出现此问题。使用IP地址时,不会发生此问题。

谢谢您的回答!
康拉德

17

我解决了类似Eric的问题,但做了一些其他更改:

  • 启动Sql Server配置管理器
  • 打开节点“ SQL Server网络配置”
  • MYSQLINSTANCE的左击协议
  • 在右侧窗格中,右键单击“ TCP / IP”
  • 单击属性
  • 选择IP地址选项卡
  • 对于列出的每个IP地址,确保“活动”和“启用”均为“是”。

  • 对于列出的每个IP地址,请确保“ TCP动态端口”为空,并且“ TCP端口” = 1433(或某个其他端口)
  • 打开Windows防火墙,并检查端口是否在“传入连接”中打开

该解决方案不适用于我。我有一个包含网站和数据库的服务器,但从未发生此问题,但是当Web服务器与数据库服务器分离时,我发现了此问题
Ibrahim Amer

11

我遇到了同样的问题,尝试在设置实体数据模型时从Visual Studio连接到本地网络中的服务器(通过VPN)。
只能通过TransparentNetworkIPResolution=false在连接字符串中进行设置来解决。在“ VS添加连接向导”中,可以在“高级”选项卡中找到它。


3
设置为TransparentNetworkIPResolution = False。这是.NET 4.6.1中的一项新功能,默认情况下处于启用状态。将此设置为false将删除此功能创建的500ms超时。欲了解更多信息:blogs.msdn.microsoft.com/dataaccesstechnologies/2016/05/07/...
Jorriss

谢谢。数小时的研究此问题。我需要收藏此回复。@Jorriss的评论非常有助于理解原因。您可能会更新答案以使用正确的关键字。乔里斯有正确的参考。
TravisWhidden

5

连接到托管服务器时,我遇到了相同的握手问题。

我打开了网络和共享中心,并在无线网络连接上启用了IPv6。

在此处输入图片说明


3

我使用.NET Framework 3.5生成的可执行文件在最近安装了某些Windows Update之后(2017年8月7日那一周),大约一半时间就开始报告这些连接问题。

连接失败是由安装在目标计算机上的.NET Framework 4.7引起的(Windows Updates自动安装已启用)-https://support.microsoft.com/?kbid=3186539

卸载.NET Framework 4.7解决了连接问题。

显然,有在.Net框架4.6.1重大更改- TransparentNetworkIPResolution 更新连接字符串作为每篇文章也解决了问题,而不需要回滚框架版本。


2

我通过启用IPv6并取消阻止入站端口1433,在Windows Server 2012和SQL Server 2012上修复了此错误。


1
我认为这不是正确的答案,因为问题包含“仅在某些时候”。阻塞的端口将无法解决与此有关的问题。
Magier '16

2

在我们的情况下,由于可用性群集配置而出现问题。要解决此问题,我们必须MultiSubnetFailover在连接字符串中将其设置为True。

有关MSDN的更多详细信息


1

我有同样的问题,可以通过在SQL Server配置管理器中打开/启用端口1433和tcp / ip 来解决此问题,然后重新启动服务器

在此处输入图片说明


1

就我而言,以上所有选项都已经存在。

通过增加连接超时= 30解决。SQL Server管理Studio


1

在像我一样浪费更多时间解决问题之前,请尝试仅重新启动Windows机器。应用所有其他解决方案后为我工作。


0

从SharePoint 2010迁移到2013时遇到了这个问题。我怀疑这是因为数据库服务器位于防火墙的另一侧,该防火墙没有路由IP6,因此它尝试使用IP6并在连接数据库时失败。

我认为问题已经解决。错误似乎已经停止。我所做的是,我只是在SharePoint Server上为网络适配器禁用了IP6(通过取消选中它)。


0

我遇到了同样的问题,但是我正在使用静态IP地址连接到远程数据库。因此上述解决方案都无法解决我的问题。

我没有为使用的安全登录名添加正确的用户映射,所以对我来说,解决方案只是确保将“用户映射”设置设置为访问我的数据库。


0

通过阻止/将试图强行使用用户帐户的IP地址列入黑名单来解决此问题。检查您的SQL访问日志中是否有大量失败的登录尝试(通常用于“ sa”帐户)。


0

对我来说,事实证明Windows服务器中的防火墙阻止了端口1433,这是默认的sql服务器端口。因此,添加入站规则以接受这些连接对我来说是个诀窍。


0

就我而言,Persist Security Info=true连接字符串中包含用户名和密码的参数导致了问题。删除参数或设置即可false解决问题。


0

请先尝试简单的SQL Server重新启动,然后再执行任何大动作。可能会修复它。它对我有用


0

不幸的是,我在Visual Studio中安装了本地SQL Server时遇到了问题,在这里许多解决方案对我来说都不可行。我要做的就是通过以下步骤重置Visual Studio:

控制面板>程序和功能> Visual Studio安装启动器

然后单击更多按钮,然后选择修复

之后,我可以访问我的本地SQL Server并使用本地SQL数据库。


0

上次Microsoft Windows更新后,我遇到了可以自动解决的相同问题,有人遇到过同样的问题吗?


0

我遇到了确切的问题,尝试了几次失败后,最后重新启动了系统,它工作正常。


0

要跟踪“连接超时已过期”错误,请确保:

有关更多详细信息,请检查连接超时已过期。尝试使用登录前握手确认时超时时间已过


以下哪种情况与间歇性错误有关?
罗恩·约翰(RonJohn)

请编辑以披露从属关系,这是必需的。谢谢。
马克西米利安·劳梅斯特(Maximilian Laumeister)

0

尽管先前已接受答案,但仍在此处添加答复。由于我的情况被确认为DNS。更具体地说,登录前握手期间的dns超时。通过从DNS名称更改为IP地址(或使用“主机”文件条目),可以避免此问题。尽管以失去自动IP解析为代价。

例如,即使将连接字符串的超时值设置为一整分钟的60,它仍然会在尝试的几秒钟内发生。哪个使人质疑为什么它会在指定的超时期限之前超时?DNS。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.