所谓的“真3层”有时候是需要客户端上传数据集的TPARAMS到中间件的。

现在,高版本的DATASNAP的远程方法其实也是直接可以传输TPARAMS类型的变量,但是DELPHI7(七爷)、六爷它们是不支持的。

高版本的DATASNAP要让六爷、七爷它们调用,不能直接传TPARAMS,得转换。

procedure VariantToParams(input: OleVariant; par: TParams);
var
  n, i: integer;
begin
  try
    n := 0;
    i := 0;
    par.Clear;
    while VarArrayHighBound(input, 1) >= (n + 5) do
    begin
      par.CreateParam(TFieldType(input[n + 1]), input[n + 2], TParamType(input[n + 4]));
      par.Items[i].Value := input[n + 3];
      par.Items[i].Size := input[n + 5];
      n := n + 5;
      i := i + 1;
    end;
  except
    Exit;
  end;
end;

function ParamsToVariant(par: TParams): OleVariant;
var
  n, i: integer;
begin
  try
    Result := VarArrayCreate([1, par.Count * 5], VarVariant);
    n := 0;
    i := 0;
    while par.Count > i do
    begin
      Result[n + 1] := Ord(par.Items[i].DataType);
      Result[n + 2] := par.Items[i].Name;
      Result[n + 3] := par.Items[i].Value;
      Result[n + 4] := ord(par.Items[i].ParamType);
      Result[n + 5] := par.Items[i].Size;
      i := i + 1;
      n := n + 4;
    end;
    result := Result;
  except
    Exit;
  end;
end;

其实,PARAMS和OLEVARIANT相互转换的函数,DELPHI已经现成提供了:

DBCLITNT.PAS

function PackageParams(Params: TParams; Types: TParamTypes = AllParamTypes): OleVariant;
var
I, Idx, Count: Integer;
begin
Result := NULL;
Count := 0;
for I := 0 to Params.Count - 1 do
if Params[I].ParamType in Types then Inc(Count);
if Count > 0 then
begin
Idx := 0;
Result := VarArrayCreate([0, Count - 1], varVariant);
for I := 0 to Params.Count - 1 do
with Params[I] do
if ParamType in Types then
begin
if VarIsCustom(Value) then
Result[Idx] := VarArrayOf([Name, VarToStr(Value), Ord(DataType), Ord(ParamType),
Size, Precision, NumericScale])
else
Result[Idx] := VarArrayOf([Name, Value, Ord(DataType), Ord(ParamType),
Size, Precision, NumericScale]);
Inc(Idx);
end;
end;
end;

procedure UnpackParams(const Source: OleVariant; Dest: TParams);
var
TempParams: TParams;
HighBound, i: Integer;
begin
if not VarIsNull(Source) and VarIsArray(Source) and VarIsArray(Source[0]) then
begin
TempParams := TParams.Create;
try
for i := 0 to VarArrayHighBound(Source, 1) do
begin
HighBound := VarArrayHighBound(Source[i], 1);
with TParam(TempParams.Add) do
begin
Name := Source[i][0];
if HighBound > 1 then
DataType := TFieldType(Source[i][2]);
if HighBound > 2 then
ParamType := TParamType(Source[i][3]);
if HighBound > 3 then
Size := Source[i][4];
if HighBound > 4 then
Precision := Source[i][5];
if HighBound > 5 then
NumericScale := Source[i][6];
Value := Source[i][1]; // Value must be set last
end;
end;
Dest.Assign(TempParams);
finally
TempParams.Free;
end;
end;
end;

TPARAMS和OLEVARIANT相互转换的更多相关文章

  1. lientDataset的Delta与XML相互转换

    一个ClientDataset的Delta与XML相互转换的文章:大家都知道TClientDataSet的Delta属性保存数据集的变化,但是Delta是OleVariant类型的属性,这样如果用De ...

  2. 数据集和JSON相互转换

    使用DELPHI原生类实现数据集和JSON相互转换  JSON二要素:数组和对象.对象可以包含数组,数组可以包含对象.无层数限制.OLEVARIANT也类似,OLEVARIANT的一个元素又可以是OL ...

  3. 一个ClientDataset的Delta与XML相互转换

    一个ClientDataset的Delta与XML相互转换的文章: 大家都知道TClientDataSet的Delta属性保存数据集的变化,但是Delta是OleVariant类型的属性,这样如果用D ...

  4. DataSnap——利用TParams进行多表事务更新

    DataSnap——利用TParams进行多表事务更新 服务端: function TSVRDM.multUpdatesByPar(UpdateParam: TParams; out ErrMsg: ...

  5. 【AutoMapper官方文档】DTO与Domin Model相互转换(上)

    写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...

  6. 火星坐标、百度坐标、WGS-84坐标相互转换及墨卡托投影坐标转经纬度JavaScript版

    火星坐标 火星坐标是国家测绘局为了国家安全在原始坐标的基础上进行偏移得到的坐标,基本国内的电子地图.导航设备都是采用的这一坐标系或在这一坐标的基础上进行二次加密得到的.火星坐标的真实名称应该是GCJ- ...

  7. 【AutoMapper官方文档】DTO与Domin Model相互转换(中)

    写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...

  8. 【AutoMapper官方文档】DTO与Domin Model相互转换(下)

    写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...

  9. Android-Drawable、Bitmap、byte[]、资源文件相互转换

    我们在Android的开发中,经常可以遇到图片的处理,当中,有很多是 Bitmap.Drawable.byte[]和资源文件它们直接相互转换. 今天就此总结一下: 1.资源文件转为Drawable 2 ...

随机推荐

  1. bzoj4199

    看到这题我就伤心,当初想到了正解却因为各种sb原因没有写…… 好吧,其实我的正解是比较挫的…… 大家似乎都用了后缀数组,我用了后缀自动机(后缀树) 其实SAM是很好想得,用SAM建出后缀树后 我们考虑 ...

  2. UVa 548 (二叉树的递归遍历) Tree

    题意: 给出一棵由中序遍历和后序遍历确定的点带权的二叉树.然后找出一个根节点到叶子节点权值之和最小(如果相等选叶子节点权值最小的),输出最佳方案的叶子节点的权值. 二叉树有三种递归的遍历方式: 先序遍 ...

  3. 02.C语言关于指针的学习笔记

    指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容: 指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内 ...

  4. I.MX6 uSDHC SD card register

    /**************************************************************************** * I.MX6 uSDHC SD card ...

  5. notebook kernels

    http://10.139.97.132/user/8e6ef01ea71d3f988e61bf2db17c3031/api/kernels [{"id": "f0987 ...

  6. android 自定义控件中获取属性的三种方式(转)

    第一种方法,直接设置属性值,通过attrs.getAttributeResourceValue拿到这个属性值. (1)在xml文件中设置属性值 <com.example.activity.Ico ...

  7. UVa11582 Colossal Fibonacci Numbers!

    #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> us ...

  8. 【英语】Bingo口语笔记(50) - Drop系列

  9. java事务的处理

    java的事务处理,如果对数据库进行多次操作,每一次的执行或步骤都是一个事务. 如果数据库操作在某一步没有执行或出现异常而导致事务失败,这样有的事务被执行有的就没有被执行,从而就有了事务的回滚,取消先 ...

  10. 利用ArcGIS Engine、VS .NET和Windows控件开发GIS应用

    Dixon 原文  用ArcGIS Engine.VS .NET和Windows控件开发GIS应用     此过程说明适合那些使用.NET建立和部署应用的开发者,它描述了使用ArcGIS控件建立和部署 ...