Provider(100分)

  • 主题发起人 主题发起人 yaya8163
  • 开始时间 开始时间
Y

yaya8163

Unregistered / Unconfirmed
GUEST, unregistred user!
只想修改某个人的数据
ProviderUpdateData事件该如何写
 
能说详细些吗,不太懂你的意思。
你想修改表中某条纪录or包含某人信息的纪录?
 
比如姓名='xx的所有记录
 
写sql语句,我又个插入的例子,你可参考一下:
function Tmid.insertsheet(datamaster, datadetail: OleVariant): HResult;
var
ipp:iappserver;
p,k:olevariant;
cds,cds1:Tclientdataset;
s,s1,s2,s3:string;
n,x,icount:integer;
trans:ITransactioncontextEx;
idm:Itrainrdm;
begin
trans:=CreateTransactionContextEx;
try
olecheck(Trans.createinstance(class_trainrdm,iid_itrainrdm,idm));
//ipp:=cotrainrdm.create;
ipp:=idm as Iappserver;
cds:=TClientDataSet.create(nil);
cds1:=TClientDataSet.create(nil);
cds.data:=datamaster;
s:='insert tb_train_master(sheetid,senddate,worker) values(''%s'',''%s'',''%s'')';
cds1.data:=datadetail;
s1:='insert tb_train_detail(sheetid,gname,number,price) values(''%s'',''%s'',%s,%g)';
n:=0;
try
cds1.first;
for icount:=0 to cds1.RecordCount-1do
begin
s2:=format(s1,[cds1.fieldbyname('sheetid').asstring,
cds1.fieldbyname('gname').asstring,
cds1.fieldbyname('number').asstring,
cds1.fieldbyname('price').asfloat]);
ipp.AS_Execute('DataSetProvider1',s2,p,k);
cds1.Next;
n:=n+1;
end;

cds.first;
for x:=0 to cds.recordcount-1do
begin
s3:=format(s,[cds.fieldbyname('sheetid').asstring,
cds.fieldbyname('senddate').asstring,
cds.fieldbyname('worker').asstring]);
ipp.AS_Execute('DataSetProvider1',s3,p,k);
cds.next;
end;
showmessage('n is '+inttostr(n));
trans.Commit;
except
trans.Abort;
showmessage('no');
end;
finally
cds.free;
cds1.free;
end;
end;

function Tmid.deletesheet(sheetid: OleVariant): HResult;
var
ipp:iappserver;
s,s1:string;
p,k:olevariant;
begin
try
ipp:=cotrainrdm.Create;
s:='delete from tb_train_master where sheetid=%s';
s:=format(s,[sheetid]);
s1:='delete from tb_train_detail where sheetid=%s';
s1:=format(s1,[sheetid]);
try
ipp.AS_Execute('DataSetProvider1',s1,p,k);
ipp.AS_Execute('DataSetProvider1',s,p,k);

setcomplete;
except
showmessage('delete is fail');
setabort;
end;
except
showmessage('try is fail');
end;
end;
在MTS环境中。
 
感谢jswqg的热心
但我一直想知道ProviderUpdateData的过程如何写HELP中写的太简单
 
去borland上看看相关的文章吧。
 
太简单了没人理
 

Provider构件是按照从客户端接收的Delta数据包对数据库记录进行更新的。客户端是通过Provider接口或者自定义接口,调用ApplyUpdates方法申请更新数据的。当Provider接收到数据更新数据请求时,会响应OnUpdateData事件。在进行更新数据库中的数据之前,在这个事件中可以对数据包进行编辑,或者控制如何更新数据。调用了这个事件后,Provider使用相关的resolver构件对远程数据库中的数据进行更新。
type TProviderDataEvent = procedure(Sender: TObject;
DataSet: TClientDataSet) of object;
property OnUpdateData: TProviderDataEvent;
resolver构件是一条记录一条记录更新数据的。
(1)在对每个数据进行更新之前,可以响应BeforeUpdateRecord事件。在这个事件中可以使用“screen更新”
(2)如果在更新的过程中出现了错误,会响应OnUpdateError事件通过Provider来处理数据更新中出现的错误.出现的错误多半是由于(1)数据与服务器的constraint冲突(2)数据库服务器的记录已经由另外一个客户改变。而这些改变是在客户从服务器取回数据和更新数据之间发生的。
更新错误可以由客户端来处理,也可以由应用程序服务器来处理。一般来说,应该先由应用程序服务器处理更新数据中出现的错误。当应用程序服务器不能处理更新中出现的错误,它会把这些错误的记录暂时保存起来。当更新完所有的数据后,应用程序服务器向客户端返回在更新数据过程中出现的错误记录个数,并且把错误的记录数据包也返回到客户端,交由客户端进行进一步的处理。
注意:TStoredPrc不能使用这种机制进行更新数据。必须这样:
(1)在Provider的BeforeUpdateRecord事件中显式地进行更新。通常,在其中包含TStoredProc构件的insert, delete, or modify等。
(2)当使用SQL语句更新数据的时候,必须指定resolver可用的Table名称。这种方法只使用于stored procedure代表一个数据表这种情况。在数据包的TableName属性指定数据表的名称,并且这个数据表应该包含在数据包中。欲知详情,可参看“向数据包中增加自定义信息”
The event handlers for all provider events are passed the set of updates as a client dataset. If your event handler is only dealing with certain types of updates, you can filter the dataset on the update status of records so that your event handlerdo
es not need to sort through records it won't be using. Todo
this, set the StatusFilter property of the client dataset.
比如:在Provider的OnUpdateData中,当更新数据的时候检查所有已经删除的记录,并把它们保存到一个日志中
procedure TDBClientTest.ProviderUpdateData(DataSet: TClientDataSet);
begin
with DataSetdo
while not EOFdo
begin
if UpdateStatus = usDeleted then
LogDelete(DataSet, UserName, Date, Time);
Next;
end;
end;
 
多人接受答案了。
 
后退
顶部