有时连接到 SQLServer

Net 应用程序有时只能连接到本地网络上的另一台服务器。给定的连接尝试是成功还是失败似乎是随机的。连接使用表单中的连接字符串:

数据库 = 数据库; 用户 Id = 用户; 密码 = 密码;

the error returned is:

连接超时过期。在尝试使用登录前的握手确认时超时时间已经过去。
这可能是因为登录前的握手失败或服务器无法及时响应。
尝试连接到此服务器所花费的时间为-[ Pre-Login ]初始化 = 42030; handshake = 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();
}

Table 很小,只有78行。

但是,在 同一台机器上。NET 应用程序收到这个错误,我能够连接到 THSERVER 使用 SSMS 和用户 ID/密码在连接字符串中命名。

为什么 ADO.Net 应用程序的连接会失败,而 SSMS 的连接却能成功?

229786 次浏览

结果发现,对于 THESERVER的 IPv4地址启用了 TCP/IP,但对于 IPv6地址没有启用。

显然,一些连接尝试最终使用了 IPv4,而另一些尝试使用了 IPv6。

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

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

启用 TCP/IP 以获得其他 IP 地址:

  • Start Sql Server Configuration Manager
  • 打开节点 SQLServer 网络配置
  • 左键单击 MYSQLINSTANCE 协议
  • 在右侧窗格中,右键单击 TCP/IP
  • 单击属性
  • 选择 IP 地址选项卡
  • 对于每个列出的 IP 地址,确保 Active 和 Enable 都是 Yes。

我在连接到托管服务器时也有同样的握手问题。

I opened my Network and sharing center and enabled IPv6 on my wireless network connection.

enter image description here

通过启用 IPv6和解除入站端口1433的阻塞,我在 WindowsServer2012和 SQLServer2012上修复了这个错误。

我像埃里克一样解决了这个问题,但做了一些其他的改变:

  • 启动 Sql 服务器配置管理器
  • 打开节点 SQLServer 网络配置
  • 左键单击 MYSQLINSTANCE 协议
  • 在右侧窗格中,右键单击 TCP/IP
  • 单击属性
  • 选择 IP 地址选项卡
  • 对于每个列出的 IP 地址,确保 Active 和 Enable 都是 Yes。

AND

  • 对于列出的每个 IP 地址,确保 TCP Dynamic Ports 为空,并且 TCP Port = 1433(或其他端口)
  • Open windows firewall and check that the port is Opened in Incoming connections

我遇到了同样的问题,在设置实体数据模型时,试图从 Visual Studio 连接到本地网络中的服务器(通过 VPN)。
只能通过在连接字符串中设置 TransparentNetworkIPResolution=false来解决。 In VS Add Connection Wizard, you can find it in the Advanced tab.

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

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

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

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

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

我有同样的问题,设法解决它的 开放/启用端口1433和 tcp/ip 在 SQL 服务器配置管理器,然后 重启服务器

enter image description here

我在进行 SharePoint2010到2013年的迁移时遇到了这个问题。我怀疑是因为数据库服务器位于防火墙的另一端,防火墙没有路由 IP6,所以它当时正在尝试使用 IP6,但连接到数据库时失败了。

I think the issue is now solved. The errors seem to have stopped. What I did was I simply disabled IP6 (by unchecking it) for the network adapter on the SharePoint Servers.

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

我没有为我正在使用的安全登录名添加适当的 User Mapping,所以我的解决方案只是确保 User Mapping 设置被设置为访问我的数据库。

To trace the "Connection Timeout expired" error, Please, make sure that:

  • SQLServer 数据库引擎实例已启动并正在运行。
  • SQLServer 浏览器服务正在运行。
  • 启用了 TCP/IP。
  • 服务器名称键入正确。
  • 没有在 如何检查从应用服务器到数据库服务器的 SQLServer 实例连接中提到的网络问题
  • 数据库引擎实例的 TCP/IP 端口未被防火墙阻塞。
  • 客户端和服务器被配置为使用相同的网络协议。

