Pomijasz serwery, które nie są nazwanymi instancjami. Zmodyfikuj swój kod:
public class SqlServerInstance
{
public string ServerInstance { get; set; }
public string Version { get; set; }
}
public static List<SqlServerInstance> LocateSqlInstances()
{
List<SqlServerInstance> results = new List<SqlServerInstance>();
using (DataTable sqlSources = SqlDataSourceEnumerator.Instance.GetDataSources())
{
foreach (DataRow source in sqlSources.Rows)
{
string servername;
string instancename = source["InstanceName"].ToString();
if (!string.IsNullOrEmpty(instancename))
{
servername = source["ServerName"].ToString() + '\\' + instancename;
}
else
{
servername = source["ServerName"].ToString();
}
results.Add(new SqlServerInstance (){ ServerInstance = servername, Version = source["Version"].ToString() });
}
}
return results;
}
Uwaga:SqlDataSourceEnumerator.Instance.GetDataSources()
ma wady:
- Z zastrzeżeniem reguł zapory (Zablokowany TCP/IP 1433 i UDP 1434)
- Nie znajduje serwerów SQL, jeśli przeglądarka SQL jest wyłączona
- Nie znajduje serwerów SQL, jeśli są ukryte
- Nie ma gwarancji, że zawartość listy będzie powtarzalna (ze względu na limity czasu). W rzeczywistości kolejne wywołanie prawdopodobnie da inną listę w zależności od sieci we/wy, wydajności serwera, liczby serwerów w sieci i innych ograniczeń czasowych
Kilka źródeł mówi, że musisz wykonać 2 wywołania do SqlDataSourceEnumerator.Instance.GetDataSources()
...
Odniesienia:
- SqlDataSourceEnumerator.Instance; nie zwraca wszystkich instancji
- EnumAvailableSqlServers lub SqlDataSourceEnumerator — Nieprawidłowa lista dostępnych baz danych
- Wyliczanie serwerów SQL
- Programowe wyświetlanie serwerów SQL