我要把一个OleVariant变量的数据写到Oracle数据库中的Blob字段,是通过Tblobstream流来实现的,可是提交的时候总是提示:Ora-22990:Lob定位器无法扩展事务处理,请问这是什么原因?该怎么解决?

解决方案 »

  1.   

    整段代码是什么,贴出来
    try
    DataBase.StartTransiction;
    Query.Insert;
    Query.FieldByname('id').asstring := edit1.text;TBlobField(Query.FieldByname('Blob')).LoadFromStream(varBlobstream);
    //上面不行就用
    //TBlobField(Query.FieldByname('Blob')).Assign(varBlobstream);Query.applyupdates;
    Query.commitupdates;
    DataBase.Commit;
    except
    database.rollback;
    end;
      

  2.   

    主要代码是这样的:
    var 
       vTreeStream : TBlobStream;
       TmpMemStream : TMemoryStream; 
    begin
       if  not TbZwxx.Active then
           TbZwxx.Active := True;
       TbZwxx.Edit;
       TmpMemStream := TMemoryStream.Create;
    try
       try
           vTreeStream := TBlobStream.Create(TbZwxxZWTZM,bmWrite);
           //把OleVariant变量读取到流中
           OleVariantToStream(FvntSourFeature,TmpMemStream); 
           TmpMemStream.SaveToStream(vTreeStream);
           TbZwxx.Post;
       except
       end;
    finally
       TmpMemStream.free;
    end;
    end;
      

  3.   

    补充:FvntSourFeature 是一个OleVariant变量(Byte数组)
    OleVariantToStream 是一个转换函数如下:procedure OleVariantToStream(AVariant: OleVariant; var AStream: TMemoryStream);
    var
      MyBuffer: Pointer;
      size: Integer;
    begin
      AStream.Clear;
      AStream.Seek(0, soFromBeginning);
      if VarIsArray(AVariant) then
         size := VarArrayHighBound(AVariant, 1) + VarArrayLowBound(AVariant, 1) + 1;
      MyBuffer := VarArrayLock(AVariant);
      AStream.WriteBuffer(MyBuffer^, size);
      VarArrayUnlock(AVariant);
    end;