有时连接到SQL Server Works

时间:2013-03-18 23:34:30

标签: sql-server ado.net

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

  

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

返回的错误是:

  

连接超时已过期。尝试使用登录前握手确认时超时时间已过   这可能是因为登录前握手失败或服务器无法及时响应   尝试连接到此服务器所花费的时间是 - [Pre-Login] initialization = 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的相同凭据会成功?

24 个答案:

答案 0 :(得分:86)

事实证明,对{IPv4}地址启用了TCP / IP,而不是THESERVER的IPv6地址。

显然有些连接尝试最终使用IPv4而其他人使用IPv6。

为两个IP版本启用TCP / IP解决了这个问题。

SSMS工作的事实证明是巧合(前几次尝试可能使用IPv4)。稍后某些通过SSMS连接的尝试导致了相同的错误消息。

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

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

答案 1 :(得分:25)

我刚刚遇到了同样的错误,它与最新一轮的微软更新(09/02/2016)产生了可疑的结果。我发现SSMS连接没有问题,而我的ASP.NET应用程序返回“尝试使用登录前握手确认时出现超时时间”错误

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

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

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

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

答案 2 :(得分:16)

我解决了像埃里克这样的问题,但还有其他一些变化:

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

AND

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

答案 3 :(得分:6)

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

答案 4 :(得分:5)

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

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

enter image description here

答案 5 :(得分:3)

使用.NET Framework 3.5构建的可执行文件在最近安装了一些Windows更新(2017年8月7日这周)之后,大约有一半时间内开始报告这些连接问题。

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

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

显然,.Net Framework 4.6.1发生了重大变化 - TransparentNetworkIPResolution 根据文章更新连接字符串也解决了问题,而无需回滚框架版本。

答案 6 :(得分:2)

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

答案 7 :(得分:1)

这是解决 OP 中错误的另一种解决方案...有很多解决方案,因为有很多原因。

我已经安装了 MSSql 2019 的开发者版。 默认情况下,它的安装是锁定的……如果它在您的开发机器上运行,它将正常运行。如果您将它安装在除开发箱之外的机器上,您将需要更新防火墙规则。

<块引用>

默认情况下...“MS SQL Server”的防火墙配置文件是私有的

您可能需要启用公共和/或域配置文件。仅当您在域上进行身份验证时才使用域。
Windows FireWall Profiles
Firewall profiles

此外...要启用所有 IP 地址(如已接受的答案),您需要做的就是

<块引用>

在 TCP/IP 属性上将“全部侦听”设置为“是”

TCP/IP Properties Options
TCP/IP Properties Options

答案 8 :(得分:1)

在我的案例中,所有选项都已存在。

通过增加连接超时= 30来解决它。SQL Server management Studio

答案 9 :(得分:1)

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

答案 10 :(得分:1)

我遇到了同样的问题,设法通过打开/启用 SQL Server配置管理器中的端口1433和tcp / ip然后重新启动服务器来解决它

enter image description here

答案 11 :(得分:0)

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

有关MSDN的更多详细信息

答案 12 :(得分:0)

在 C# 中,这让我发疯,它在我的部分代码中工作,但在使用相同单例的特定区域失败。事实证明,我正在使用模拟来读取文件,并且我正在使用使用提升权限的“可信连接”调用 SQL 连接。该提升权限的用户无权访问 SQL 数据库,因此它仅在该方法上失败。我将呼叫转移到模拟之外,之后效果很好。

答案 13 :(得分:0)

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

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

答案 14 :(得分:0)

我遇到了确切的问题,尝试了几次灵魂修复都不起作用,最后重新启动了系统,一切正常。

答案 15 :(得分:0)

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

答案 16 :(得分:0)

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

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

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

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

答案 17 :(得分:0)

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

答案 18 :(得分:0)

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

答案 19 :(得分:0)

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

答案 20 :(得分:0)

通过阻止/黑名单试图暴力破解用户帐户的IP地址解决了这个问题。检查SQL访问日志以查找大量失败的登录尝试(通常用于&#39; sa&#39;帐户)。

答案 21 :(得分:0)

&#34;连接超时已过期&#34;错误通常发生在以下情况

  • SQL Server数据库引擎的一个实例未运行。
  • SQL Server Browser服务未运行。
  • 禁用TCP / IP。
  • 服务器名称输入错误。
  • 存在网络问题。
  • 数据库引擎实例的TCP / IP端口被防火墙阻止。
  • 客户端和服务器未配置为使用相同的网络协议。

要根据上述原因检查如何跟踪此错误,请检查Connection Timeout Expired. The timeout period elapsed while attempting to consume the pre-login handshake acknowledgment

答案 22 :(得分:0)

我遇到了同样的问题,但是我使用静态IP地址连接到远程数据库。所以上述解决方案都没有解决我的问题。

我无法为我正在使用的安全登录添加正确的用户映射,因此我的解决方案只是确保将用户映射设置设置为访问我的数据库。

答案 23 :(得分:0)

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

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