- PR -

Oracleから取得したBlob型データの表示

投稿者投稿内容
にゃんぎ
常連さん
会議室デビュー日: 2004/03/31
投稿数: 35
投稿日時: 2006-06-02 21:34
お世話になっております。

早速ですが、質問です。

OracleにBlob型フィールドを持つテーブルを作成し、C#から画像の登録・取得を行っております。

Webの情報を見ながら、画像の登録、取得はうまくいきました。
しかし、取得後の画像表示でつまづいています。

■ソース
public void BlobGetter(System.Windows.Forms.PictureBox pb)
{
OracleConnection cnn =
new OracleConnection(
"user id=test;password=test;data source=test");

String strSql =
"select IMG from BLOBTEST where CODE='bbb'";

OracleCommand cmd = new OracleCommand(strSql, cnn);
cnn.Open();

OracleDataReader dr = cmd.ExecuteReader();
System.IO.MemoryStream ms = null;
if(dr.Read())
{
byte [] byteArray = new byte[32767];
long numBytesRead =
dr.GetBytes(0, 0, byteArray, 0, 32767);
ms = new System.IO.MemoryStream(byteArray);
pb.Image = new Bitmap(ms); //ここでエラー
}
cnn.Close();
}

上記メソッドを実行すると
'System.ArgumentException' のハンドルされていない例外が system.drawing.dll で発生しました。

追加情報 : 使用されたパラメータが無効です。

と言うエラーが出ました。
これはどういった意味なのでしょうか。
また、どこが間違っていますでしょうか。

以上です。
よろしくお願い致します。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-06-02 21:43
引用:

にゃんぎさんの書き込み (2006-06-02 21:34) より:

これはどういった意味なのでしょうか。
また、どこが間違っていますでしょうか。


取得したバイナリデータが壊れているんじゃないでしょうか
ファイルとして書き出して画像データとして表示できますか?

あと固定長のバッファを用意してそちらに流し込んでいますが、
メモリストリームからやるならじかに渡してあげる方法もありますね
http://www.atmarkit.co.jp/fdb/rensai/odpdotnet03/odpdotnet03_1.html
にゃんぎ
常連さん
会議室デビュー日: 2004/03/31
投稿数: 35
投稿日時: 2006-06-05 16:06
ご返事が遅れ申し訳ありませんでした。

>取得したバイナリデータが壊れているんじゃないでしょうか
>ファイルとして書き出して画像データとして表示できますか?

ファイルに表示する事が出来ても、Oracleを経由すると失敗していました。

かるあさんが紹介してくださったサイトを参考にODP.NETを利用する事で実現できました。
大変助かりました。
ありがとうございました。

※Blobの利用はOleDbや、OracleClientでは無理なのでしょうか??
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-06-05 16:27
引用:

にゃんぎさんの書き込み (2006-06-05 16:06) より:

※Blobの利用はOleDbや、OracleClientでは無理なのでしょうか??


やったことが無いのでたぶんで申し訳ないですが
OleDb は無理っぽいですが OracleClient では出来た気がします。

こんなスレッドがあったけれど、成功したのかどうかわかりませんね
C#+OLE Oracle BLOB型を取得できますか?
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=22005&forum=7&start=0
にゃんぎ
常連さん
会議室デビュー日: 2004/03/31
投稿数: 35
投稿日時: 2006-06-06 11:27
OracleClientで出来るかもしれないのですね。

ODP.NETはインストールが必要だったので、OracleClientで出来れば楽そうです。

時間のある時に試して見ます。
ありがとうございました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-06-06 22:30
引用:

にゃんぎさんの書き込み(2006-06-05 16:06)より:

※Blobの利用はOleDbや、OracleClientでは無理なのでしょうか??


 OleDB でやってますけど?
 私は、DataAdapter を使い、Fill メソッドで DataTable に読み出しています。

 DataReader のリファレンスは読みましたか?バッファに null を渡すと、サイズだけ返ってくるとあります。
なので、GetBytes を2回呼び出します。
1回目はバッファを null にしてサイズだけもらいます。
そのサイズで配列を確保し、2回目の GetBytes でデータを読み出してみてください。

 かるあさんが提示されているスレッドでは、読み出すことが出来ていませんが、にゃんぎさんの問題は、読み出しは出来ており、Bitmap 化に失敗しているようです。
その原因として、ストリームのサイズと実際に期待されるサイズが一致していないことが考えられます。
コード:
例
if (dr.Read()) {
    long numBytesRead = dr.GetBytes(0, 0, null, 0, 0);
    byte [] byteArray = new byte[numBytesRead];
    numBytesRead = dr.GetBytes(0, 0, byteArray, 0, numBytesRead);
    using (ms = new System.IO.MemoryStream(byteArray)) {
        pb.Image = new Bitmap(ms);
        ms.Close();
    }
}

かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-06-06 23:18
引用:

Jittaさんの書き込み (2006-06-06 22:30) より:

OleDB でやってますけど?
私は、DataAdapter を使い、Fill メソッドで DataTable に読み出しています。

 DataReader のリファレンスは読みましたか?バッファに null を渡すと、サイズだけ返ってくるとあります。
なので、GetBytes を2回呼び出します。
1回目はバッファを null にしてサイズだけもらいます。
そのサイズで配列を確保し、2回目の GetBytes でデータを読み出してみてください。


しっ知らなかった…ということはがんばって
GetBytes すれば読めないデータは無いってことですかね

DataTabel に Fill した場合 Blob は Byte配列 で格納でしょうか?
明日試して見なきゃ…
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-06-08 21:45
引用:

かるあさんの書き込み(2006-06-06 23:18)より:

DataTabel に Fill した場合 Blob は Byte配列 で格納でしょうか?


はい。Byte() (VB.NET)です。
DbType.Binaly でマップしています。

スキルアップ/キャリアアップ(JOB@IT)