我也在一个三层结构中使用到这个这一功能,以下是我实现的Parameter与流的转换 procedure ParamsToStream(Params: TParams; var Strm: TStream); var I: SmallInt; PM: TParam; prmName: string; nSize: Integer; ftp: TFieldType; Pnt: Pointer; begin //写入ParamCount nSize := Params.Count; Strm.Write(nSize, SizeOf(nSize)); //获取Param for I := 0 to Params.Count - 1 do begin PM := Params[I]; //写入参数名称 prmName := PM.Name; nSize := Length(prmName); Strm.Write(nSize, SizeOf(nSize)); Strm.Write(prmName[1], nSize); //写入数据类型 ftp := PM.DataType; Strm.Write(ftp, SizeOf(ftp)); //写入数据体 nSize := PM.GetDataSize; Pnt := AllocMem(nSize); PM.GetData(Pnt); Strm.Write(nSize, SizeOf(nSize)); Strm.Write(Pnt^, nSize); FreeMem(Pnt); end; Strm.Position := 0; end;
procedure StreamToParams(Strm: TStream; Params: TParams); var I: SmallInt; prmCount, nSize: Integer; prmName: string; prmType: TFieldType; Pnt: Pointer; PM: TParam; begin //读取Param总数 Strm.Position := 0; Strm.Read(prmCount, SizeOf(prmcount)); //读取Param for I := 0 to prmCount - 1 do begin //读取参数名称 Strm.Read(nSize, SizeOf(nSize)); SetLength(prmName, nSize); Strm.Read(pchar(prmName)^, nSize); //读取数据类型 Strm.Read(prmType, SizeOf(prmType)); //读取数据体 Strm.Read(nSize, SizeOf(nSize)); Pnt := AllocMem(nSize); Strm.Read(Pnt^, nSize);
PM := Params.CreateParam(prmType, prmName, ptInput);
PM.SetData(Pnt); FreeMem(Pnt); end; end; |