Sie überspringen Server, die keine benannten Instanzen sind. Ändern Sie Ihren 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;
}
Bitte beachten Sie:SqlDataSourceEnumerator.Instance.GetDataSources()
hat Nachteile:
- Unterliegt Firewall-Regeln (Blockiertes TCP/IP 1433 und UDP 1434)
- Findet keine SQL-Server, wenn der SQL-Browser ausgeschaltet ist
- Findet keine versteckten SQL-Server
- Listeninhalte sind nicht garantiert wiederholbar (aufgrund von Zeitüberschreitungen). Tatsächlich ergibt ein nachfolgender Aufruf je nach Netzwerk-E/A, Serverleistung, Anzahl der Server im Netzwerk und anderen zeitabhängigen Einschränkungen sehr wahrscheinlich eine andere Liste
Mehrere Quellen sagen, dass Sie SqlDataSourceEnumerator.Instance.GetDataSources()
zweimal aufrufen müssen ...
Referenzen:
- SqlDataSourceEnumerator.Instance; nicht alle Instanzen zurückgeben
- EnumAvailableSqlServers oder SqlDataSourceEnumerator - Falsche Liste verfügbarer Datenbanken
- SQL-Server aufzählen
- Programmgesteuertes Auflisten von SQL-Servern