(.Net)ネットーワーク上のSQL Server インスタンスの一覧取得
クライアントソフト初回起動時に、DBの接続先を設定させる要件で、今までは直に SQL Server のホスト名を指定させてましたが、ユーザビリティを向上させるために、自動的にLAN内の SQL Server を検索する機能を付けてみました。
(SQL Server Management Studio のログインで参照を押した時のような感じです。)
結構ややこしいだろなと思って探すと、あっさり見つかりました。
MSDN:SQL Server のインスタンスの列挙に詳しく取り上げられています。
下記は、ネットワーク上の SQL Server インスタンスを検索し、ListViewコントロールに表示するメソッドです。
'''''' ネットワーク上のSQL Server インスタンスを検索し、結果をListViewに表示
'''
'''
Private Sub SetDatabaseServerListView(ByRef lsvServer As ListView)
'リストビューからいったん情報クリア
lsvServer.Items.Clear()
'ネットワーク上の SQL Server Instance取得
Dim instance As SqlDataSourceEnumerator = SqlDataSourceEnumerator.Instance
Dim dtbl As DataTable = instance.GetDataSources()
For Each row As DataRow In dtbl.Rows
'ListViewに情報追加
Dim svItems() As String = {row("ServerName"), row("InstanceName"), row("Version")}
Dim listViewItem As New ListViewItem(svItems, 0)
listViewItem.SubItems(0).Name = "SvName"
listViewItem.SubItems(1).Name = "InstanceName"
lsvServer.Items.Add(listViewItem)
Next
End Sub
あまりに簡単にできたので、ちょっと拍子抜け。。
追記(2009/7/6):
row("ServerName"), row("InstanceName"), row("Version") ですが、どうやら値が DBNull になる場合もあるようです。(MSDNには書いてませんが。。。)
なので、
If row("ServerName") Is DBNull.Value OrElse row("InstanceName") Is DBNull.Value OrElse row("Version") Is DBNull.Value OrElse Then
Continue For
End If
Dim svItems() As String = {row("ServerName"), row("InstanceName"), row("Version")}
としたほうが良さそうです。