Vous ignorez les serveurs qui ne sont pas des instances nommées. Modifiez votre code :
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;
}
Veuillez noter :SqlDataSourceEnumerator.Instance.GetDataSources()
a des inconvénients :
- Sous réserve des règles de pare-feu (TCP/IP 1433 et UDP 1434 bloqués)
- Ne trouve pas les serveurs SQL si le navigateur SQL est désactivé
- Ne trouve pas les serveurs SQL s'ils sont masqués
- La répétabilité du contenu de la liste n'est pas garantie (en raison de délais d'attente). En fait, un appel ultérieur est susceptible de donner une liste différente en fonction des E/S réseau, des performances du serveur, du nombre de serveurs sur le réseau et d'autres contraintes dépendant du temps
Plusieurs sources disent que vous devez faire 2 appels à SqlDataSourceEnumerator.Instance.GetDataSources()
...
Réfs :
- SqlDataSourceEnumerator.Instance ; ne renvoie pas toutes les instances
- EnumAvailableSqlServers ou SqlDataSourceEnumerator - Liste incorrecte des bases de données disponibles
- Énumération des serveurs SQL
- Liste des serveurs SQL par programmation