• 序列化ADODataSet, ADOQuery


    经过昨天晚上一折腾把做了一个DIOCP直接传递TADOQuery的Demo,在google上找了一系列的资料。

    这样服务端可以直接将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;

    今天稍微改造了下变得简单了

    直接调用recordset保存成流借用TStreamAdapter

    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;
  • 相关阅读:
    python学习----8.28---单例模式,网络编程
    python学习-----8.27----异常处理,元类
    python学习--8.23
    python学习-----8.22--classmethod和staticmethod
    Python学习---8.21组合,多态,封装
    python学习----8.20面向对象---继承与派生
    Python学习----8.17--面向对象编程
    python成长之旅 一
    python java php语言之间的对比
    python成长之旅
  • 原文地址:https://www.cnblogs.com/DKSoft/p/3366581.html
Copyright © 2020-2023  润新知