gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:40:07 28 4
gpt4 key购买 nike

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

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

请注意,客户端系统安装了以下内容:

  • (A) Visual Studio 2019 社区版版本 16.1.6
  • (B) .NET 4.8.03752
  • (C)​​ 操作系统 = Windows 10 专业版 1903(18362.239 版本)
  • (D) 安装了 Microsoft.SqlServer.SqlManagementObjects 的 NuGet 包版本 150.18118.0

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

  1. SQL 服务器端的 SQL Browser 服务在所有实例上运行。
  2. 服务器端和客户端的所有防火墙均关闭。
  3. 在 Windows 10 专业版 1803 (17134.885) 和 1903 (18362.239) 上运行的 SQL 实例
  4. 所有实例的 SQL 配置都启用了 TCP/IP。
  5. 由于防火墙关闭,UDP 端口 1434 未被阻止。
  6. 服务器在同一网段。
  7. 我可以通过 SSMS 从客户端系统登录 SQL 实例。
  8. SQL 实例运行的是开发版 SQL Server 2014、2016 和 2017 版。
  9. 我在代码中不止一次调用了 GetDataSources(),因为我了解到每次调用的结果输出可能不同。
  10. 我也尝试过 Microsoft.SqlServer.Management.Smo.SmoApplication.EnumAvailableSqlServers,结果相同,列为空。
  11. Windows 10、.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 的 VirtualBox,并提供一些进一步的背景知识,在将 NIC 添加到 VM 时,在下拉列表 Attached type 中选择的选项: 桥接适配器。这工作正常,虚拟机通过网络上的 DHCP 接收到 IP,我能够 ping 虚拟机,通过 SSMS、RDP 等连接到它。

但是,出于某种原因,UDP 数据包没有“离开”那个 VM,因此 SQL Browser 服务的输出没有返回到我的客户端,因此讨论了 SQL 枚举操作以上将返回空结果。

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

  1. 将 NIC 上的连接类型桥接适配器更改为VirtualBox Host-Only Ethernet Adapter

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

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

现在,由于 VM 通过 VirtualBox 配置的路由表在两个网络中都有一条“腿”,SQL 浏览器数据现在正在返回到客户端计算机,结果符合预期。

希望这对某人有用。

关于c# - 通过 SqlDataSourceEnumerator.Instance.GetDataSources() 完成枚举时,.NET 不显示实例或版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57386043/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com