[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.