利用 SQL Server 自帶的 SQLDMO.dll COM 組件,通過 .NET 互操作實現局域網 SQL Server 實例發現。
Microsoft SQLDMO Object LibraryC:\Program Files\Microsoft SQL Server\80\Tools\Binn\sqldmo.dllusing System;
using System.Collections.Generic;
using System.Text;
using SQLDMO; // 需添加 COM 引用後自動生成互操作程序集
namespace AllSqlServer
{
class Program
{
static void Main(string[] args)
{
// 1. 創建 ApplicationClass 實例
ApplicationClass ac = new ApplicationClass();
// 2. 獲取可用服務器名稱列表
NameList names = ac.ListAvailableSQLServers();
// 3. 複製到字符串數組
string[] serverList = new string[names.Count];
for (int i = 0; i < serverList.Length; i++)
{
serverList[i] = names.Item(i + 1); // SQLDMO 集合通常 1-based
}
// 4. 輸出結果
foreach (string server in serverList)
{
Console.WriteLine(server);
}
Console.ReadLine();
}
}
}
| 要點 | 說明 |
|---|---|
| COM 互操作 | .NET Runtime Callable Wrapper (RCW) 自動封裝 COM 接口 |
| ListAvailableSQLServers | 廣播網絡探測,返回 NameList 集合 |
| 索引基數 | SQLDMO 集合為 1-based,Item(1) 為第一項 |
| 網絡依賴 | 需開啟 SQL Server Browser 服務,UDP 1434 端口通暢 |
| 權限 | 調用進程需有網絡枚舉權限,防火牆可能阻攔廣播 |
⚠️ 注意:SQLDMO 已在 SQL Server 2012+ 棄用,移除於 2016+。新項目推薦:
Microsoft.SqlServer.Management.Smo.SmoApplication.EnumAvailableSqlServers(),純 .NET 組件,無 COM 依賴System.Data.Sql.SqlDataSourceEnumerator.Instance.GetDataSources(),標準 ADO.NET,零額外依賴using System.Data.Sql;
DataTable servers = SqlDataSourceEnumerator.Instance.GetDataSources();
foreach (DataRow row in servers.Rows)
{
Console.WriteLine($"{row["ServerName"]}\\{row["InstanceName"]} - {row["Version"]}");
}
| 方案 | 適用版本 | 依賴 | 推薦度 |
|---|---|---|---|
| SQLDMO | SQL Server 2000/2005/2008/R2 | COM 組件 | ⭐ 僅維護舊系統 |
| SMO | SQL Server 2005+ | .NET 組件 | ⭐⭐⭐ 功能最全 |
| SqlDataSourceEnumerator | SQL Server 2000+ | System.Data | ⭐⭐⭐⭐⭐ 輕量標準 |