//小弟根据下面的东东,实现了显示access中的jpg图片了,但是怎么实现往库中添加啊!谢谢!
  
在access中我们存储图片信息所用到的类型是OLE.要显示图片我们需要使用stream,这就需要知道唯一标识图像的文件头.
    所有的图片文件(格式)都有用来唯一的标识图像的文件头。JPG图片文件以所谓的SOI标记开始,该标记的十六进制值是$FFD8。
    MS Access把连接的OLE对象的路径作为对象定义的一部分存储在OLE对象字段中。因为OLE对象的存储定义没有被文档化(!?这直接来自于MS),所以没有办法知道真正的图像数据被写之前能得到什么。      分两个部分考虑这个问题。第一:我们需要找到'FFD8'并从那儿开始读取图像。第二:'FFD8'不可能总在文件的同一个位置。结论:我们需要一个函数,返回Access数据库中存储为OLE对象的JPG文件的SOI标记的位置。
    提供了Blob类型字段后,我们的函数应返回ADOBlobStream中'FFD8'字符串的位置。ReadBuffer(读缓冲区)从流中一个字节一个字节的读取数据。对ReadBuffer的每个调用都会一个字节一个字节的移动流的位置。当两个字节一起引出SOI标记时,函数返回流的位置。这是这个函数:
function JpegStartsInBlob(PicField:TBlobField):integer;  
 var    bS     : TADOBlobStream;   
 buffer : Word;    hx     : string;  
 begin    
Result := -1;  
  bS := TADOBlobStream.Create(PicField, bmRead);  
  try    
 while (Result = -1) and (bS.Position + 1 < bS.Size) do   
  begin   
   bS.ReadBuffer(buffer, 1);   
   hx:=IntToHex(buffer, 2);   
   if hx = 'FF' then begin     
  bS.ReadBuffer(buffer, 1);  
     hx:=IntToHex(buffer, 2);  
    if hx = 'D8' then Result := bS.Position - 2 
      else if hx = 'FF' then     
        bS.Position := bS.Position-1;    
  end; //if    
 end; //while   
  finally    
  bS.Free     
end;  //try  
 end;一旦我们有了SOI标记的位置,我们就能使用它在ADOBlob流中找到图片的位置。    
 uses jpeg;   
  ...    
 procedure TForm1.btnShowImageClick(Sender: TObject);  
   var    
  bS  : TADOBlobStream; 
     Pic : TJpegImage;    
 begin     
 bS := TADOBlobStream.Create(AdoTable1Picture, bmRead);   
   try  
     bS.Seek(JpegStartsInBlob(AdoTable1Picture),soFromBeginning); 
      Pic:=TJpegImage.Create; 
      try        
       Pic.LoadFromStream(bS);     
     ADOImage.Picture.Graphic:=Pic;     
  finally     
   Pic.Free;     
  end;     
 finally     
  bS.Free    
  end;    
 end;  
 运行工程,OK!注:在真正的代码程序中,我们会在TDataSet的AfterScroll事件中加入代码用于从当前行中读取和显示图像(它在ADOTable1AfterScroll事件过程中)。当应用程序从一个记录滚到另一个时,AfterScroll事件发生。