我大概看了一下,TOleContainer的LoadFromStream是让其中包含的OLE对象去从流中加载数据,而你的OLE对象是否可以读取Delphi TDataset的CreateBlobStream生成的流呢?应该不行吧,因为她能读的流是要符合一种规范的,至少要有12字节的头,这显然和TBlobStream生成的流是不同的(除非你数据库里面存的BLOB就是OLE对象SaveToStream生成的流)。因此马上就会产生stream read error的异常。你能说说你的目的吗?

解决方案 »

  1.   

    我想可能的问题处在Stream的读写上。改成如下代码试一试:
    try
        tab_ht_mb.Edit; //tab_ht_mb为TTable控件
        Stream.Seek(0, soFromBeginning);
        MyFile.Seek(0,soFromBeginning);//新增的
        MyFile.Read(Buffer^,MemSize);
        Stream.Write(Buffer^,MemSize);
    finally
        try
            l_Stream:=tab_ht_mb.CreateBlobStream(tab_ht_mb.fieldbyname('TEXT') asTBlobField,bmRead);
            //tab_ht_mb为TTable控件        
            l_Stream.Seek(0,soFromBeginning);//new line
            l_ole.LoadFromStream(l_Stream) (此句产生'Stream read error'错误)
            //l_ole为ToleContainer控件
        except
        end;
        l_Stream.Free;
    其实你上面的语句可以改成不使用中间临时文件的方法。TOleContainer有一个方法SaveToStream和LoadFromStream.
    我用BCB实现的代码如下:
        TBlobStream * pData=(TBlobStream *)pQuery->CreateBlobStream(pQuery->FieldByName("Text"),bmWrite);
        pData->Seek(0,soFromBeginning);
        ocDocument->SaveToStream(pData);
        pQuery->Post();
    然后装载时:
        TBlobStream * pData;
        TBlobField * pField=(TBlobField *)pQuery->FieldByName("Text");
        pData=new TBlobStream(pField,bmRead);
        pData->Seek(0,soFromBeginning);
        ocDocument->LoadFromStream(pData);
        delete pData;
      

  2.   

      这好象是一个Bug,你可以将Table断开,再连接应该可以解决
      

  3.   

      这是应用程序读Blob字段时发生了错误,需要正确设置blob size和Blob cache。
      

  4.   

      在DB2中将TAble设置Cacheupdate设置为True,无论是否使用事务,都容易产生这个错误,因为你的ole只能读些Word8.0文档的内容,且blob字段在applyupdates后,产生了不可预知的错误,建议你重新连接表,再通过标签定位到原来的记录。