使用 SQLCMD 实用工具时发生间歇性连接错误

本文可帮助你解决使用 SQLCMD 命令行工具时出现的间歇性连接“OS 错误 10054”问题。

错误

你会收到以下警告和错误消息:

警告:proc_procname返回 HResult 0x2746,级别 16,状态 1

TCP 提供程序:远程主机强行关闭了现有连接。

SQLCMD.EXE:Sqlcmd:错误:Microsoft SQL Server Native Client 10.0:客户端无法建立连接

这些错误的一个可能原因是驱动程序不受支持。

要考虑的问题

查看以下方案以确定问题是否匹配:

  • 收集网络跟踪并了解 TLS 1.0 和 1.1 已禁用,TLS 1.2 已启用。 在运行 SQL Server 的服务器上,在应用程序服务器上启用 TLS 1.0、1.1 和 1.2。

    显示应用程序服务器上启用了 TLS 1.0、1.1 和 1.2 的屏幕截图。

  • 使用适用于 SQL Server 的 Microsoft OLE DB 提供程序和 SNAC 11 提供程序在应用程序服务器上运行 UDL 测试。 连接失败。 你还会收到一条消息,指出“Microsoft OLE DB Provider for SQL Server”驱动程序已弃用,不支持 TLS 1.2。

  • 应用程序服务器使用 SQL Server Native Client 11 成功测试 ODBC 数据源。 如果不支持 SQL Server Native Client 10.0,可能会收到以下错误消息:

    连接失败,SQL 状态为“08001”SQL Server错误:10054 [Microsoft][SQL Server Native Client 10.0]TCP 提供程序:远程主机强行关闭了现有连接。 [Microsoft][SQL Server Native Client 10.0] 客户端无法建立连接。

    显示此消息的原因可能是应用程序服务器使用较旧版本的 Diffie-Hellman 算法 (v1) ,并且SQL Server使用较新版本 (v2) 。 这种不匹配会导致间歇性 TLS 故障。

解决方案

要解决这些问题,请执行以下步骤:

  1. 在连接字符串中指定SQL Server Native Client 11。

    注意

    Microsoft 不再支持 SNAC 11。 如果在使用 SNAC 11 时遇到任何问题,必须先升级到受支持的 Microsoft 驱动程序版本,然后才能提供技术支持。

  2. 将应用程序驱动程序升级到受支持的驱动程序。

  3. 如果不对连接使用加密,请使用 MSOLEDBSQL v18 或 ODBC v17。 如果在应用程序服务器上对连接使用加密,请使用 MSOLEDBSQL v19 或 ODBC v18。 默认情况下,这些驱动程序与加密一起包含在一起。 有关详细信息,请参阅以下文章:

另请参阅

远程主机强行关闭了现有连接 (OS 错误 10054)