3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(.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")}

としたほうが良さそうです。