表结构:
CREATE TABLE [pt] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[p] [image] NULL 
) GO注:q :ADOQuery.
保存图片到数据库中
procedure TForm1.savepictureClick(Sender: TObject);
var
  s :string;
  ms : TMemoryStream;
  jpeg : TJPEGImage;
begin
  s := 'delete from pt where 1=1 ';
  q.Close;
  q.SQL.Clear;
  q.SQL.Add(s);
  q.ExecSQL;
  ms := TMemoryStream.Create;
  jpeg := TJPEGImage.Create;
  try
    jpeg.Assign(cxImage2.Picture.Bitmap);
    jpeg.SaveToStream(ms);
    ms.Position := 0;
    s := 'insert into pt(p) values(:p)';
    q.Close;
    q.SQL.Clear;
    q.SQL.Add(s);
    q.Parameters.ParamByName('p').LoadFromStream(ms,ftBlob);
    //q.Parameters.ParamByName('p').Assign(cxImage2.Picture.Bitmap);
    q.ExecSQL;
    self.Caption := 'save';
  finally
    FreeAndNil(ms);
    FreeAndNil(jpeg);
  end;
end;
读出图片
procedure TForm1.readpictureClick(Sender: TObject);
var
  s,s1 : string;
  ms : TMemoryStream;
  jpeg : TJPEGImage;
begin
  //在添加的时候我先删除所有,只会存在一条记录所以直接取了。
  s := 'select * from pt ';
  with q do
  begin
    close;
    SQL.Clear;
    sql.Add(s);
    open;
  end;
  ms := TMemoryStream.Create;
  jpeg := TJPEGImage.Create;
  try
{    TBlobField(q.FieldByName('p')).SaveToStream(ms);
    ms.Position := 0;
    jpeg.SaveToStream(ms);
    cxImage1.Picture.Bitmap.Assign(jpeg);
}
    //使用这个方法产生的图片只有0字节
    s1 := 'c:\jzl.jpg';
    TBlobField(q.FieldByName('p')).SaveToFile(s1);
    cxImage1.Picture.LoadFromFile(s1);     //这句会出错  finally
    FreeAndNil(ms);
    FreeAndNil(jpeg);
  end;
end;当读取图片时出错:
---------------------------
Project1
---------------------------
JPEG error #42.
---------------------------
确定   
---------------------------
请大家给看看。

解决方案 »

  1.   

    procedure TForm1.Button2Click(Sender: TObject); //讀取圖片過程 
    var 
    mStream:TMemoryStream; 
    JpgFile:TjpegImage; 
    begin 
    if not ADOQuery1.FieldByName('photo').IsNull then begin ; 
    mStream:=TMemoryStream.Create ; 
    JpgFile:=TjpegImage.Create ; 
    TBlobField(ADOQuery1.FieldByName('photo')).SaveToStream(mStream);  //顯示的轉換為BlobFiled並保存至內存流 
    mStream.Position :=0; 
    jpgfile.LoadFromStream(MStream); 
    image2.Picture.Assign(JpgFile); 
    end 
    else begin 
    image2.Picture :=nil; 
    end; 
    end;
      

  2.   

    ms : TBlobStream;用这个看看
      

  3.   

    to :xiaotao2004(小陶)
    我试过了。F7可以走完。但是一回到界面还是会出错。
    ---------------------------
    Project1
    ---------------------------
    JPEG error #42.
    ---------------------------
    确定   
    ---------------------------
    to:Mrkang(谁比我菜我不愿意)
    我试过了。也在网上,CSDN上找了以前的帖子。目前还没有解决。
      

  4.   

    存储图片的代码:
     //存储图片
       MyJPEG := TJPEGImage.Create;
       try
        with MyJPEG do
        begin
          Assign(Image1.Picture.Graphic);
          MS:=TMemoryStream.create;
          SaveToStream(MS);
          MS.Position:=0;
          TBlobField(FieldbyName('图片')).LoadFromStream(MS);
        end;
       finally
        MyJPEG.Free;
       end;
       try
       Post;
       except
       showmessage('数据无法提交');读取图片的代码:
     if ef_adoquery.RecordCount<>0 then
            begin
            try
              tempstream:=TmemoryStream.Create();
              //将图像字段保存到流中
              TBlobField(mainform.ef_ADOQuery.FieldByName('图片')).SaveToStream(tempstream);
              ////给留定位
              tempstream.Position:=0;  
              //省城临时image
              tempjpeg:=TJPEGImage.Create;
              //存留信息
              tempjpeg.LoadFromStream(tempstream);
              //显示图像
              Image1.Picture.Bitmap.Assign(tempjpeg);
            finally
              tempstream.Free;
              tempjpeg.Free;
            end;
            end;
      

  5.   

    JPEG error #42.
    可能由于你用的不是JPG格式的,我刚才试了下,用JPG格式就不报这错,BMP格式试了下就报错,
      

  6.   

    to :xiaotao2004(小陶)
    我用的也是jpg文件。
    文件的类型是:JPEG(这个信息是鼠标移动图片上时显示的。)
    我用的是xp系统。就是这里的图片。
    C:\WINDOWS\Help\Tours\htmlTour
      

  7.   

    过去我做过类似的应用,我的方法是直接将jpeg图片数据生成进sql语句中一起提交。
    比如:
    q.sql.text := 'insert into pt (p) values (0x'+BufferToHexString(buffer)+')';自己写一个BufferToHexString,将一块Buffer转成16进制数字字符串。这块buffer可以用TStringStream代替,还可以用zlib的TCompressionStream压缩后传输。经过实际应用经验,压缩后百多k的数据用这个方法没有问题。读取的话用网上泛滥的那种解决方案也就是用TBlobStream即可。
      

  8.   

    自己解决了:
    procedure TForm1.BitBtn1Click(Sender: TObject);
    var
      testStream:TMemoryStream;
    begin
      //保存图片到SQL SERVER 2000 数据库中 格式为 .JPG
      if not Assigned(Image1.Picture.Graphic) then exit;
      try
        with ADOQuery1 do
        begin
          Close;
          SQL.Clear;
          SQL.Add('delete from test');
          ExecSQL;      testStream := TMemoryStream.Create;
          Image1.Picture.Graphic.SaveToStream(testStream);      Close;
          SQL.Clear;
          SQL.Add('Insert into test (photo) values (:photo)');
          Parameters.ParamByName('photo').LoadFromStream(testStream,ftBlob);
          ExecSQL;
        end;
      finally
        testStream.Free;
      END;
    end;
      

  9.   

    procedure TForm1.Button5Click(Sender: TObject);
    var
      mStream:TMemoryStream;
      JpgFile:TjpegImage;
    begin
      //读取数据库中的.JPG图片显示在界面上
      with ADOQuery1 do
      begin
        Close;
        SQL.Clear;
        SQL.Add('select * from test ');
        Open;
        if not FieldByName('photo').IsNull then begin ;
        mStream:=TMemoryStream.Create ;
        JpgFile:=TjpegImage.Create ;
        TBlobField(FieldByName('photo')).SaveToStream(mStream);
        mStream.Position :=0;
        jpgfile.LoadFromStream(MStream);
        image2.Picture.Assign(JpgFile);
        end
        else begin
          image2.Picture :=nil;
        end;
      end;
    end;