我使用以下代码将图片存到SQL数据库中,但存的速度非常慢,而且原始图片只有500K,存到数据库中数据库体积增加9M多!!请问有什么别的高效的方法?
if Openp.Execute then
begin
try
    Fpicture := Tpicture.Create;
    Fpicture.LoadFromFile(OPENP.FileName );
    fbmp := TBitmap.Create;
    if not (Fpicture.Graphic is Ticon) then
      fbmp.Assign(Fpicture.Graphic)
    else
    begin
      fbmp.Width := Fpicture.Icon.Width;
      fbmp.Height := Fpicture.Icon.Height;
      fbmp.Canvas.Draw(0, 0, Fpicture.Icon);
    end;
    case  ADOQ.State of
      DsInsert:
      begin
        adoQ.FieldByName('pic').Assign(fbmp);
        adoQ.post;
      end;
      DsEdit:
      begin
        ADOQ.FieldByName('pic').Clear;
        adoQ.FieldByName('pic').Assign(fbmp);
        adoQ.post;
      end;
      dsBrowse:
      begin
        ADOQ.Edit;
        ADOQ.FieldByName('pic').Clear;
        adoQ.FieldByName('pic').Assign(fbmp);
        ADOQ.Post;
      end;
      end;
finally
  fbmp.Free;
  Fpicture.Free;
end;

解决方案 »

  1.   

    你可以用DBImage控件的方法直接存入数据库中,应该可以快一些
    MSN:[email protected]
      

  2.   

    用文件流会快一些
    下面是为数据库添加二进制数据(IMAGE类型)的例子,以供参考:
    var
      MemStream: TMemoryStream;
    begin
      if OpenPictureDialog1.Execute then
      begin
        for I := 0 to OpenPictureDialog1.Files.Count - 1 do     //添加文件
        begin
          MemStream := TMemoryStream.Create;              //创建流
          try
            MemStream.LoadFromFile(OpenPictureDialog1.Files[I]);  //将文件读到流中去
            MemStream.Seek(0, soFromBeginning);
            Compress(MemStream);                 //压缩文件
            MemStream.Seek(0, soFromBeginning);
            with ADOQuery2 do
            begin
              Append;
              TBlobField(FieldByName('图片)).LoadFromStream(MemStream);
              ADOQuery2.Post;
            end;
          finally
            MemStream.Free;
          end;
        end;
      end;
      

  3.   

    数据大是因为你把图片转换到bmp才存入的,而且DBImage是不制裁jpg显示的,所以,你要保存bmp的流到数据库,DBImage才能显示,如果要数据小,在装载图片的时候,把bmp转换到jpg,然后,把jpg存入流,保存就好了,显示的时候就把jpg流读出来到TJPEGImage里面,显示到Image.Picture.Bitmap里面