@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

SQLServerに登録した画像データのブラウザへの表示

投稿者投稿内容
tetsuya11
常連さん
会議室デビュー日: 2003/11/08
投稿数: 37
投稿日時: 2006-06-20 21:09

いつもお世話になっております。

Visiual.NET2003(ASP.NET/VB)とSQLServer2000で開発してます。

件名の内容について
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=15974&forum=7
http://www.atmarkit.co.jp/fdotnet/dotnettips/257aspdbbinary2/aspdbbinary2.html
http://www.microsoft.com/japan/msdn/asp.net/tips/DataBaseImage2/
を参考にさせていただいて

------------------------------------------------------------------
表示させたいページ     → Default.aspx
BinaryWriteしているページ  → image.aspx
------------------------------------------------------------------

-Default.aspx-----------------------------------------------------
<Page.load>に以下を記述
Image.ImageUrl = "image.aspx"
------------------------------------------------------------------

-image.aspx-------------------------------------------------------
<Page.load>に以下を記述
[データ取得後]
Response.ClearContent()
Response.ContentType = CType(MyReader.Item("image_type"), String)
Response.Flush()
Response.BinaryWrite(CType(MyReader.Item("image"), Byte()))
Response.End()
------------------------------------------------------------------

と記述し、DBにバイナリデータで登録され
MIMEタイプも"image/gif"と登録されてます。
"Image.aspx"でデータを取得しているのも確認済みです。

しかし、Imageコントロールには「×」と表示されるだけで
登録した画像ファイルが表示されません。

他に設定する必要があるのでしょうか。

ご教授いただけますよう宜しく御願い致します。



burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2006-06-20 23:25
ちなみにMyReaderの元となったSELECT文と対象のテーブルはどのような定義になっていますか?
tetsuya11
常連さん
会議室デビュー日: 2003/11/08
投稿数: 37
投稿日時: 2006-06-21 10:23

burton999さん、返答頂き有難うございます。


テーブル(MyTaBle)の定義は

-My Table------------------------------------------------------------
<定義>
image_id  |  int(4)[主キー]
image_name |  varchar(100)
image_type |  varchar(50)
image    |  image(16)
----------------------------------------------------------------------

この”MyTable”へ”image.aspx”で下記のSelect文を実行しています。

-Select文-------------------------------------------------------------

"SELECT image_type, image FROM MyTable WHERE image_id = @IMAGE_ID"

 ※パラメータ”@IMAGE_ID”は、”Default.aspx”で表示したい
  データレコードを選択後にSessionへ格納し”image.aspx”へ
  引き渡しています。
----------------------------------------------------------------------

宜しく御願い致します。


どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-06-21 10:27
Sessionに表示したいデータレコードを格納した後でimage.aspxを
直接開いてデータは表示できますか?
tetsuya11
常連さん
会議室デビュー日: 2003/11/08
投稿数: 37
投稿日時: 2006-06-21 11:22

どっとねっとふぁんさん、返答頂き有難うございます。

---引用:--------------------------------------------------------
  
  Sessionに表示したいデータレコードを格納した後でimage.aspxを
  直接開いてデータは表示できますか?

----------------------------------------------------------------

早速、試してみましたが、”Default.aspx”の時と同様に
”image.aspx”に「×」と表示されるだけです。


burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2006-06-21 12:22
そうなると、DBに格納されているバイナリデータが怪しいですね。
バイナリデータをそのままファイルに出力すると、gifファイルとして有効ですか?
DBにimageを登録するロジックはどのようになっていますか?
tetsuya11
常連さん
会議室デビュー日: 2003/11/08
投稿数: 37
投稿日時: 2006-06-21 15:59
---引用:--------------------------------------------------------
  
そうなると、DBに格納されているバイナリデータが怪しいですね。
バイナリデータをそのままファイルに出力すると、gifファイルと
して有効ですか?
DBにimageを登録するロジックはどのようになっていますか?
----------------------------------------------------------------

有難うございます。
ご指摘の箇所に関わる辺りを確認したところ
パラメータの定義に誤りがありました。

----------------------------------------------------------------
Dim aryData(txt_family_member.PostedFile.ContentLength) As Byte

cmd.Parameters.Add("@image", System.Data.SqlDbType.Image,
16, "image").Value = aryData
----------------------------------------------------------------

となっていたので

----------------------------------------------------------------
Dim aryData(txt_family_member.PostedFile.ContentLength) As Byte

cmd.Parameters.Add("@image", System.Data.SqlDbType.VarBinary,
2147483647, "image").Value = aryData
----------------------------------------------------------------

と変更したところ、ちゃんと表示されました♪

データ型の指定は、”Image”ではなく”VarBinary”に
しなければいけなかったんですね。。。。

初歩的ななミスですね・・・
お騒がせして申し訳ありませんでした。

また、お世話になることがあるかと思いますので
その際も宜しく御願い致します。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2006-06-21 16:12
型はImage型で問題ないはずです。
問題なのは

引用:

cmd.Parameters.Add("@image", System.Data.SqlDbType.Image,
16, "image").Value = aryData



の第3引数の16だと思います。
これはイメージの最大サイズになるので16byteじゃマズイです。
「SQL Server Enterprise Manager」などのツールでImage型の列定義を見ると
サイズは16byteと表示されますが、これはImageデータそのもののサイズではありません。
NTEXT型やImage型のデータは、行データとは別の領域の格納されます。
なので、16byteの領域に格納されるのは、実際のデータのある位置(ポインタみたいなもの)です。
なので、上記のサイズ指定で16というのが誤りです(多分。。。)
ちなみにSqlParameterクラスにおいてサイズは省略可能です。
省略した場合、サイズはパラメータ値から推論されます。


[ メッセージ編集済み 編集者: burton999 編集日時 2006-06-21 16:17 ]

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