通过 SqlDataSourceEnumerator.Instance.GetDataSources() 完成枚举时,.NET 不显示实例或版本

.NET not showing instance or version when enumeration is done via SqlDataSourceEnumerator.Instance.GetDataSources()

我正在尝试使用 SQLDataSourceEnumerator.Instance.GetDataSources() 在本地或网络上枚举所有 SQL 实例。返回数据 table 但只有 ServerName 列有数据。 InstanceName、IsClustered 和 Version 列为空。

运行 同一网络中服务器上的相同代码显示所有记录的列的有效结果。

注意客户端系统安装了以下:

这是我已经尝试过并检查过的内容,我已经研究了几天,我已经用尽了我发现的所有内容...

  1. SQL SQL 服务器端的浏览器服务在所有实例上 运行ning。
  2. 服务器端和客户端的所有防火墙都关闭。
  3. SQL 个实例 运行 正在 Windows 10 Pro 版本 1803 (17134.885) 和 1903 (18362.239)
  4. SQL 所有实例的配置都已启用 TCP/IP。
  5. 由于防火墙关闭,UDP 端口 1434 未被阻止。
  6. 服务器在同一网段。
  7. 我可以通过 SSMS 从客户端系统登录 SQL 个实例。
  8. SQL 个实例是 运行ning Dev Edition SQL 服务器版本 2014、2016 和 2017。
  9. 我在代码中调用了 GetDataSources() 不止一次,因为我读到每次调用的结果输出可能不同。
  10. 我也试过 Microsoft.SqlServer.Management.Smo.SmoApplication.EnumAvailableSqlServers 结果相同,但列为空。
  11. Windows10、.NET Framework 3.5(包括.NET 2.0 和 3.0)中的功能已启用和禁用,结果相同,空列。

在 .NET 中,我使用以下内容:

Dim AllEnumeratedSQLInstancesTable2 As DataTable = New DataTable()
AllEnumeratedSQLInstancesTable2 = instance.GetDataSources()

在 PowerShell 中我使用这个:

[System.Data.Sql.SqlDataSourceEnumerator]::Instance.GetDataSources()

Instance.GetDataSources() 的输出在客户端是这样的:

ServerName      InstanceName IsClustered Version
----------      ------------ ----------- -------
DESKTOP-SQL2K14
DESKTOP-SQL2K16
DESKTOP-SQL2K17

现在,当我在上面的任何 SQL 服务器系统上 运行 时,我得到以下内容,这是我在客户端所期望的:

ServerName      InstanceName IsClustered Version
----------      ------------ ----------- -------
DESKTOP-SQL2K14              No          12.0.6024.0
DESKTOP-SQL2K16              No          13.2.5026.0
DESKTOP-SQL2K17              No          14.0.1000.169
DESKTOP-SQL2K17 INSTANCE2    No          14.0.1000.169

不幸的是,数据由于某种原因没有到达客户端。这就是问题的根源。

我还了解到这可能是 .NET 4.6 中的一个问题,因此我将 4.6.1、4.5.1 和 4.7.2 作为目标,结果没有变化。

欢迎提出超出尝试范围的任何进一步建议。

好吧,事实证明这是我的实验室环境中基于网络的问题,希望这对以后的人有所帮助。虽然使用 Wireshark 的建议很好,但它并没有解决我的问题,而是让我进一步考虑我的设置。

我的虚拟实验室环境涉及使用 Oracle's VirtualBox,并提供一些进一步的背景信息,在将 NIC 添加到 VM 时,在下拉菜单 Attached type: 中选择的选项是 Bridged Adapter。这工作正常,虚拟机通过网络上的 DHCP 接收到一个 IP,我能够 ping 虚拟机,通过 SSMS、RDP 连接到它,等等

但是,由于某种原因,UDP 数据包不是 "leaving" 那个虚拟机,因此 SQL 浏览器服务的输出没有返回到我的客户端,因此上面讨论的 SQL 枚举操作会 return 空结果。

所以,我的解决方案是执行以下操作。

  1. 将 NIC 上的 attached typeBridged Adapter 更改为 VirtualBox Host-Only Ethernet Adapter

这会将 VM 的 IP 更改为从 192.168.56.101(默认)开始的内容,并且不会为适配器分配网关。这意味着如果您想要 VM 访问 Internet,它将无法工作。

  1. 要允许 VM 访问互联网,您需要 shutdown the VM 有问题,并在 VirtualBox 设置中为 VM 添加第二个 NIC,在 Network 下并选中复选框 Enable Network AdapterAdapter 2 选项卡下。在这里,您可以在 Attached to: 下拉列表中选择 Bridged Adapter,这样 VM 将在重新启动时在您的网络上获得一个 IP。

现在,由于虚拟机 "leg" 通过 VirtualBox 配置的路由 table 进入两个网络,SQL 浏览器数据现在正在返回到客户端计算机结果如预期。

希望这对某人有用。