2006/07/25

イメージの表示

C# で PostgreSQL にラージオブジェクトとしてイメージを登録・表示する方法です。

Npgsql のヘルプにはファイルからイメージを読み取ってデータベースへ登録したり、データベースからファイルに書き出す方法は書いてありますが、データベースから直接 PictureBox にデータを流し込む方法が書いてありません。 以下のようにすると直接流し込めます。

NpgsqlTransaction transaction = myConnection.BeginTransaction();
LargeObjectManager lom = new LargeObjectManager(myConnection);

LargeObject lo = lom.Open(oid, LargeObjectManager.READWRITE);

Byte[] byteBLOBData = new Byte[0];
byteBLOBData = lo.Read(lo.Size());
MemoryStream stmBLOBData = new MemoryStream(byteBLOBData);
this.pictureBox1.Image = Image.FromStream(stmBLOBData);

lo.Close();
transaction.Commit();

2006/07/03

Npgsql

Windows 上の C# から PostgreSQL に接続する方法はいくつかありますが、そのうちのひとつです。

いままでは PgsqlCom を使っていたのですが、Windows 版の PostgreSQL をインストールしたら Npgsql のセットが一式入っていたのでこれで試してみました。

順調にいっていたのですが日本語データを扱うところで躓いてしまいました。最初にコネクションを張らないといけないのですが、ここで Encoding の指定をしないといけません。PgsqlCom と同じ接続文字列だと日本語のところでこけていて、エラーメッセージに EUC_JP なんたらと出てまきす。あれこれ調べて Encoding にたどり着きました。

同時に読み込ませる文字列も Encoding にあわせておく必要があります。C# からデータを流し込むときは文字コードが UNICODE なのですが、メモ帳などで作っただけだと ANSI になっていますので、こちらも UNICODE にしておく必要があります。

実際には以下のような感じ

NpgsqlConnection con = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=myuser;Database=mydb;Encoding=UNICODE;Password=mypass");

あとは、その他のデータプロバイダと同じ感覚で利用できるのでアプリケーション側のスタイルが統一されてプログラムの見通しがよくなるでしょう、使いこなせれば…

この接続文字列の Server を 192.168.1.1 のようにするとほかのサーバ ( FreeBSD など ) で稼動している PostgreSQL にも繋ぐことができます。C# 側で変更は発生しません、これは便利。

いつもお世話になっているサイト
http://www.postgresql.jp/