【VB.NET】PostgreSQL に接続してデータを DataGridView に表示してみる

2018年1月24日VB.NET,開発

おはようございます。

今回はVB.NETでPostgreSQLに接続、データの取得をやってみます。

プログラムは前回のものを流用します。

また、PostgreSQL環境の作成は以下の記事を参考にしてください

スポンサーリンク

Nuget でパッケージをダウンロード

NuGetパッケージ管理の選択

ソリューションエクスプローラーからプロジェクトを選択、右クリックし
「Nuget パッケージの管理」を選択します。

NuGetパッケージ管理画面

Nuget パッケージ管理画面が表示されるので、
検索窓に「npgsql」を入力し、「Npgsql」を選択、インストールボタンをクリックします。

プレビュー画面

プレビュー画面が表示された場合は、「OK」ボタンをクリックします。

ライセンス同意画面

ライセンス同意画面が表示されるので、「同意する」ボタンをクリックします。

出力ビュー

出力ビューに「終了」が表示されれば完了です。

プログラム修正

宣言の追加

ダウンロードしたパッケージを利用するための宣言を追加します。

Form1.vb

Imports Npgsql

初期表示処理の修正

MySQLに接続していた部分を PostgreSQLに接続するように修正し、
MySqlCommand、MySqlDataAdapterもそれぞれ PostgreSQL用のクラスに変更します。

Form1.vb

    ''' <summary>
    ''' フォームロード時の処理
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Using conn As New NpgsqlConnection("Server=localhost; Port=5432; User Id=USER01;Password=USER01;Database=DB01")

            ' データベースオープン
            conn.Open()

            ' 種別コンボボックスの内容をデータベースから取得して設定
            ' データを取得
            Dim cmd As NpgsqlCommand = New NpgsqlCommand("SELECT * FROM MSTKIND", conn)
            Dim da As NpgsqlDataAdapter = New NpgsqlDataAdapter(cmd)
            Dim dt As DataTable = New DataTable()
            da.Fill(dt)

            ' コンボボックスに値を設定
            Dim sources As List(Of Kind) = New List(Of Kind)
            Dim k As Kind = New Kind()
            k.KindCd = ""
            k.KindName = "指定なし"
            sources.Add(k)
            For Each row As DataRow In dt.Rows
                k = New Kind()
                k.KindCd = row("KIND_CD").ToString()
                k.KindName = row("KIND_NAME").ToString()
                sources.Add(k)
            Next

            Me.cmbKind.DataSource = sources
            Me.cmbKind.DisplayMember = "KindName"

            ' データベースクローズ
            conn.Close()

        End Using

    End Sub

検索処理の修正

初期表示と同様、接続の処理とMysqlのクラスをPostgreSQL用に変更します。

Form1.vb

    ''' <summary>
    ''' 検索処理
    ''' </summary>
    Private Sub search()

        Using conn As New NpgsqlConnection("Server=localhost; Port=5432; User Id=USER01;Password=USER01;Database=DB01")

            ' データベースオープン
            conn.Open()

            ' 検索条件を指定してデータを取得
            Using con As New DataContext(conn)
                Dim searchName As String = txtName.Text
                Dim searchKind As String = CType(cmbKind.SelectedValue, Kind).KindCd

                ' 種別マスタ取得

                ' 種別コンボボックスの内容をデータベースから取得して設定
                ' データを取得
                Dim cmd As NpgsqlCommand = New NpgsqlCommand("SELECT * FROM MSTKIND", conn)
                Dim da As NpgsqlDataAdapter = New NpgsqlDataAdapter(cmd)
                Dim dt As DataTable = New DataTable()
                da.Fill(dt)
                Dim kindList As List(Of Kind) = New List(Of Kind)
                Dim k As Kind = New Kind()
                For Each row As DataRow In dt.Rows
                    k = New Kind()
                    k.KindCd = row("KIND_CD").ToString()
                    k.KindName = row("KIND_NAME").ToString()
                    kindList.Add(k)
                Next

                ' 猫一覧取得
                Dim Sql As String = "SELECT * FROM TBLCAT"
                Dim where As String = ""
                If (searchName <> "") Then

                    where = " WHERE NAME LIKE '" + searchName + "%'"
                End If
                If (searchKind <> "") Then
                    If (where <> "") Then
                        where += " AND"
                    Else
                        where = " WHERE"
                    End If
                    where += " KIND_CD = '" + searchKind + "'"
                End If

                Sql += where

                cmd = New NpgsqlCommand(Sql, conn)
                da = New NpgsqlDataAdapter(cmd)
                dt = New DataTable()
                da.Fill(dt)

                ' データグリッドビューに設定
                Dim i As Integer = 0
                dgvCat.Rows.Clear()
                For i = 0 To dt.Rows.Count() - 1

                    ' 行追加
                    dgvCat.Rows.Add()

                    ' No(プライマリなので編集不可)
                    Dim no = New DataGridViewTextBoxCell()
                    no.Value = dt.Rows(i)("No")
                    dgvCat(0, i) = no
                    dgvCat(0, i).ReadOnly = True

                    ' 名前
                    Dim name = New DataGridViewTextBoxCell()
                    name.Value = dt.Rows(i)("Name")
                    dgvCat(1, i) = name

                    ' 性別
                    Dim sex = New DataGridViewComboBoxCell()
                    sex.Items.AddRange({"♂  ", "♀  "})
                    sex.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox
                    dgvCat(2, i) = sex
                    dgvCat(2, i).Value = dt.Rows(i)("Sex")

                    ' 年齢
                    Dim age = New DataGridViewTextBoxCell()
                    age.Value = dt.Rows(i)("Age")
                    dgvCat(3, i) = age

                    ' 種別
                    Dim kind = New DataGridViewComboBoxCell()
                    kind.DataSource = kindList
                    kind.DisplayMember = "KindName"
                    kind.ValueMember = "KindCd"
                    kind.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox
                    dgvCat(4, i) = kind
                    dgvCat(4, i).Value = dt.Rows(i)("Kind_Cd")

                    ' 好物
                    Dim favorite = New DataGridViewTextBoxCell()
                    favorite.Value = dt.Rows(i)("Favorite")
                    dgvCat(5, i) = favorite

                Next

            End Using

            ' データベースクローズ
            conn.Close()

        End Using
    End Sub

 

起動してみる

起動後の画面

種別にデータが設定されました。

検索結果

検索ボタン押下でデータがグリッドに表示されました。

まとめ

PostgreSQLもほとんど変更無しで対応することができました。

実は EntityFrameworkを利用する予定だったのですが、
依存ファイルが見つからないエラーで嵌ってしまったので断念。

いずれ時間のある時にでも。。

ではでは。

スポンサーリンク


関連するコンテンツ

2018年1月24日VB.NET,開発PostgreSQL,VB.NET,サンプルプログラム

Posted by doradora