名前のないインスタンスのサーバーをスキップしています。コードを変更します:
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 / IP1433およびUDP1434)に従う
- SQLブラウザがオフの場合にSQLServerが見つかりません
- 非表示の場合はSQLServerが見つかりません
- リストの内容は、(タイムアウトのために)再現可能であることが保証されていません。実際、後続の呼び出しでは、ネットワークI / O、サーバーパフォーマンス、ネットワーク上のサーバーの数、およびその他の時間依存の制約に応じて、異なるリストが表示される可能性が非常に高くなります。
いくつかの情報源によると、SqlDataSourceEnumerator.Instance.GetDataSources()
を2回呼び出す必要があります ...
参照:
- SqlDataSourceEnumerator.Instance;すべてのインスタンスを返すわけではありません
- EnumAvailableSqlServersまたはSqlDataSourceEnumerator-使用可能なデータベースのリストが正しくありません
- SQLサーバーの列挙
- SQLサーバーをプログラムで一覧表示する