var MS:TMemoryStream;
begin
 MS:=TMemoryStream.Create;
 MS.LoadFromFile('image.bmp');
 Query1.Append
 TBlob(Query1.FieldbyName('ImageField')).LoadFromStream(MS);
 Query1.Post;
如果要 demo 请联系 [email protected] 

解决方案 »

  1.   

    我不知你的水平如何,可以使用流来存取,自己先探索一下,不行给我发EMAIL。
    可以看看TStream,TMemoryStream,TStringStream等
    存时
      Image1.Picture.SavetoStream(流名);
      if (流.Size>0) then
      begin  
       流.Position:=0;//一定要写
      (Query1.FieldByName('BMP') As TBlobField).LoadFromStream(流名);
      end;
    取出来就不用说了吧.
      

  2.   

    后台设定为Image没错,Delphi中用TBlobField.保存图片时,如果是BMP,那就直接用TDBImage;
    如果想保存Jpg、Gif等,就先将文件转换成Stream,然后就可以导入到Blob字段中了
    TBlobField.LoadFromStream,通过Stream可以将任何二进制数据存到数据库中了,
    但你读出数据时,要自己将二进制的Stream恢复成原来的形式。举个Jpg的例子,你可以先从数据库中Image字段的内容读到TBlobField中,然后你自己
    建一个TFileStream,将BlobField中的内容SaveToStream,把TFileStream.Free,你就
    可以从与FileStream关联的文件中得到恢复出的Jpg了!(这个我实践过)其实,这个问题的难点在于怎样将数据库保存的二进制Stream数据恢复为图片格式的数据,
    用FileStream其实是回避了这个问题!如果大家有更好的办法,还请拿出来指导在下!
      

  3.   

    还有一点,如果是用TQuery + TBlobField的话,保存时因为游标、数据集的缘故,SQlServer的客户端会将其先转换为UniCode的字符串,到了后台再将字符串转换为实际数据,就是说多了两遍转换的过程;所以微软推荐用存储过程 + Blob型的参数,速度会快,但带来了与数据集的记录匹配的问题,会麻烦一点!关于Blob数据的存取,在MSDN和SQLServer OnlineBook中都有描述
      

  4.   

    //把数据库中的 *.bmp or *.jpg 数据显示到 TImage控件上 实际代码 已 Test okprocedure TForm1.Button8Click(Sender: TObject);
     var strName:String;
     begin
       strName:=ExtractFileName(Table1.FieldByName('Name').AsString);
       strName:=ExtractFileExt(strName);
       if UpperCase(strName)='.BMP' then
         begin
          TBlobField(Table1.FieldByName('Sound')).SaveToStream(MS);
          MS.Position:=0;
          Self.Image1.Picture.Bitmap.LoadFromStream(MS);
          MS.SetSize(0);
         end;
       if UpperCase(strName)='.JPG' then
        begin
          TBlobField(Table1.FieldByName('Sound')).SaveToStream(MS);
          MS.Position:=0;
          JPG.LoadFromStream(MS);
          Self.Image1.Picture.Bitmap.Assign(JPG);
          MS.SetSize(0);
        end;
     end;
      

  5.   

    补充一下 
      var  
        MS:TMemoryStream;
        Bit:TBitMap;
        Jpg:TJPEGImage;
      

  6.   

    采用blob字段!
    下面是一个网友的贴子:
    读:
    TBlobField * pField=(TBlobField *)pQuery->FieldByName("Image");
    TBlobStream * pmem=new TBlobStream(pField,bmRead);
    pmem->Seek(0,soFromBeginning);
    Graphics::TBitmap * pBitmap=new Graphics::TBitmap();
    pBitmap->LoadFromStream(pmem);
    Image1->Picture->Assign(pBitmap);
    delete pBitmap;
    delete pmem;
    写:
    TBlobField * pField=(TBlobField *)pQuery->FieldByName("Image");
    TBlobStream * pmem=new TBlobStream(pField,bmWrite);
    pmem->Seek(0,soFromBeginning);
    Graphics::TBitmap * pBitmap=new Graphics::TBitmap();
    pBitmap->Assign(Image1->Picture->Graphic);
    pBitmap->SaveToStream(pmem);
    delete pBitmap;
    delete pmem;
    pField->Post();注意:一定要用此方法进行读写,因为实际上它是以二进制流的方式存入数据库!  
    1.先求当前记录的BLOB字段的对象:
      TBlobField * pField=(TBlobField *)pQuery->FieldByName("Image");
    2.从对象指针,建它的流指针:
      TBlobStream * pmem=new TBlobStream(pField,bmRead、bmWrite、bmReadWrite);
      有了大字段的流,什么都好办了;
    3.pmem->SaveToFile("另一文件");
      bitmap1->LoadFromStream(pmem);等, 流操作很丰富;  
      
      

  7.   

    j简单:
    (TABLE。FIELDS。FIELDBYNAME(‘字段名’) AS TBLOBFIELD)。LOADFROMSTREAM(STREAM的名字);