Você está pulando servidores que não são instâncias nomeadas. Modifique seu 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;
}
Observe:
SqlDataSourceEnumerator.Instance.GetDataSources()
tem desvantagens:- Sujeito a regras de firewall (TCP/IP 1433 e UDP 1434 bloqueados)
- Não encontra SQL Servers se o SQL Browser estiver desativado
- Não encontra SQL Servers se estiverem ocultos
- Não é garantido que o conteúdo da lista seja repetível (devido a tempos limite). Na verdade, uma chamada subsequente provavelmente fornecerá uma lista diferente dependendo da E/S da rede, desempenho do servidor, número de servidores na rede e outras restrições dependentes do tempo
Várias fontes dizem que você precisa fazer 2 chamadas para
SqlDataSourceEnumerator.Instance.GetDataSources()
... Referências:
- SqlDataSourceEnumerator.Instance; não retornando todas as instâncias
- EnumAvailableSqlServers ou SqlDataSourceEnumerator - Lista incorreta de bancos de dados disponíveis
- Enumerando SQL Servers
- Como listar servidores SQL programaticamente