通过 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 列为空。
运行 同一网络中服务器上的相同代码显示所有记录的列的有效结果。
注意客户端系统安装了以下:
- (A) Visual Studio 2019 社区版版本 16.1.6
- (B).NET 4.8.03752
- (C) OS = Windows 10 专业版 1903(18362.239 版本)
- (D) NuGet 包 Microsoft.SqlServer.SqlManagementObjects 安装
版本 150.18118.0
这是我已经尝试过并检查过的内容,我已经研究了几天,我已经用尽了我发现的所有内容...
- SQL SQL 服务器端的浏览器服务在所有实例上 运行ning。
- 服务器端和客户端的所有防火墙都关闭。
- SQL 个实例 运行 正在 Windows 10 Pro 版本 1803 (17134.885) 和 1903 (18362.239)
- SQL 所有实例的配置都已启用 TCP/IP。
- 由于防火墙关闭,UDP 端口 1434 未被阻止。
- 服务器在同一网段。
- 我可以通过 SSMS 从客户端系统登录 SQL 个实例。
- SQL 个实例是 运行ning Dev Edition SQL 服务器版本 2014、2016 和 2017。
- 我在代码中调用了 GetDataSources() 不止一次,因为我读到每次调用的结果输出可能不同。
- 我也试过 Microsoft.SqlServer.Management.Smo.SmoApplication.EnumAvailableSqlServers 结果相同,但列为空。
- 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 空结果。
所以,我的解决方案是执行以下操作。
- 将 NIC 上的
attached type
从 Bridged Adapter
更改为 VirtualBox Host-Only Ethernet Adapter
。
这会将 VM 的 IP 更改为从 192.168.56.101(默认)开始的内容,并且不会为适配器分配网关。这意味着如果您想要 VM 访问 Internet,它将无法工作。
- 要允许 VM 访问互联网,您需要
shutdown the VM
有问题,并在 VirtualBox 设置中为 VM 添加第二个 NIC,在 Network
下并选中复选框 Enable Network Adapter
在 Adapter 2
选项卡下。在这里,您可以在 Attached to:
下拉列表中选择 Bridged Adapter
,这样 VM 将在重新启动时在您的网络上获得一个 IP。
现在,由于虚拟机 "leg" 通过 VirtualBox 配置的路由 table 进入两个网络,SQL 浏览器数据现在正在返回到客户端计算机结果如预期。
希望这对某人有用。
我正在尝试使用 SQLDataSourceEnumerator.Instance.GetDataSources() 在本地或网络上枚举所有 SQL 实例。返回数据 table 但只有 ServerName 列有数据。 InstanceName、IsClustered 和 Version 列为空。
运行 同一网络中服务器上的相同代码显示所有记录的列的有效结果。
注意客户端系统安装了以下:
- (A) Visual Studio 2019 社区版版本 16.1.6
- (B).NET 4.8.03752
- (C) OS = Windows 10 专业版 1903(18362.239 版本)
- (D) NuGet 包 Microsoft.SqlServer.SqlManagementObjects 安装 版本 150.18118.0
这是我已经尝试过并检查过的内容,我已经研究了几天,我已经用尽了我发现的所有内容...
- SQL SQL 服务器端的浏览器服务在所有实例上 运行ning。
- 服务器端和客户端的所有防火墙都关闭。
- SQL 个实例 运行 正在 Windows 10 Pro 版本 1803 (17134.885) 和 1903 (18362.239)
- SQL 所有实例的配置都已启用 TCP/IP。
- 由于防火墙关闭,UDP 端口 1434 未被阻止。
- 服务器在同一网段。
- 我可以通过 SSMS 从客户端系统登录 SQL 个实例。
- SQL 个实例是 运行ning Dev Edition SQL 服务器版本 2014、2016 和 2017。
- 我在代码中调用了 GetDataSources() 不止一次,因为我读到每次调用的结果输出可能不同。
- 我也试过 Microsoft.SqlServer.Management.Smo.SmoApplication.EnumAvailableSqlServers 结果相同,但列为空。
- 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 空结果。
所以,我的解决方案是执行以下操作。
- 将 NIC 上的
attached type
从Bridged Adapter
更改为VirtualBox Host-Only Ethernet Adapter
。
这会将 VM 的 IP 更改为从 192.168.56.101(默认)开始的内容,并且不会为适配器分配网关。这意味着如果您想要 VM 访问 Internet,它将无法工作。
- 要允许 VM 访问互联网,您需要
shutdown the VM
有问题,并在 VirtualBox 设置中为 VM 添加第二个 NIC,在Network
下并选中复选框Enable Network Adapter
在Adapter 2
选项卡下。在这里,您可以在Attached to:
下拉列表中选择Bridged Adapter
,这样 VM 将在重新启动时在您的网络上获得一个 IP。
现在,由于虚拟机 "leg" 通过 VirtualBox 配置的路由 table 进入两个网络,SQL 浏览器数据现在正在返回到客户端计算机结果如预期。
希望这对某人有用。