For more details, Please check 连接超时过期了。当试图使用登录前的握手确认时超时时间过去了

In my case above all options were already there.

通过增加连接超时 = 30解决了这个问题。SQL Server management Studio

解决了这个问题,阻止/黑名单的 IP 地址,试图蛮力用户帐户。检查 SQL 访问日志,看是否有大量失败的登录尝试(通常是针对“ sa”帐户)。

构建的可执行文件。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-< a href = “ https://blogs.msdn.microsoft.com/dataaccesstechnoology/2016/05/07/connect-timeout-problem-with-Net-Framework-4.6-1-Transparentnetworkipresoltion/”rel = “ nofollow noReferrer”> TransparentNetworkIPResoltion4.6-1 - 根据每篇文章更新连接字符串也解决了这个问题,无需回滚框架版本。

对我来说,Windows 服务器中的防火墙阻塞了默认的 sql 服务器端口1433。因此,添加一个入站规则来接受这些连接对我来说很有用。

在你浪费更多的时间解决问题之前,像我一样,试试 重新启动你的窗口机器。在应用了所有其他的解决方案之后,我觉得还不错。

在我们的示例中,问题是由于可用性集群配置造成的。为了解决这个问题,我们必须在连接字符串中将 MultiSubnetFailover设置为 True。

更多有关 MSDN的资料

在我的例子中,连接字符串中带有用户和密码的参数 Persist Security Info=true导致了问题。 移除参数或设置为 false可以解决问题。

尝试一个简单的 SQL 服务器重新启动之前,做任何激烈的事情。可能会修复它。它为我做

Unfortunately, I had problem with Local SQL Server installed within Visual Studio and here many solutions didn't work out for me. All I have to do is to reset my Visual Studio, by going to:

控制面板 > 程序及特点 > VisualStudio 设定启动程式

点击 更多按钮,选择 修理

之后,我能够访问本地 SQLServer 并使用本地 SQL 数据库。

I had the exact issue, tried several soultion didnt work , lastly restarted the system , it worked fine.

Adding a response here, despite previously accepted answer. 由于我的场景被确认为 DNS。更具体地说,在登录前握手期间的 DNS 超时。 通过将 DNS 名称更改为 IP 地址(或使用主机文件条目) ,可以绕过这个问题。尽管代价是失去自动 IP 解析。

For example, even with a Connection String's timeout value set to 60 for a full minute, it still would happen within a couple seconds of the attempt. Which leads one to question why would it timeout before the specified timeout period? DNS.

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

我已经安装了 MSSql 2019的开发者版。 By default, its installation is locked down...it will run fine if its just on your development machine. If you install it on a machine other then your dev box, you will need to update the fire wall rule.

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

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

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

在 TCP/IP 属性上将“ ListAll”设置为 yes

TCP/IP 属性选项
TCP/IP Properties Options

在 C # 中,这简直要把我逼疯了,它在我的部分代码中工作,并且在使用相同的单例模式的某个特定区域中失败了。结果是,我使用模拟来读取文件,并使用“可信连接”调用 SQL 连接,该连接使用提升的权限。那个提高了权限的用户没有访问 SQLDB 的权限,所以它只是在那个方法上失败了。我把电话移出了模仿秀之后效果很好。

I had the same issue, 这些行:

sqlConnectionStringBuilder.MultiSubnetFailover = true;
sqlConnectionStringBuilder.TrustServerCertificate = true;

解决了。

Edit:

This was the fix for me as well when the SQL Servers are setup in a cluster across multiple Subnets. This is an easy option to test rather than convincing your DBA to open up the Server 因为您可以简单地更改连接字符串:

Perst Security Info = True; User ID = TheUser; Password = thePassword; InitialCatalog = DBName; Data Source = ServerName,1433; TrustServerSecurities = True; MultiSubnetfalover = True <- this last arg fixed it!