AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 249097
Accepted
Leojet
Leojet
Asked: 2019-09-19 12:04:51 +0800 CST2019-09-19 12:04:51 +0800 CST 2019-09-19 12:04:51 +0800 CST

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

  • 772

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

我在一台笔记本电脑上试过,它以前有一些 SQL Server Express 和我都卸载的东西。并且还在新的 Win10 虚拟机上。

两者总是有相同的错误:

Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:命名管道提供程序:无法打开与 SQL Server 2的连接。.

Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:登录超时已过期。

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

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

我尝试与实例的所有者联系,但不能。还尝试使用具有系统管理员权限的 SQL 登录,但不能。

我只能连接管道名称。

我还尝试了以下所有方法:

  • 为什么我无法连接到 SQL Server 2012 LocalDB 共享实例?在堆栈溢出
  • SQL 2016 sp1 SQLLocalDB 版本错误,“Windows API 调用“RegGetValueW”返回错误代码:0。” 在 MSDN 论坛上

为什么我无法连接?

connectivity sql-server-localdb
  • 3 3 个回答
  • 2640 Views

3 个回答

  • Voted
  1. Paul White
    2021-06-29T03:48:09+08:002021-06-29T03:48:09+08:00

    此问题通过以下方式解决:

    KB5003342-修复:SQL Server Express LocalDB 无法启动或连接到 SQL Server Express LocalDB 2019 或 2017 的共享实例

    假设您在 Microsoft SQL Server 2019 或 2017 中使用 SqlLocalDB 功能。在这种情况下,您无法正确启动或连接到 SqlLocalDB 的共享实例。

    此问题已在 SQL Server 的以下累积更新中得到修复:

    • SQL Server 2019 的累积更新 11

    • SQL Server 2017 的累积更新 24


    演示:

    截屏

    • 4
  2. Best Answer
    Aurora
    2020-02-27T05:03:31+08:002020-02-27T05:03:31+08:00

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

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

    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}。

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

    • 2
  3. Suciu Eus
    2021-06-29T01:03:34+08:002021-06-29T01:03:34+08:00

    正如 Aurora 所建议的那样,这是 LocalDB >= 2017 中的一个错误,微软似乎并不关心它。原因可能是因为 LocalDb 不应该在生产环境中使用。建议的解决方法很好,但需要手动完成。

    要在您的软件中解决此问题,您可以实施以下解决方法:

    1. 创建一个每 30 秒左右运行一次的辅助进程/后台任务。
    2. 检查实例是否已启动(使用 SqlLocalDbApi 类或sqllocaldb i {your_shared_instance_name}在单独的进程中运行并获取结果)。此外,此时记录命名管道(格式:np:\\.\pipe\LOCALDB#AC471EDC\tsql\query- 提取管道 id 值使用此正则表达式:#(.*?)\\-> 如果匹配使用match.Groups[1].Value)
    3. 通过检查以下注册表来验证实例管道名称:SOFTWARE\Microsoft\Microsoft SQL Server Local DB\Shared Instances\\{your_shared_instance_name}
    4. 如果第 2 点记录的管道名称与注册表值不同,请更新注册表项InstanceName

    (C# 示例)

    获取密钥:

    using var myKey = Registry.LocalMachine.OpenSubKey($"SOFTWARE\Microsoft\Microsoft SQL Server Local DB\Shared Instances\\{instanceName}", true);

    如果它与管道 ID 不同:

    myKey.SetValue("InstanceName", $"LOCALDB#{pipeId}", RegistryValueKind.String);

    结论

    现在一切都应该工作了。每 30 秒左右检查一次,以确保在数据库进程失败/系统重新启动/等情况下恢复正常。抱歉,但这似乎是 2017 年升级后保持 LocalDb 存活的唯一解决方案。另一种解决方案是迁移到 SQL Express 服务器。

    这只是代码的一个示例,但希望您能理解。如果没有,请发表评论,我会尽力帮助您。我为此挣扎了一会儿,但它最终以 LocalDb 2014/2016 的形式运行,没有任何问题。

    • 1

相关问题

  • 使用多个端口改进与 MySQL 数据库的连接

  • 在哪里可以找到 DB2 数据库的连接字符串?

  • 无法连接到我的本地实例

  • 无法通过实例名称连接到 SQL Server 2008 R2?

  • 从 LocalDB 解决方案到企业实例的迁移/部署路径是什么?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve