Vynecháváte servery, které nejsou pojmenované instance. Upravte svůj kód:
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;
}
Poznámka:SqlDataSourceEnumerator.Instance.GetDataSources()
má nevýhody:
- Podléhá pravidlům brány firewall (blokované TCP/IP 1433 a UDP 1434)
- Nenalezne servery SQL, pokud je prohlížeč SQL vypnutý
- Nenalezne servery SQL, pokud jsou skryté
- Není zaručena opakovatelnost obsahu seznamu (kvůli vypršení časového limitu). Ve skutečnosti je velmi pravděpodobné, že následné volání poskytne jiný seznam v závislosti na I/O sítě, výkonu serveru, počtu serverů v síti a dalších časově závislých omezeních
Několik zdrojů uvádí, že musíte provést 2 volání SqlDataSourceEnumerator.Instance.GetDataSources()
...
Odkazy:
- SqlDataSourceEnumerator.Instance; nevrací všechny instance
- EnumAvailableSqlServers nebo SqlDataSourceEnumerator – nesprávný seznam dostupných databází
- Výčet serverů SQL
- Programový výpis serverů SQL