zoukankan      html  css  js  c++  java
  • 序列化ADODataSet, ADOQuery

    服务端直接将TADOQuery查询出来的数据直接转换成TStream自己进行传递,到客户端用一个TADOQuery对象还原流就可以了。

    方法一

    是将recordset保存成流接口->转成OleVariant ->写入流

    class function TADOTools.saveToStream2(

      pvDataSet: TCustomADODataSet): TMemoryStream;
    var
       AStream:_Stream;
       V:OLEVariant;
       P:Pointer;
    begin
       AStream:=CoStream.Create;
       OLEVariant(pvDataSet.Recordset).Save(AStream, adPersistADTG);
       AStream.Position:=0;
       V:=AStream.Read(AStream.Size);
       result:=TMemoryStream.Create;
       try
         P:=VarArrayLock(V);
         try
           result.Size:=VarArrayHighBound(V,1)+1;
           Move(P^,result.Memory^, result.Size);
         finally
           VarArrayUnLock(V);
         end;
       except
         result.Free();
         result := nil;
         raise;
       end;
    end;
     
    class procedure TADOTools.loadFromStream2(pvDataSet: TCustomADODataSet;
      pvStream: TMemoryStream);
    var
       V:OLEVariant;
       AR:_Recordset;
       AStream:_Stream;
       P:Pointer;
    begin
       pvStream.Position:=0;
       OLEVariant(pvDataSet.Recordset).Open(TStreamAdapter.Create(pvStream) as IUnknown, adPersistADTG);
     
     
       AR.Open(AStream, EmptyParam,adOpenUnspecified, adLockUnspecified, -1);
       pvDataSet.Recordset:=ADOInt._Recordset(AR);
     
     
       V:=VarArrayCreate([0,pvStream.Size-1], varByte);
       P:=VarArrayLock(V);
       try
         Move(pvStream.Memory^, P^, pvStream.Size);
       finally
         VarArrayUnLock(V);
       end;
     
       AStream:=CoStream.Create;
       AStream.Open(EmptyParam,adModeUnknown,adOpenStreamUnspecified,'','');
       AStream.Type_:=adTypeBinary;
       AStream.Write(V);
     
       AR:=_Recordset(CoRecordset.Create);
       AStream.Position:=0;
       AR.Open(AStream,EmptyParam,adOpenUnspecified, adLockUnspecified, -1);
       pvDataSet.Recordset:=ADOInt._Recordset(AR);
     
    end;
     
    方法二
    class procedure TADOTools.saveToStream(pvDataSet: TCustomADODataSet; pvStream:TStream);
    begin
       OLEVariant(pvDataSet.Recordset).Save(TStreamAdapter.Create(pvStream) as IUnknown,
          adPersistADTG);    //adPersistXML
    end;
     
    class procedure TADOTools.loadFromStream(pvDataSet: TCustomADODataSet;
      pvStream: TStream);
    var
       AR:_Recordset;
    begin
       AR:=_Recordset(CoRecordset.Create);
       pvStream.Position:=0;
       AR.Open(TStreamAdapter.Create(pvStream) as IUnknown, EmptyParam,adOpenUnspecified, adLockUnspecified, -1);
       pvDataSet.Recordset:=ADOInt._Recordset(AR);
    end;
  • 相关阅读:
    梦断代码,读书计划
    《梦断代码》读后感1
    四则运算2详细过程
    四则运算2初步构思
    四则运算
    阅读《梦断代码》计划
    四则运算2设计思路
    随机输出30道四则运算题
    软件工程阅读计划
    面试题04
  • 原文地址:https://www.cnblogs.com/zyb2016/p/11906305.html
Copyright © 2011-2022 走看看