midas的问题???(100分)

  • 主题发起人 主题发起人 52free
  • 开始时间 开始时间
5

52free

Unregistered / Unconfirmed
GUEST, unregistred user!
想在中间层中定义一个过程更新客户端传来的数据集
但不知用什么类型的参数来传递这个数据集
打个比方
如果是在客户端做这个更新过程的话可以这么定义过程
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;

但现在要把上面的过程放在中间层中,这个过程应该怎么写
 
使用TDataSetProvider的OnUpdateData时间就可以了

procedure TForm1.DataSetProvider1UpdateData(Sender: TObject;
DataSet: TCustomClientDataSet);
begin
//my code
DataSet.FieldByName('test').value:='aaaaaaaaa'
end;
 
我用了一个笨办法实现了此想法,欢迎大家继续讨论有没有什么更巧妙的方法可以实现

在中间层定义一个函数用来更新数据

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[0]);
proc.Parameters.ParamByName('@tempsl').value:=t[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:=vararrayof([tempym,tempsl]);
i:=i+1;
cds.Next;
end;
if (skt.AppServer.updatetb(tempt))=1 then
showmessage('更新成功!!')

else
showmessage('更新失败!!');
end;
 
如果是我做,将你的客户端程序翻译过来话我会像下面这样做(我一向是不太喜欢Variant
的,有其它简单的办法能实现的,我就一定不用这个笨重的东西)。

组件接口方法定义如下(客户端就不用了吧?):
HRESULT _stdcall UpdateThisData([in] BSTR TableName, [out, retval] long * Result );

function TTransDMServ.UpdateThisData(const TableName: WideString): Integer;
//返回值: 1:成功; 0:失败
begin
Result := 0;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('Select KeyField1, KeyField2 From '+TableName);
ADOQuery1.Open;
if not ADOQuery1.Eof then
try
while not ADOQuery1.Eof do
begin
ADOStoredProc1.Parameters.ParamByName('KeyField1').Value :=
ADOQuery1.FieldByName('KeyField1').Value;
ADOStoredProc1.Parameters.ParamByName('KeyField2').Value :=
ADOQuery1.FieldByName('KeyField2').Value;
ADOStoredProc1.ExecProc;
end;
Result := 1;
finally
ADOQuery1.Close;
end;
end;
 
使用TDataSetProvider的OnUpdateData时间就可以了
過程代碼是一樣的,就是在客戶端要調用它就行了。[:D][:D]
我以前做就是這樣做的
給點分吧.老兄
 
接受答案了.
 
后退
顶部