我正在编写一个连接到 SQL 服务器的数据库应用程序。我想实现一个类似于 SQL Management Studio 中的连接对话框。我已经找到了一种获取服务器上数据库列表的方法,但我真的很想获取网络上可用服务器的列表,这样最终用户就不必输入服务器的名称/IP .
7 回答
如果您在 .Net 中开发程序,您可以使用 SMO 对象来执行此操作。使用 Microsoft.SqlServer.Management.Smo.SmoApplication.EnumAvailableSqlServers 方法获取本地网络中运行的所有 sql 服务器的列表。
扫描需要几秒钟,但不是很慢。
从这里:
CREATE PROCEDURE dbo.ListLocalServers
AS
BEGIN
SET NOCOUNT ON
CREATE TABLE #servers(sname VARCHAR(255))
INSERT #servers EXEC master..XP_CMDShell 'OSQL -L'
-- play with ISQL -L too, results differ slightly
DELETE #servers WHERE sname='Servers:'
SELECT LTRIM(sname) FROM #servers WHERE sname != 'NULL'
DROP TABLE #servers
END
此处的替代 SQL DMO 方法
不确定是否有正确的方法,但一种技巧是尝试将端口 1433(默认 mssqlserver 端口)连接到网络中的机器。
来自sqlsecurity.com的工具 SQLPing 旧版本下载包含可能有用的源代码。
实际上,您需要在网络上的每个 IP 地址上查询端口 1434 UDP。但是,防火墙和策略会阻止这一点。
注意:1434 是您在服务器上枚举 SQL 实例的位置。如果您只使用默认实例,那么端口 1433 就可以了。除非它在端口 2433 上“隐藏”...
如果可以的话,您最好的猜测是提前填充列表。
扫描网络以查找 SQL 服务器可能不是最好的主意(缓慢、不可靠)。
开始可能是获取MS 网络监视器,然后在单击 MSSMS 中的下拉菜单时查看它的作用。
我的猜测是(当您单击该下拉菜单时会有延迟)是它轮询本地网络。
话虽如此,在我的办公室里,它似乎比本地网络轮询更多,因为它获取位于公司网络内但在其他子网上的服务器。
祝你好运
也许 SQLCMD /L 会为你工作。