【问题标题】:.NET not detecting any SQL Server instances.NET 未检测到任何 SQL Server 实例
【发布时间】:2015-08-13 18:42:12
【问题描述】:

一段时间以来,我一直在使用 .NET 4.5.1 和 SQL Server 2012 Express 在 Windows 8.1 设备上开发 C#/SQL Server 应用程序。这一切都完美无缺。最近,Visual Studio 2015 已经发布,我决定升级。我还决定升级我的 SQL Server 2012,所以我备份了所有内容,将其卸载并安装了 SQL Server 2014 Express。配置完所有内容并恢复数据库备份后,所有内容仍然在本地工作,因为数据库连接数据仍然存在于存储的应用程序设置中。

当我在另一台设备上测试该应用程序时,我发现它无法再连接到 SQL Server 实例,也无法检测到它使用

System.Data.DataTable instances = SqlDataSourceEnumerator.Instance.GetDataSources();

应用程序也无法在我的开发机器上检测到 SQL Server 实例,我认为这很奇怪,因为它正在运行 本地。但是,其他几个设备可以检测到 SQL Server,所以我认为它不是与防火墙相关的程序。 SQL 引擎服务和浏览器服务都处于活动状态。

我决定升级到 Windows 10,重置它(全新安装,未安装任何 SQL Server 程序)并再次运行我的应用程序,因为我的网络中还有其他计算机运行 SQL Server,希望它能检测到这些。它没有。 GetDataSources() 方法在瞬间返回一个空的DataTable,而其他设备需要几秒钟来检测实例并返回正确的列表。

更愚蠢的是,ODBC 数据源管理器确实检测到这些网络实例,让我认为它是一个与 .NET 相关的程序。

总结:两台设备没有检测到任何个SQL Server实例(甚至是本地的),而网络中的其他设备可以。

【问题讨论】:

  • 为什么不在配置文件connectionstrings.com中使用常规连接字符串@
  • 您在这里要解决的问题是什么?我的意思是高级问题,例如“在安装时连接到实例而不是低级”“我如何检测本地、LocalDB 等的 SQL Server 版本”。我不想回答“你如何解决这个问题我已经在尝试解决它”。
  • 我正在使用SqlConnectionStringBuilder 创建连接字符串,但应用程序需要是用户可配置的,因此能够首先检测 SQL 实例(然后连接到它们)。
  • 我正在尝试解决它无法以任何方式连接到 SQL Server 实例或检测到它的问题。
  • 如果您的用户直接选择 SQL 实例名称,那么我认为他们的技术水平比较低,在这种情况下,他们为什么不能像我在 SSMS 中那样只输入实例名称如果没有检测到?

标签: c# .net sql-server


【解决方案1】:

我决定使用this ODBC implementation,因为它工作正常,并且可以实现异步/等待更新,因此不会阻塞 UI。

在选择这个实现之前,我还研究了另一个使用 SqlDataSourceEnumerator 类的项目,它运行良好。其目标框架属性设置为 .NET Framework 2.0。我发现当 .NET 目标版本为 3.5 或更低版本时,SqlDataSourceEnumerator 给出了预期的结果(在我的机器上)。 .NET 实现中的某些内容可能随着时间的推移而发生变化,导致它在某些特定条件下停止工作。

编辑: 在我的机器上我再次安装了 SQL Server 2012,一切(检测除外,将使用 ODBC)再次正常工作。我要感谢大家的意见。

【讨论】:

  • 感谢您发布详细的答案,包括将其隔离为 .NET 版本 - 您今天让互联网变得更加智能。
  • 当 .NET 目标版本为 3.5 或更低版本时,我发现 SqlDataSourceEnumerator 给出了预期的结果(在我的机器上)。 我发现了同样的结果。 Windows10/VS2015/.NET 3.5 Target 适用于我,但 .NET 4、4.5.1、4.5.2 或 4.6 不适用。此外,我发现有趣的另一件事是,当使用“连接到数据库...”向导时,Visual Studio 2015 本身无法检测到我机器上的任何实例。我也安装了VS2008,没问题。
【解决方案2】:

除此之外,我们在安装 VS2015/.Net 4.6 后遇到了类似的问题。我们的开发人员使用 SQL Express 2012 x64(大多数情况下是默认实例或命名实例,但 Express 的默认值是名为 SQLEXPRESS 的命名实例)和一个别名来从连接字符串中删除任何机器名称变化(生产使用 DNS 条目) .别名设置为使用 TCP/IP,服务器名称为 localhost\instance。

但是 4.6 削弱了别名的使用,实体框架在使用别名时无法连接,SSMS 也无法连接。如果我删除了 4.6 并修复了 4.5.2,它似乎被 4.6 安装损坏了,那么我们可以在 SSMS 和我们的应用程序中使用别名,前提是我们使用 VS2013,因为 2015 年需要 4.6。这反而否定了尝试升级的意义。

我不知道究竟是什么导致了问题,但我知道在别名中使用您正在使用的计算机的 FQDN 是可行的。获取实例的端口号并在别名中显式设置它也可以解决问题,但是如果您使用动态端口分配(并且默认情况下这样做),那么这将很快中断。或者,如果您有一个完整版本的 SQL Server 的默认安装,它似乎可以继续使用刚刚设置为 localhost(local). 的别名。

我最好的猜测是 .Net 4.6 中的一些变化会以某种方式影响 SQL Browser 服务,因为如果它们使用动态端口,这应该负责将请求路由到正确的实例。当然,可以说您应该始终明确地设置静态端口号,但谁会理所当然地这样做呢?我曾尝试在 Connect 上提出它以防万一这是某种错误,但我不确定。

编辑

提出了 Connect 问题,因为我认为它确实会影响 SQL Browser。

https://connect.microsoft.com/VisualStudio/feedback/details/1719418

【讨论】:

  • 好吧,我的问题也是在 4.6 之后开始的,但我没有意识到这一点,因为我在 .NET 4.6 安装后继续开发我的 SQL Server 应用程序一段时间。也许 4.6 破坏了在 4.0 及更高版本中工作的东西(请参阅我自己的答案)。如果你创建了一个 Connect 问题,我也会支持它。
  • 是的,我们以前使用 4.5 没有问题。我想我会提出一个 Connect 并将其链接回此处。
  • 请注意,此错误还会中断使用 TCP 连接到命名实例。感谢您提及连接问题!
猜你喜欢
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多