Прескачате сървъри, които не са наименувани екземпляри. Променете кода си:
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;
}
Моля, обърнете внимание:SqlDataSourceEnumerator.Instance.GetDataSources()
има недостатъци:
- Подлежи на правилата на защитната стена (блокиран TCP/IP 1433 и UDP 1434)
- Не намира SQL сървъри, ако SQL браузърът е изключен
- Не намира SQL сървъри, ако са скрити
- Съдържанието на списъка не е гарантирано, че може да се повтаря (поради изтичане на времето). Всъщност последващо обаждане е доста вероятно да даде различен списък в зависимост от мрежовия вход/изход, производителността на сървъра, броя на сървърите в мрежата и други зависещи от времето ограничения
Няколко източника казват, че трябва да направите 2 извиквания към SqlDataSourceEnumerator.Instance.GetDataSources()
...
Препратки:
- SqlDataSourceEnumerator.Instance; не връща всички екземпляри
- EnumAvailableSqlServers или SqlDataSourceEnumerator – Неправилен списък с налични бази данни
- Изброяване на SQL сървъри
- Програмно изброяване на SQL сървъри