[プログラム系]続き:ぽすぐれODBC

先日の続き。

まず、C#のコードで画像データをバイナリ化します。

[Code]
//メソッド内で
string fName = "D:\test.jpg";//この部分は任意で
System.IO.FileStream fs = new FileStream(fName, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
byte[] images = br.ReadBytes((int)fs.Length);

このバイト配列がバイナリデータになります。
配列の1要素に8bitでデータ実体が格納されています。
最初はよくわからなくて、配列の中身を全てつなげたり16進数化するのかと思ってたんですがそんなんまったくいらんかった・・・。

ポイントはSQLのパラメータでした。
データソースの型にはめてパラメータで渡すとおとなしく収まる。
Postgres側のカラムはbytea型(ラージオブジェクト)。
ODBC側のTypeはBinary。

[Code]

using System.ODBC;

OdbcConnection conn = new OdbcConnection();
conn.ConnectionString = "接続文字列";
OdbcCommand cmd = new OdbcCommand();
cmd.Connection = conn;
cmd.CommandText = " INSERT INTO テーブル(カラム1,カラム2・・・)" +
                             " VALUES( ? , ? );";
cmd.Parameters.Add("@p1", OdbcType.Int);//主キーとかそんなんを適当に
cmd.Parameters.Add("@p2",OdbcType.Binary);//ここでバイナリ型とする
cmd.Parameters[0].Value = 1;//とりあえず主キー値
cmd.Parameters[1].Value = image;//byte[]型

//で、接続
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();

であら不思議DBのカラムにバイナリが入ってる。
bytea型というのは基本的に"バイナリ文字列"が入るものですから、String型のものも入ってしまうので要注意です。
オブジェクトをそのままINSERT文にぶちこむと、オブジェクトの型のToString()を勝手に取られて追加されてしまいます。
つまりこの場合はバイト配列型の値を渡しているので、"System.Byte[]"という文字列がデータに入ってしまったり・・・。
勿論取り出せません。画像にもなれません。

取り出して再生成は、最初に書いたFileStreamクラスで
[Code]

FileStream fs = ("復元したいデータを保存するフルパス", FileMode.OpenOrCreate,
                                                             FileAccess.Write);
fs.Write();

この方法で画像を上げることができました。
参照は"復元したいデータを保存するフルパス"を仮想ディレクトリ化したURLを取るだけ。

ただ、この方法をやめてしまった理由として
・バイナリ復元のときに必ずStreamを使うので、その度にファイルが実体化してしまう(何回もファイルが生成されてしまう)
・保守性が悪い

ただDBの中身を移し変えればなんでも使えるし、読み出しはともかく書き込みは早いので便利なものだなぁと思います。
あとPostgreSQLにパラメータぶっこめるのを初めて知ったし。
SQLに?書くのはJDBCだけだと思っていたよ・・・。

しかし半分寝ぼけて書いているのでちゃんと動くコード書いているかどうか自信が・・・。
普段インテリセンス使い放題だし間違っていたら後でこっそり直します_| ̄|○
SQLServer版の完璧なコードは「ASP.NETでいってみよう」という本に載っているのでとてもいいと思います。
というかC#でコードビハインドでASP.NETをやるならあの本より良書はない気が・・・。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中