想在中间层中定义一个过程更新客户端传来的数据集
但不知用什么类型的参数来传递这个数据集
打个比方
如果是在客户端做这个更新过程的话可以这么定义过程
procedure updatethisdata(thistable:TADOTable);
begin
   thistable.first;
   try
  ADOConnection1.BeginTrans;
  while not thistable.eof do
     begin
         ADOStoredProc1.Parameters.ParamByName('字段1').value:=thistable['字段1'];
         ADOStoredProc1.Parameters.ParamByName('字段2').value:=thistable['字段2'];
         ADOStoredProc1.ExecProc;        
     end;   
   ADOConnection1.CommitTrans;
except
  ADOConnection1.RollbackTrans;
end;
 
end;ADOStoredProc1是一个更新数据的存储过程
但现在要把上面的过程放在中间层中,这个过程应该怎么写

解决方案 »

  1.   

    如果确实需要这样做的话,可以用olevariants做为参数
      

  2.   

    你可以在DataSetProvider1.BeforeUpdataRecord事件里做,
    里头的参数DeltaDS就是客户端传过来的ClientDataSet;不过
    你要注意只有ClientDataSet被修改过的数据才会传过来。
    最后你的存储过程执行完了之后,还要继续更新ClientDataSet
    的呼,记得:Applied:=false;
      

  3.   

    如果你每个字段值都要读取的话,你只能在客户端把数据读出来,在服务器
    实现一个方法,参数就用OleVariant。在客户端更新数据的时候调用这个
    服务器方法。
      

  4.   

    我用了一个笨办法实现了此想法,欢迎大家继续讨论有没有什么更巧妙的方法可以实现在中间层定义一个函数用来更新数据function Tgetdataup.updatetb(t: OleVariant): Integer;
    var i:integer;
    begin
      result:=0;
      try
        cn.BeginTrans;
        if (varisarray(t)) then
            for i:=VarArrayLowBound(t,1) to VarArrayHighBound(t,1) do
                begin
                  proc.Parameters.ParamByName('@tempym').Value:=trim(t[i][0]);
                  proc.Parameters.ParamByName('@tempsl').value:=t[i][1];
                  proc.ExecProc;
                end;
        cn.CommitTrans;
        result:=1;
      except
        cn.RollbackTrans;
        result:=0;
      end;  end;在客户端传递表中获取的数据信息procedure TForm1.Button1Click(Sender: TObject);
    var tempt:olevariant;
        i:integer;
        tempym:widestring;
        tempsl:integer;
    begin
        cds.First;
        i:=0;
        tempt:=vararraycreate([0,cds.RecordCount-1],varvariant);    while not cds.Eof do
          begin
             tempym:=cds['ym'];
             tempsl:=cds['ypsl'];
             tempt[i]:=vararrayof([tempym,tempsl]);
             i:=i+1;
             cds.Next;
          end;
     if  (skt.AppServer.updatetb(tempt))=1 then
          showmessage('更新成功!!') else
         showmessage('更新失败!!');
    end;
      

  5.   

    Variant Data Dalte?????可不可以写上只言片语的CODE呢:0