无法连接到 SQL Server 2017 本地数据库共享实例

Leo*_*jet 7 connectivity sql-server-localdb

我无法连接到 SQL Server 2017 (14.0.1000.169)本地数据库共享实例。

我在一台以前安装了一些 SQL Server Express 和我都已经卸载的东西的笔记本电脑上试过。并且还在新的 Win10 VM 上。

两者总是有相同的错误:

Sqlcmd:错误:用于 SQL Server 的 Microsoft ODBC 驱动程序 17:命名管道提供程序:无法打开到 SQL Server 2的连接。.

Sqlcmd:错误:用于 SQL Server 的 Microsoft ODBC 驱动程序 17:登录超时已过期。

Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。检查实例名称是否正确以及 SQL Server 是否配置为允许远程连接。有关详细信息,请参阅 SQL Server 联机丛书。

此错误来自SQLCMD但我也尝试过使用 SSMS 和 Visual Studio 连接字符串。

我尝试与实例的所有者连接,但无法连接。还尝试使用具有sysadmin权限的 SQL 登录,但不能。

我只能用管道名称连接。

我还尝试了以下所有内容:

为什么我无法连接?

小智 2

似乎是 LocalDb v2017 及更高版本中的一个错误。我测试了从 v2012 SP4 开始的所有可用版本。自 v2016 SP2 起(包括 v2016 SP2),"(localdb)\.\SHAREDNAME"连接请求中接受友好共享名称。使用 v2017 或更高版本时,请求始终会导致“找不到实例”错误。

我还观察到,查询所有已安装的 LocalDb 版本会导致sqllocaldb.exe vv2016 及更高版本出现错误消息:

Windows API 调用“RegGetValueW”返回错误代码:0。

不确定此行为是否与原始问题有关。


应用问题中链接的注册表修复可以解决版本查询。

经过进一步挖掘,我想我可能已经找到了连接失败的原因。当本地计算机上安装了v2016 版本的SQLLocalDb 时,共享功能的工作原理如下:

在注册表中,将创建一个新密钥Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server Local DB\Shared Instances\{SharedName}。该键包含一个字符串 value InstanceName,它存储管道名称,如以下屏幕截图所示:

在此输入图像描述

当相应的实例启动时,它总是选择这个管道名称。该名称保持持久性,即当实例重新启动时,管道名称将被重用。

当安装LocalDb v2017或更高版本时,这个逻辑就被破坏了:当启动具有共享名称的实例时,注册表中的管道名称将被忽略。相反,通过 查询实例时会出现完全不同的管道名称sqllocaldb i {instance}

这可能也是无法建立连接的原因,因为管道名称不匹配。编辑注册表值以匹配实际的管道名称可以解决该问题,但仅限于实例重新启动之前。