20080228 Visual Basic 2008 で PostgreSQL

[turbolinux11server.PostgreSQL]-[LAN.or.WAN]-[Framework2]-[Windows Vista.XP.2K.Me]

これが現在の標準的運用系図です。(世間ではまだWindowsMeも現役なんです。)

Windowsクライアントから PostgreSQL に接続する手段は去年ぐらいまでは[PostgreSQL ODBC Driver]によりADODBアクセスが主流でしたが、
1台づづWindowsクライアントへインストールしなければならない手間がありシステムを仕立てるのが大変です。
最近ではインストールが不要なことから、Npgsql によるアクセスにシフトしつつあります。
しかしながら Npgsql は特に Postgresql7以前で文字エンコード問題が出ることも多く、
今でも歴史ある[PostgreSQL ODBC Driver]のほうが信頼出来るように思います。
[PostgreSQL ODBC Driver]の現在のバージョンは(libpqxx-2.6.9)で活動も活発のようですが、
turbolinux11server には、PostgreSQL 8.2 が採用されており、Npgsql での不具合は遭遇しなくなりました。

ここで Visual Basic 2008 から Npgsql を介して PostgreSQL にアクセスする基本的方法を一部紹介しておきます。
通常使用であれば下記で充分実用的ですので参考にしてください。
(WindowsVistaクライアントにインストールしたPostgreSQLからもマシンのIPかドメインのところに localhost と記載すればそのまま使えます。)

下記ソースコードはフォーム1にコマンドボタンを2個配置しただけの簡単なプログラムです。
PostgreSQL にアクセスするために非常に多くのコードを記述される方がいますが読みづらく問題も起こしますから無駄なことです。
保守する自分の為に簡単明瞭に少なくコードを記述してください。


Public Class Form1

    '予め、http://www.postgresql.jp/document/NPGSQL/ などから Npgsql1.0-bin-ms2.0.zip をダウンロードして解凍。
    '沢山のフォルダやファイルがありますが、通常使用で必要なのは「Npgsql.dll」と「Mono.Security.dll」だけです。
    '予め適当なフォルダ(C:\npgsql)とかに「Npgsql.dll」と「Mono.Security.dll」だけをコピー保存、
    '注意:上記フォルダが必要なのはプログラム開発マシンだけ。

    'VisualBASIC 2008ソリューションエクスプローラの左から2個目のアイコンをクリック、
    '参照設定を左クリック、参照の追加で「参照」タグをクリックし、
    '適当なフォルダ(C:\npgsql)に保存されている「Npgsql.dll」を指定し[OK]、これだけで使えます。
    '(「Mono.Security.dll」は「Npgsql.dll」を指定することで自動添付します。)
    '注意:ODBCデータソースDSNなどの設定など一切不要です。

    'プログラムをビルドするとbinフォルダに「Npgsql.dll」と「Mono.Security.dll」がコピーされますので、
    'binフォルダが開発したプログラムパッケージです。
    '(binフォルダをzipしてmail納品します。インストーラ形式には素人以外は嫌煙するのでしません。好きなところに解凍して、好きなところにショートカットを置いてもらいます。)

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        '簡単なコマンドを実施する一例

        '???.???.???.???は、turbolinux11server マシンのIPかドメイン
        Dim is_Connection As String = _
                "Server=???.???.???.???;" & _
                "Port=5432;" & _
                "Database=sampledb;" & _
                "User Id=dbman;" & _
                "Password=********;" & _
                "Encoding = UNICODE;" & _
                "CommandTimeout=100;"

        'Dim is_SQL As String = "select version();"
        'Dim is_SQL As String = "notify command1;"
        Dim is_SQL As String = "select count(uniqk) from sampletb;" '行末";"は特にいりません。

        'その他、is_SQLにinsert,updateなど、目的のSQL文を代入して実行してください。

        Dim Npgsql_Connection As Npgsql.NpgsqlConnection = New Npgsql.NpgsqlConnection(is_Connection)

        Dim GetData As String

        Try
            Npgsql_Connection.Open()

            Dim Npgsql_Command As Npgsql.NpgsqlCommand = New Npgsql.NpgsqlCommand(is_SQL, Npgsql_Connection)

            Dim Npgsql_Reader As Npgsql.NpgsqlDataReader = Npgsql_Command.ExecuteReader()

            GetData = "-2"
            While Npgsql_Reader.Read()
                GetData = Npgsql_Reader(0).ToString
            End While

        Catch ex As Exception
            Debug.WriteLine(ex.Message)
            GetData = "-2"
        Finally
            Npgsql_Connection.Close()
        End Try

        MessageBox.Show("GetData=" & GetData)

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        '一度に多量のレコードを得るときの一例

        Dim is_Connection As String = _
                "Server=???.???.???.???;" & _
                "Port=5432;" & _
                "Database=sampledb;" & _
                "User Id=dbman;" & _
                "Password=********;" & _
                "Encoding = UNICODE;" & _
                "CommandTimeout=100;"

        Dim is_SQL As String = "select * from sampletb;"

        Dim Npgsql_Connection As Npgsql.NpgsqlConnection = New Npgsql.NpgsqlConnection(is_Connection)

        Npgsql_Connection.Open()

        Dim Npgsql_DataSet As DataSet = New DataSet

        Using Npgsql_DataAdapter As Npgsql.NpgsqlDataAdapter = New Npgsql.NpgsqlDataAdapter(is_SQL, Npgsql_Connection)
            Npgsql_DataAdapter.Fill(Npgsql_DataSet, "sampletb") 'VBはSQLストリングから憶測できない。
        End Using

        Npgsql_Connection.Close()

        'グリッドに直接データソースにすれば手っ取り早いがSQLサーバーやOracleなどとの相互移植性が悪いので
        '2次元配列Listとか中間変数に代入しておくと扱いやすく、プログラム寿命も永くなる。

        Dim id_DataTable As DataTable = Npgsql_DataSet.Tables("sampletb")

        For Each id_DataRow As DataRow In id_DataTable.Rows
            For Each id_DataCol As DataColumn In id_DataTable.Columns
                Debug.WriteLine("GetData=" & id_DataRow(id_DataCol.ColumnName).ToString)
                'ココで、Dim SampleArray(列,行) as objectへid_DataRow(id_DataCol.ColumnName)を代入
            Next
        Next

        Npgsql_DataSet.Clear()

    End Sub

End Class

one.