Du springer over servere, der ikke er navngivne forekomster. Rediger din kode:
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;
}
Bemærk venligst:SqlDataSourceEnumerator.Instance.GetDataSources()
har ulemper:
- Underlagt firewallregler (blokeret TCP/IP 1433 og UDP 1434)
- Finder ikke SQL-servere, hvis SQL-browseren er slået fra
- Finder ikke SQL-servere, hvis de er skjulte
- Indhold på listen er ikke garanteret gentageligt (på grund af timeouts). Faktisk er det meget sandsynligt, at et efterfølgende opkald giver en anden liste afhængigt af netværkets I/O, serverydelse, antallet af servere på netværket og andre tidsafhængige begrænsninger
Flere kilder siger, at du skal foretage 2 opkald til SqlDataSourceEnumerator.Instance.GetDataSources()
...
Refs:
- SqlDataSourceEnumerator.Instance; returnerer ikke alle forekomster
- EnumAvailableSqlServers eller SqlDataSourceEnumerator - Forkert liste over tilgængelige databaser
- Optælling af SQL-servere
- Programmatisk liste over SQL-servere