我用以下的方法实现了存图片
adoquery.SQL.Add('update t1  set pic=:pic where id=1');
adoquery.Parameters.ParamByName('pic').LoadFromStream(strm,ftBlob);
但是取图片……
form1.ADOQuery.SQL.Add('select * from t1   where pic=:pic and id=1');
buf.Position:=0;
TBlobField(ADOQuery.Parameters.ParamByName('pic')).SaveToStream(buf);
这样运行会报内存错?
所报的错误是:Access violation at address 00000000.read of address 00000000.
网上找了很多资料,没有结果,看很多人都是用ADOTable来做。
adoquery怎么实现?

解决方案 »

  1.   

    function TForm1.Save(Img:TImage): Boolean;
    var
       SqlStr: string;
       Stream: TMemoryStream;
       Jpeg: TJpegImage;
    begin
       SqlStr :='INSERT INTO Photo(Image) VALUES (:ImageBin)',
       try
          try
             Stream := TMemoryStream.Create;
             Jpeg := TJPEGImage.Create;
             Jpeg.Assign(Img.Picture.Graphic);
             Jpeg.SaveToStream(Stream);
             Stream.Position := 0;
             AdoQuery.Close;
             AdoQuery.SQL.Text := SqlStr;
             AdoQuery.Parameters.ParamByName('ImageBin').LoadFromStream(Stream, ftBlob);
             AdoQuery.ExecSQL;
             Result := true;
          except
             on E: Exception do
                MessageBox(Handle, PChar(E.Message), '提示', $40);
          end;
       finally
          Stream.Free;
          Jpeg.Free;
       end;
    end;
    function TfrmDeviceImage.Read(Img:TImage): Boolean;
    var
       SqlStr: string;
       szName: string;
       Stream: TMemoryStream;
       Jpeg: TJpegImage;
       i: Integer;
    begin
          Result := false;
          SqlStr := 'SELECT TOP 1 * FROM Photo';
          with AdoQuery do
          begin
     try
               Close;
               SQL.Text:=SqlStr;
               Open
             except
             end;        
       if not IsEmpty then
             begin
                      try
                         Stream := TMemoryStream.Create;
                         TBlobField(FieldByName('Data')).SaveToStream(Stream);
                         Stream.Position := 0;
                         Jpeg := TJpegImage.Create;
                         Jpeg.LoadFromStream(Stream);
                         Img.Picture.Assign(Jpeg);
                      finally
                         Stream.Free;
                         Jpeg.Free;
                      end;
             end;
          end;
    end;
      

  2.   

    谢谢HsWong的帮助,这个问题顺利解决
    如果有像我这样的初学者再看这帖子,请注意,此方法不适用存BMP,jpg与jpeg没有问题。
    给分!结贴!