☆ADOQueryを使ってImage型を読み書きする。
今までADOでImage型を扱ったことがなく、かなり試行錯誤した結果です(笑)
ネット上でもサンプルがあまりないんですよね。
データベースは、例によって、SQL Server 2005 Express Editionです。
procedure TForm1.FormCreate(Sender: TObject); begin ADOQuery1.Close; ADOQuery1.SQL.Text := 'SELECT IMG FROM dbo.DETAIL'; ADOQuery1.Open; end;
// Image型フィールドに書き込みます。 procedure TForm1.Button1Click(Sender: TObject); var Stream : TADOBlobStream; begin ADOQuery1.Edit; Stream := TADOBlobStream.Create( TBlobField(ADOQuery1.FieldByName('IMG')), bmWrite); Stream.LoadFromFile('c:\aa.jpg'); // BitmapかJpegしか保存しない仕様 Stream.Free; //Postする前に開放しないとエラーになります。 ADOQuery1.Post; end;
// Image型フィールドから読み込みます。 procedure TForm1.Button2Click(Sender: TObject); // Bitmapかどうかを判定します。 function IsBitmap(var Stream: TStream): Boolean; var Bmfh: TBitmapFileHeader; begin Stream.ReadBuffer(Bmfh, sizeof(Bmfh)); Result := (Bmfh.bfType = $4D42); Stream.Position := 0; // 先頭に戻しておきます。 end; var Stream : TADOBlobStream; Pic : TPicture; Jpeg : TJpegImage; begin Stream := TADOBlobStream.Create( TBlobField(ADOQuery1.FieldByName('IMG')), bmRead); Pic:=TPicture.Create; Jpeg := TJpegImage.Create; try Stream.Position := 0; if IsBitmap(TStream(Stream)) then Pic.Bitmap.LoadFromStream(Stream) else begin Jpeg.LoadFromStream(Stream); Pic.Assign(Jpeg); end; Image1.Picture.Assign(Pic); finally Jpeg.Free; Pic.Free; Stream.Free end; end;
| 固定リンク