在MYSQL的表中我将PIC字段设成longblog类型,当表为空时TADOQuery控件显示PIC字段为TblobField类型,当PIC字段中存在图片数据时,再看PIC字段就变成了TvarBytesField类型了,然后执行程序就显示数据类型不匹配。
我用的TBlobStream来存的图片。请各位大侠指点。

解决方案 »

  1.   

    保存
    TADOQuery.Edit;
    TblobField(TADOQuery.FieldByName('FieldName')).LoadFromFile('文件名');
    TADOQuery.Post;
    读取
    TblobField(TADOQuery.FieldByName('FieldName')).SaveToFile('文件名');
      

  2.   

    图片的类型是什么?如果是BMP,可以直接存读,如果是Jpg,需要用流来实现。相关贴子:http://topic.csdn.net/u/20070502/22/913475dd-7a29-4df2-99e2-b8a2c08df60d.htmlhttp://topic.csdn.net/u/20080123/16/a1a4109e-8cef-40bf-be5a-f9edd578d09d.html
    希望对你有所帮助!
      

  3.   

    保存 
    TADOQuery.Edit; TblobField(TADOQuery.FieldByName('FieldName')).LoadFromFile('文件名'); 
    或者
    filestream := tfilestream.create(filename,fmopenread);
    TblobField(TADOQuery.FieldByName('FieldName')).LoadFromStream(filestream);
    TADOQuery.Post; 读取 
    TblobField(TADOQuery.FieldByName('FieldName')).SaveToFile('文件名'); 
    或者
    memorystream := tmemorystream.create;
    TblobField(TADOQuery.FieldByName('FieldName')).SaveToStream(memorystream);
    jpg := tjpegimage.create;
    jpg.loadfromstream(memorystream);
      

  4.   

    谢谢楼上各位大哥。
    我保存的是JPG图片,现在已经可以写入数据库了,可是在读取时用SaveToFile()是却是输出的0字节的文件。
     
     if (eJGRYF.Qry1.FieldByName('GONGWY_PHOTO_FILE').IsNull) then
      begin
        eJGRYF.Img1.Picture := nil;
        exit;
      end;
        TBlobField(eJGRYF.Qry1.FieldByName('gongwy_photo_file')).SaveToFile('C:\TEST.JPG'); //运行这句时提示“Invalid Class Typecast”
        eJGRYF.img1.Picture.LoadFromFile('C:\TEST.JPG');
      

  5.   

    用流的方式处理也不行,显示同样的错误
    procedure ShowPhoto;
    var
      jpg : TJpegImage;
      ImgFile : string;
      srm:TStringStream;
    begin
      ImgFile := ExtractFilePath(Application.ExeName)+'\Photo\'
                 + eJGRYF.Qry1.FieldByName('gongwy_id').AsString +'.jpg';
      try
      srm:=TStringStream.create('');
      with eJGRYF.Qry1 do
        begin
          Close;
          SQL.Clear;
          SQL.Text:='Select * From gongwy_photo Where ( GONGWY_ID = '''
                    + DM.GWYQ.FieldByName('GONGWY_ID').AsString + ''')' ;
          Open;
          First;
          TBlobField(FieldByName('GONGWY_PHOTO_FILE')).SaveToStream(srm);//这里还是显示“Invalid Class Typecast”的错误
          srm.position:=0;
          eJGRYF.img1.picture.graphic.loadfromstream(srm);
        end;
      finally
        srm.free;
        eJGRYF.img1.picture.SaveToFile(ImgFile);
      end;
    是不是我写入图片的程序不对呢?但确实写进去了,用MYSQL管理工具都能正常显示
      

  6.   


    试一下这样var
      jpg : TJpegImage;
      ImgFile : string;
      srm:TStringStream;
      blob:TStream;
    begin
      ImgFile := ExtractFilePath(Application.ExeName)+'\Photo\'
                 + eJGRYF.Qry1.FieldByName('gongwy_id').AsString +'.jpg';
      try
      srm:=TStringStream.create('');
      with eJGRYF.Qry1 do
        begin
          Close;
          SQL.Clear;
          SQL.Text:='Select * From gongwy_photo Where ( GONGWY_ID = '''
                    + DM.GWYQ.FieldByName('GONGWY_ID').AsString + ''')' ;
          Open;
          First;
          blob:=eJGRYF.Qry1.CreateBlobStream(FieldByName('GONGWY_PHOTO_FILE'),bmRead);
          blob.Seek(0,soFromBeginning);
          Showmessage(inttostr(blob.Size));
          //TBlobField(FieldByName('GONGWY_PHOTO_FILE')).SaveToStream(srm);//这里还是显示“Invalid Class Typecast”的错误
          //srm.position:=0;
          //eJGRYF.img1.picture.graphic.loadfromstream(srm);
        end;
      finally
        srm.free;
        eJGRYF.img1.picture.SaveToFile(ImgFile);
      end;
    end;
      

  7.   

    谢谢各位大哥,我终于找到问题了,实现方法都没问题,原来是我将图片用  image optimizer  压缩过的,如果没有压缩过的图片就完全可以,但压缩后的图片在显示时就出问题了。因为数据库中要存入大量的人员照片,所以限制在10K以内。现在我散分给大家,但如果大家能帮我解决压缩过图片问题,将不胜感激