掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
SQLのBLOB型へ画像データを登録更新したいのですが (ID:45117)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
yTakeです。今回はSQLでBLOB型データの更新方法について、質問させて下さい。 既に登録されているレコード上のBLOB型データへ画像を登録・更新する事を考えます。 単純に、UPDATE分で、WHERE句でレコードを限定した上で、BLOB型のフィールドに画像データファイル名を渡すだけではダメでした。 当Q&Aの過去や他の参考サイトを参照して、下記2案を考えましたが、いずれもうまく行っていません。 案1: bmp : TBitMap; stream : TStream; stream := IBQuery2.CreateBlobStream( IBQuery2.FieldByName( 'image' ), bmWrite ); bmp := TBitMap.Create(); とした上で、 sql_cmd := 'SELECT * from TBL where ID = ''' + id + ''' and NAME = ''' + name + ''''; IBQuery2.SQL.Text := sql_cmd; IBQuery2.Open(); if IBQuery2.IsEmpty = True then Showmessage( 'Empty' ) else begin cnt := 0; while IBQuery2.Eof = False do begin IBQuery2.Edit(); bmp.LoadFromFile( portrait_file ); bmp.SaveToStream( stream ); IBQuery2.Post(); inc( cnt ); end; end; としてみましたが、access violationです。但しこれは、SELECT文の応答が無限ループになってしまっている為の様です。このSELECT文自体は、他の箇所で用いている場合と全く同じで、正しくSELECT出来ています。なぜ、ここではその応答が無限ループになってしまうのでしょう?他のやり方でレコードを限定するのでしょうか? 案2: bmp : TBitMap; blobStream : TIBBlobStream; blobStream := TIBBlobStream.Create(); blobStream.Database := IBDatabase2; // blobStream. ここで、テーブルを指定したい blobStream.FieldAddress( 'PORTRAIT' ); とした上で、 if IBQuery2.IsEmpty = True then ShowMessage( 'Empty' ) else begin cnt := 0; while IBQuery2.Eof = False do begin IBQuery2.Edit(); bmp.LoadFromFile( portrait_file ); bmp.SaveToStream( blobStream ); IBQuery2.Post(); end; end; とすれば良いのかな?と思いますが、blobStreamのCreate時点で引数が何もないので、データベースやテーブルの指定ができません。その後で個別に設定しようと思いましたが、テーブルの指定が分かりません。 ここでも、案1の様なSELECT分の応答の無限ループ問題が発生するかもしれませんが、、、 インターネット上の例とは、なぜか引数の指定が違っているので、苦慮しています。 いずれの案も"try finally"節で、ストリームを開放しています。 いずれがより良いのか?又、エラーの回避方法に何か示唆を頂ければ幸いです。 環境は、 Windows7 (bootcamp), Embedded Firebird v2.5, DELPHI XE3 + IBX, です。 よろしくお願い致します。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.