Du hoppar över servrar som inte är namngivna instanser. Ändra din kod:
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;
}
Observera:SqlDataSourceEnumerator.Instance.GetDataSources()
har nackdelar:
- Med förbehåll för brandväggsregler (blockerad TCP/IP 1433 och UDP 1434)
- Hittar inte SQL-servrar om SQL-webbläsaren är avstängd
- Hittar inte SQL-servrar om de är dolda
- Listinnehåll garanteras inte att vara repeterbart (på grund av tidsgränser). Faktum är att ett efterföljande anrop kommer att ge en annan lista beroende på nätverkets I/O, serverprestanda, antalet servrar i nätverket och andra tidsberoende begränsningar
Flera källor säger att du måste göra två anrop till SqlDataSourceEnumerator.Instance.GetDataSources()
...
Refs:
- SqlDataSourceEnumerator.Instance; returnerar inte alla instanser
- EnumAvailableSqlServers eller SqlDataSourceEnumerator - Felaktig lista över tillgängliga databaser
- Räkna upp SQL-servrar
- Programmatisk lista över SQL-servrar