SqlDataAdapter.Fillで特定列をComboBoxに表示

SqlDataAdapterオブジェクトのFillメソッドを使って、指定したテーブルの列データをComboBoxに表示し、選択したComboBox項目のコードを取得するプログラムを作成。

VB 2008 [SQL Server 2008版]
サンプル1
サンプル2
  • フォームにコンボボックスとラベルを貼り付け
  • SqlDataAdapter.Fillでレコード取得
  • ComboBoxのDatasourceプロパティでデータバインド
  • コンボボックスに部署マスター表の部署名称を表示
  • 選択した部署名から部署コードを取得し、Label2に表示
  • 初期表示時は「部署コードを選択してください」と表示(右上図)
  • 接続文字列は、アプリケーション構成ファイル(app.config)から取得
  • コンボボックスの選択項目が変更された時の処理は、SelectedIndexChangedイベントハンドラに実装
販売管理データベース(部署マスター表
Key 列名 データ型 NULLを許容
部署コード nchar(4) しない
部署名称 nvarchar(20) しない

VB 2008 [MDB版]
VB.NET [MDB版]

Option Strict On
Imports System.Data.SqlClient
Imports System.Configuration  ' 参照の追加 System.Configuration 

Public Class Form1

    '*********************************************************************
    ' コンボボックスの選択項目が変更された時の処理
    '*********************************************************************
    Private Sub ComboBox1_SelectedIndexChanged( _
        ByVal sender As Object, ByVal e As System.EventArgs _
        ) Handles ComboBox1.SelectedIndexChanged

        ' 選択項目が変更されたら、部署コードをラベルに表示
        If ComboBox1.SelectedIndex >= 0 Then
            Label2.Text = ComboBox1.SelectedValue.ToString
        End If

    End Sub

    '*********************************************************************
    ' フォームロード処理
    '*********************************************************************
    Private Sub Form1_Load( _
        ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load

        Try
            Using con As New SqlConnection
              Using cmd As New SqlCommand
                  ' 接続文字列をapp.configファイルから取得
                  ' (SQL Server 2008 Express Edition)
                  Dim settings As ConnectionStringSettings
                  settings = _
                      ConfigurationManager.ConnectionStrings _
                      ("販売管理ConnectionString")

                  If settings Is Nothing Then
                      ' 接続文字列取得エラー
                      MessageBox.Show("接続文字列がapp.configに未登録")
                  Else
                      ' 接続文字列の設定
                      con.ConnectionString = settings.ConnectionString
                      ' SqlCommand.Connectionプロパティの設定
                      cmd.Connection = con
                  End If

                  ' SQL文の設定
                  cmd.CommandText = _
                      "SELECT 部署コード, 部署名称 " & _
                      "FROM 部署マスター表 ORDER BY 部署コード"

                  ' 部署マスター表からレコード取得
                  Dim dt As New DataTable
                  Using da As New SqlDataAdapter
                      da.SelectCommand = cmd
                      da.Fill(dt)
                      ' データグリッドビューにバインド
                      ComboBox1.DataSource =dt
                  End Using 

                  ' コンボボックスに表示する列の設定
                  ComboBox1.DisplayMember = "部署名称"
                  ' 選択した項目のコードを
                  ' 取得するための設定
                  ComboBox1.ValueMember = "部署コード"
                  ' 項目を未選択状態に設定
                  ComboBox1.SelectedIndex = -1
                  ComboBox1.Text = "部署を選択してください"
                  ' コード表示Label2を初期化
                  Label2.Text = Nothing
              End Using
            End Using
        Catch ex As Exception
            ' 例外が発生した時の処理
            MessageBox.Show(ex.ToString)
        End Try

    End Sub

End Class

DataTableの代わりに、DataSetを使って、SqlDataAdapter.Fillでレコードを取得するサンプル

          ' 部署マスター表からレコード取得
          Dim ds As New DataSet
          Using da As New SqlDataAdapter
              da.SelectCommand = cmd
              da.Fill(ds, "部署テーブル")
              ' データグリッドビューにバインド
              ComboBox1.DataSource = ds.Tables("部署テーブル")
          End Using