三层结构中对多表查询结果的更新最简单的方法是什么?(200分)

  • 主题发起人 主题发起人 databoy
  • 开始时间 开始时间
D

databoy

Unregistered / Unconfirmed
GUEST, unregistred user!
本人初学三层结构在中间层用TQuery作了一个多表查询,在客户端用ApplyUpdates(-1)
对结果进行更新,总是不能使所有的表更新。在中间层采用用TUpdateSQL也是如此。
恳请大虾给出详细解决方法,一定倾囊相赠!
 
在SQL语句中有一条语句可以一次性同时更新多个表格,好像是Update什么的,你查一下吧
 
我们在做这个,也没试成功,最后的办法是:只查询一个Table,其它的用LOOPUP,
并且LOOPUP在三层处做.

Hope someOne can help you.
 
有两个办法:
办法1: 把这个查询做成视图
办法2:每个表都用一个UpdateSQL
李维的Delphi5.x多层应用系统篇第三章有详细介绍,建议找来看看
我把部分代码贴出来:
DataSetProvider的BeforeUpdateRecord事件
procedure TMultiTablesUpdateServer.dspMultiJoinsBeforeUpdateRecord(
Sender: TObject; SourceDS: TDataSet; DeltaDS: TClientDataSet;
UpdateKind: TUpdateKind; var Applied: Boolean);
begin
quryMultiJoin.UpdateObject := usCustomers;
SetParams(usCustomers, DeltaDS, UpdateKind);
usCustomers.ExecSQL(UpdateKind);

quryMultiJoin.UpdateObject := usOrders;
SetParams(usOrders, DeltaDS, UpdateKind);
usOrders.Apply(UpdateKind);

quryMultiJoin.UpdateObject := usEmployee;
SetParams(usEmployee, DeltaDS, UpdateKind);
usEmployee.Apply(UpdateKind);
Applied := True;
end;
//SetParms的代码
procedure TMultiTablesUpdateServer.SetParams(FUpdateSQL : TUpdateSQL; DeltaDS: TClientDataSet; UpdateKind: TUpdateKind);
var
I: Integer;
Old: Boolean;
Param: TParam;
PName: string;
Field: TField;
Value: Variant;
begin
if not Assigned(FUpdateSQL.DataSet) then
Exit;
with FUpdateSQL.Query[UpdateKind] do
begin
for I := 0 to Params.Count - 1 do
begin
Param := Params;
PName := Param.Name;
Old := CompareText(Copy(PName, 1, 4), 'OLD_') = 0;
if Old then
System.Delete(PName, 1, 4);
Field := DeltaDS.FindField(PName);
if not Assigned(Field) then
Continue;
if Old then
Param.AssignFieldValue(Field, Field.OldValue)
else
begin
Value := Field.NewValue;
if VarIsEmpty(Value) then
Value := Field.OldValue;
Param.AssignFieldValue(Field, Value);
end;
end;
end;
end;
 
能否给出c++builder的源程序!
因为我一直是用c++builder.
 
你还是找李维的书看吧,原理懂了Delphi和BCB都一样
 
接受答案了.
 
后退
顶部