SQL Server のインスタンスの列挙 (ADO.NET)

ADO.NET のダウンロード

SQL Server では、アプリケーションが現在のネットワーク内の SQL Server インスタンスを検索できます。 SqlDataSourceEnumerator クラスは、この情報をアプリケーション開発者に公開し、表示されるすべてのサーバーに関する情報を含む DataTable を提供します。 このときに返されるテーブルには、ユーザーが新しい接続を作成しようとして、 [接続プロパティ] ダイアログ ボックスで、利用可能なすべてのサーバーが含まれたドロップダウン リストを展開したときに表示されるリストと一致するサーバー インスタンスのリストが含まれています。 表示される結果が完全なものであるとは限りません。

Note

ほとんどの Windows サービスと同様に、SQL Browser サービスは必要最小限の特権で実行することをお勧めします。 SQL Browser サービスの詳細および SQL Browser サービスの動作を管理する方法については、SQL Server オンライン ブックを参照してください。

列挙子インスタンスの取得

使用可能な SQL Server インスタンスに関する情報が含まれたテーブルを取得するには、まず、共有プロパティまたは静的プロパティである Instance プロパティを使用して列挙子を取得する必要があります。

System.Data.Sql.SqlDataSourceEnumerator instance =   
   System.Data.Sql.SqlDataSourceEnumerator.Instance  

静的インスタンスを取得したら、使用可能なサーバーに関する情報を含む DataTable を返す GetDataSources メソッドを呼び出すことができます。

System.Data.DataTable dataTable = instance.GetDataSources();  

このメソッド呼び出しから返されるテーブルには次の列が含まれ、そのすべてに string 値が含まれています。

Column 説明
ServerName サーバーの名前。
InstanceName サーバー インスタンスの名前。 サーバーが既定のインスタンスとして実行されている場合は空白です。
IsClustered サーバーがクラスターの一部であるかどうかを示します。
Version サーバーのバージョン。 次に例を示します。

- 9.00.x (SQL Server 2005)
- 10.0.xx (SQL Server 2008)
- 10.50.x (SQL Server 2008 R2)
- 11.0.xx (SQL Server 2012)

列挙の制限

使用可能なサーバーの一部が表示されないことがあります。 この一覧は、タイムアウトやネットワーク トラフィックなどの要因によって異なることがあります。 このため、2 回の連続呼び出しで一覧が異なる場合があります。 同じネットワーク上のサーバーのみが一覧表示されます。 ブロードキャスト パケットは通常、ルーターをスキャンしません。あるサーバーが一覧表示されないことがあっても、複数の呼び出し間で安定しているのはこのためです。

一覧表示されたサーバーに、常に IsClustered やバージョンなどの追加情報があるとは限りません。 これは、その一覧がどのように取得されたかによって異なります。 SQL Server ブラウザー サービスを介して一覧表示されるサーバーには、名前しか一覧表示しない Windows インフラストラクチャを介して検索されたサーバーより多くの詳細情報が含まれています。

Note

サーバーの列挙は、完全に信頼され、実行されている場合にのみ使用できます。 部分的に信頼された環境で実行されているアセンブリは、SqlClientPermission コード アクセス セキュリティ (CAS) アクセス許可がある場合でも使用できません。

SQL Server では、SQL Browser という名前の外部の Windows サービスを利用して、SqlDataSourceEnumerator に情報を提供します。 このサービスは既定で有効になっていますが、管理者はそれをオフにするか、無効にして、サーバー インスタンスをこのクラスに表示しないようにすることができます。

次のコンソール アプリケーションは、表示可能なすべての SQL Server インスタンスに関する情報を取得し、コンソール ウィンドウにその情報を表示します。

using System.Data.Sql;  
  
class Program  
{  
  static void Main()  
  {  
    // Retrieve the enumerator instance and then the data.  
    SqlDataSourceEnumerator instance =  
      SqlDataSourceEnumerator.Instance;  
    System.Data.DataTable table = instance.GetDataSources();  
  
    // Display the contents of the table.  
    DisplayData(table);  
  
    Console.WriteLine("Press any key to continue.");  
    Console.ReadKey();  
  }  
  
  private static void DisplayData(System.Data.DataTable table)  
  {  
    foreach (System.Data.DataRow row in table.Rows)  
    {  
      foreach (System.Data.DataColumn col in table.Columns)  
      {  
        Console.WriteLine("{0} = {1}", col.ColumnName, row[col]);  
      }  
      Console.WriteLine("============================");  
    }  
  }  
}  

次のステップ