- - PR -
Oracleから取得したBlob型データの表示
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 で発生しました。 追加情報 : 使用されたパラメータが無効です。 と言うエラーが出ました。 これはどういった意味なのでしょうか。 また、どこが間違っていますでしょうか。 以上です。 よろしくお願い致します。 | ||||||||
|
投稿日時: 2006-06-02 21:43
取得したバイナリデータが壊れているんじゃないでしょうか ファイルとして書き出して画像データとして表示できますか? あと固定長のバッファを用意してそちらに流し込んでいますが、 メモリストリームからやるならじかに渡してあげる方法もありますね http://www.atmarkit.co.jp/fdb/rensai/odpdotnet03/odpdotnet03_1.html | ||||||||
|
投稿日時: 2006-06-05 16:06
ご返事が遅れ申し訳ありませんでした。
>取得したバイナリデータが壊れているんじゃないでしょうか >ファイルとして書き出して画像データとして表示できますか? ファイルに表示する事が出来ても、Oracleを経由すると失敗していました。 かるあさんが紹介してくださったサイトを参考にODP.NETを利用する事で実現できました。 大変助かりました。 ありがとうございました。 ※Blobの利用はOleDbや、OracleClientでは無理なのでしょうか?? | ||||||||
|
投稿日時: 2006-06-05 16:27
やったことが無いのでたぶんで申し訳ないですが OleDb は無理っぽいですが OracleClient では出来た気がします。 こんなスレッドがあったけれど、成功したのかどうかわかりませんね C#+OLE Oracle BLOB型を取得できますか? http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=22005&forum=7&start=0 | ||||||||
|
投稿日時: 2006-06-06 11:27
OracleClientで出来るかもしれないのですね。
ODP.NETはインストールが必要だったので、OracleClientで出来れば楽そうです。 時間のある時に試して見ます。 ありがとうございました。 | ||||||||
|
投稿日時: 2006-06-06 22:30
OleDB でやってますけど? 私は、DataAdapter を使い、Fill メソッドで DataTable に読み出しています。 DataReader のリファレンスは読みましたか?バッファに null を渡すと、サイズだけ返ってくるとあります。 なので、GetBytes を2回呼び出します。 1回目はバッファを null にしてサイズだけもらいます。 そのサイズで配列を確保し、2回目の GetBytes でデータを読み出してみてください。 かるあさんが提示されているスレッドでは、読み出すことが出来ていませんが、にゃんぎさんの問題は、読み出しは出来ており、Bitmap 化に失敗しているようです。 その原因として、ストリームのサイズと実際に期待されるサイズが一致していないことが考えられます。
| ||||||||
|
投稿日時: 2006-06-06 23:18
しっ知らなかった…ということはがんばって GetBytes すれば読めないデータは無いってことですかね DataTabel に Fill した場合 Blob は Byte配列 で格納でしょうか? 明日試して見なきゃ… | ||||||||
|
投稿日時: 2006-06-08 21:45
はい。Byte() (VB.NET)です。 DbType.Binaly でマップしています。 |