U slaat servers over die geen benoemde instanties zijn. Pas uw code aan:
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;
}
Let op:SqlDataSourceEnumerator.Instance.GetDataSources()
heeft nadelen:
- Onderhevig aan firewallregels (geblokkeerd TCP/IP 1433 en UDP 1434)
- Kan geen SQL-servers vinden als de SQL-browser is uitgeschakeld
- Kan SQL-servers niet vinden als ze verborgen zijn
- De inhoud van de lijst is niet gegarandeerd herhaalbaar (vanwege time-outs). In feite is de kans groot dat een volgende oproep een andere lijst geeft, afhankelijk van de netwerk-I/O, de serverprestaties, het aantal servers op het netwerk en andere tijdsafhankelijke beperkingen
Verschillende bronnen zeggen dat je 2 aanroepen moet doen naar SqlDataSourceEnumerator.Instance.GetDataSources()
...
Referenties:
- SqlDataSourceEnumerator.Instance; niet alle instanties retourneren
- EnumAvailableSqlServers of SqlDataSourceEnumerator - Onjuiste lijst met beschikbare databases
- SQL-servers opsommen
- Programmatische lijst van SQL-servers