为何我在DataSetProvider的BeforeUpdateRecord事件中加了代码,客户端就不能更新了?(30分)

  • 主题发起人 主题发起人 awfigsk
  • 开始时间 开始时间
A

awfigsk

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TSalesServerCK.ProductViewDSPBeforeUpdateRecord(Sender: TObject;
SourceDS: TDataSet;
DeltaDS: TCustomClientDataSet;
UpdateKind: TUpdateKind;
var Applied: Boolean);
begin
var
TmpQry:TADOQuery;
TmpConn:TADOConnection;
TmpCode:String;
begin
try
TmpQry:=TADOQuery.Create(nil);
TmpConn:=TADOConnection.Create(nil);
TmpConn.ConnectionString:=...;
TmpConn.LoginPrompt:=False;
TmpConn.Connected:=True;
TmpQry.Connection:=TmpConn;
DeltaDS.First;
while not DeltaDS.Eofdo
begin
TmpCode:=DeltaDS.FieldByname('Code').AsString;
TmpQry.SQL.Text:='Update Test set id='+Tmpcode;
TmpQry.ExecSQL;
DeltaDS.Next
end;
Applied:=False;
finally
FreeAndNil(TmpQry);
FreeAndNil(TmpConn);
end;
end;

我在DataSetProvider的BeforeUpdateRecord事件中加了上述代码后,客户端ApplyUpdates(0)就不能更新数据表了。如果将上述代码去掉,则在客户端ApplyUpdates(0)就可以更新数据表。这是为何?上述代码我并没有对Delta数据进行操作呀?
我利用SQL事件跟踪器发现在上述更新语句执行,会插入一个
if @@TransCount>0 RollBack Tran
 
Applied:=False;
改为
Applied:=True;
 
我没有处理更新,为何要将applied改为True?
ADO是将数据更新到另一张表上,而DataSetProvider所关联的数据集并没有更新呀,所以我才将Applied设为False.
 
我以为你的
TmpQry.SQL.Text:='Update Test set id='+Tmpcode;
TmpQry.ExecSQL;
就是处理更新(你没说清楚)
最好把这段代码放入OnUpdateData事件中处理
 
呵。。谢谢!
但上述代码为何不能更新DataSetProvider所关联的数据集呢?这问题是出在哪呢?
还请大侠指点,谢谢!
 
其实这个事件不用你的 while 循环
DeltaDS如果有多条记录的话每条记录处理前都会触发一次这个事件的.
 
to yepemig:问题解决!
问题就是出在循环,也就是您所说的DeltaDS有多条记录的话每条记录处理都会触发这个事件。
十分感谢!谢谢!
 
后退
顶部