Stai saltando su server che non sono istanze denominate. Modifica il tuo codice:
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;
}
Nota:SqlDataSourceEnumerator.Instance.GetDataSources()
ha degli svantaggi:
- Soggetto alle regole del firewall (TCP/IP 1433 e UDP 1434 bloccati)
- Non trova SQL Server se il browser SQL è disattivato
- Non trova SQL Server se sono nascosti
- Elenca i contenuti non garantiti per essere ripetibili (a causa di timeout). In effetti, è molto probabile che una chiamata successiva fornisca un elenco diverso a seconda dell'I/O della rete, delle prestazioni del server, del numero di server sulla rete e di altri vincoli dipendenti dal tempo
Diverse fonti affermano che devi effettuare 2 chiamate a SqlDataSourceEnumerator.Instance.GetDataSources()
...
Rif:
- SqlDataSourceEnumerator.Instance; non restituisce tutte le istanze
- EnumAvailableSqlServers o SqlDataSourceEnumerator - Elenco errato dei database disponibili
- Enumerare i server SQL
- Elenco programmatico di SQL Server