//取图片
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  mm:Variant;
  MyStream,MyStream1:TMemoryStream;
  MyJPG:TjpegImage;
begin
  with ADOQuery1 do
  begin
    close;
    SQL.Text := 'select * from test where ID=1';
    Open;    if not eof then
    begin
      MyStream := TMemoryStream.Create;
      if FieldByName('Pic').IsNull then
      begin
        showmessage('为空');
        Exit;
      end;      TBlobField(FieldByName('Pic')).SaveToStream(MyStream);
      MyStream.Position := 0;
      MyJPG := TjpegImage.Create;
      Image2.Picture.Graphic := nil;
      Image2.Picture.Graphic := MyJPG;
      Image2.Picture.Graphic.LoadFromStream(MyStream);
      MyJPG.Free;
      MyStream.Free;
    end
    else
      showmessage('不存在');
  end;
end;//存图片
procedure TForm1.Button1Click(Sender: TObject);
var
  PicStream:TMemoryStream;
begin
  PicStream := TMemoryStream.Create;
  Image1.Picture.Graphic.SaveToStream(PicStream);
  with ADOQuery1 do
  begin
    SQL.Text := 'insert into test(Pic)values(:Pic1)';
    Parameters.ParamByName('Pic1').LoadFromStream(PicStream,ftBlob);
    ExecSQL;
  end;
  PicStream.Free;
end;现在在取图片显示在image中的时候老是提示invalid class typecast

解决方案 »

  1.   

    请问楼主,
    你使用MySQL4.1以上的版本吗?我们公司使用ADO+MYODBC3.51+MySQL4.1.12用Borland C++Builder来开发,
    开始也是由于多国语言的问题,无法存取MySQL中的二进制数据,现在成功解决了,
    确认一下,你的开发环境是什么?
      

  2.   

    我的MySQL版本是4.1.8,好像能存,但是取的时候出问题了
    TBlobField(FieldByName('Pic')).SaveToStream(MyStream);这句有问题,提示invalid class typecast
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);
    //加载(存)
    var
      sFileName : String;
      function BlobConectToString(Const FileName : String) : String;
      begin
        with TFileStream.Create(FileName, fmOpenRead) do
        try
          SetLength(Result, Size);
          Read(Pointer(Result)^, Size)
        finally
          Free;
        end;
      end;
    begin
      if OpenDialog1.Execute then
      begin
        sFileName := OpenDialog1.FileName;
        ADOQuery1.Edit;
        ADOQuery1.FieldByName('Blobs').AsString := BlobConectToString(sFileName);
        ADOQuery1.Post;
      end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    //显示(取)
    var
      sFileName : String;
      Bs : TADOBlobStream;
    begin
      Bs := TADOBlobStream.Create(TBlobField(ADOQuery1.FieldByName('Blobs')), bmRead);
      try
        sFileName := ExtractFilePath(Application.ExeName) + 'tmpBlob';
        sFileName := sFileName + '.' + ADOQuery1.FieldByName('文件扩展名').AsString;
        Bs.SaveToFile(sFileName);
        OleContainer1.CreateObject(sFileName, False);
      finally
        Bs.Free;
      end;
    end;
      

  4.   

    to 枫叶,出错了
    TADOBlobStream.Create(TBlobField(FieldByName('Pic')), bmRead);提示invliad argument,可能不能转换为TBlobField型,我测了一下该字段,发现该字段类型为ftVarBytes
      

  5.   

    SQL.Text := 'insert into test(Pic)values(:Pic1)';这具有问题吧
    加个query试试
      

  6.   

    Graphic := MyJPG;  这句有问题把因为TGraphic 好象只支持TBITMAP;TICON ,不支持JPEG,这里似乎有问题,建议你转化为BMP 看看
    TEMBMP.ASSIGN(JPEG)
      

  7.   

    to 程序春秋,不是这方面的问题,是一下问题
    TBlobField(FieldByName('Pic')).SaveToStream(MyStream);
    好像是转换为TBlobField时出错