//保存
uses Jpeg;procedure TForm1.SaveToDB(const FileName: string);
begin
  with AdoTable1 do
  begin
    Append;
    FieldByName('PictureName').AsString := ExtractFileName(FileName);
    TBlobField(FieldByName('picture')).LoadFromFiel(FileName);
    Post;
  end;
end;//读
procedure xxxxxx.xxxx;
var 
  MS: TMemoryStream;
  JpegImage: TJpegImage;
begin
  MS := TMemorySteam.Create;
  TBlobField(AdoTable1.FieldByName('Picture')).SaveToStream(MS);
  MS.Position := 0;
  if JPEG格式的图像 then
  begin
    JpegImage := TJpegImage.Create;
    JpegImage.LoadFromStream(MS);
    Image1.Picture.Graphic := JpegImage;
    JpegImage.Free;
  end
  else if 位图 then
    Image1.Picture.Bitmap.LoadFromStream(MS)
  else if 图标 then
    Image1.Picture.Icon.LoadFromStream(Ms);
  MS.Free;
end;

解决方案 »

  1.   

    为了试验到底是怎么一回事情,我将数据在保存之前先保存到一个临时文件中
    然后用LoadFromFile进行保存,结果临时文件一点问题也没有,注意下面的
    dataset是TCllientDataset,如果换成TQuery就一点问题都没有。再读出来的
    时候就出错了,文件少了很多。
                
    sValue := sValue + ':'+ BlobFieldName;
    BlobStream.Clear;
    Dataset.Params.CreateParam(ftBlob,FieldName,ptInput);
    TBlobField(Dataset.parems[0]).SaveToStream(BlobStream);
    BlobStream.SaveToFile('Temp\ZP.JPG');
    BlobStream.Seek(0,0);
    Dataset.SQL.Add(SQLStr + 'VALUES ( ' +sValue + ')');
    Dataset.Params[0].LoadFromFile('Temp\ZP.JPG',ftBlob);
    Dataset.ExecSQL;