Está omitiendo servidores que no son instancias con nombre. Modifica tu código:
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;
}
Tenga en cuenta:SqlDataSourceEnumerator.Instance.GetDataSources()
tiene inconvenientes:
- Sujeto a las reglas del cortafuegos (TCP/IP 1433 y UDP 1434 bloqueados)
- No encuentra servidores SQL si el navegador SQL está desactivado
- No encuentra servidores SQL si están ocultos
- No se garantiza que el contenido de la lista sea repetible (debido a tiempos de espera). De hecho, es muy probable que una llamada posterior proporcione una lista diferente según la E/S de la red, el rendimiento del servidor, la cantidad de servidores en la red y otras restricciones dependientes del tiempo
Varias fuentes dicen que tienes que hacer 2 llamadas a SqlDataSourceEnumerator.Instance.GetDataSources()
...
Referencias:
- SqlDataSourceEnumerator.Instance; no devolver todas las instancias
- EnumAvailableSqlServers o SqlDataSourceEnumerator:lista incorrecta de bases de datos disponibles
- Enumeración de servidores SQL
- Enumeración programática de servidores SQL