多层结构下使用数据库视图的问题(100分)

  • 主题发起人 主题发起人 cobi
  • 开始时间 开始时间
C

cobi

Unregistered / Unconfirmed
GUEST, unregistred user!
有两个表A和B,B是A的代码表
建立一个视图VA,联结A和B两表
三层服务器端用AdoQuery联结该视图(select * from VA),客户端用clientdataset
当试图往clientdataset中新增数据时,post可以看到A的字段已经有值,但是B的值没有即时显示;用applyupdates(-1)向服务器端提交数据,没有错误提示,但不能更新.请问原因是什么呢?
看过一些三层的程序,似乎不能直接往联结视图的clientdataset上进行数据增减操作,而必须依赖其他联结主表(如A)的数据集控件,而视图的更新则在数据操作成功后再次query得到.这样做岂不是效率很低下?请问有没有好的解决方法,谢谢!
 
想同时更新2个表 必须利用 TDatasetProvider的BeforeUpdateRecord事件.
TDatasetProvider提交数据库会先调用BeforeUpdateRecord事件.
所以我们必须在这里写sql语句一个一个的提交
procedure TDM_LYCWGL.dsp_dytcBeforeUpdateRecord(Sender: TObject;
SourceDS: TDataSet;
DeltaDS: TCustomClientDataSet;
UpdateKind: TUpdateKind;
var Applied: Boolean);
var
sqlStr: String;
ID: Integer;
begin
inherited;
try
case UpdateKind of
ukInsert:
begin
ID := DeltaDS.FieldByName('dytcID').AsInteger;
sqlStr := Format('insert into s_dytcn(dytcID,dyID,xmID,lxsID,tpbz,sftp,tcdj,'+
'DefineMan,DefineDate,ChangeMan,changeDate,DeleteMan,DeleteDate,Signlevel,signSpecial,signDetail,signUsed,signModify,signDelete,zjm) '+
'values(%d,%d,%d,%d,%d,%s,%f,'+
'%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)',
[ID,
StrToInt(DeltaDS.FieldByName('dyID').NewValue),
StrToInt(DeltaDS.FieldByName('xmID').NewValue),
StrToInt(DeltaDS.FieldByName('lxsID').NewValue),
StrToInt(DeltaDS.FieldByName('tpbz').NewValue),
QuotedStr(DeltaDS.FieldByName('sftp').NewValue),
StrToFloat(DeltaDS.FieldByName('tcdj').NewValue),
QuotedStr(DeltaDS.FieldByName('DefineMan').NewValue),
QuotedStr(DeltaDS.FieldByName('DefineDate').NewValue),
QuotedStr(DeltaDS.FieldByName('ChangeMan').NewValue),
QuotedStr(DeltaDS.FieldByName('changeDate').NewValue),
QuotedStr(DeltaDS.FieldByName('DeleteMan').NewValue),
QuotedStr(DeltaDS.FieldByName('DeleteDate').NewValue),
QuotedStr(DeltaDS.FieldByName('Signlevel').NewValue),
QuotedStr(DeltaDS.FieldByName('signSpecial').NewValue),
QuotedStr(DeltaDS.FieldByName('signDetail').NewValue),
QuotedStr(DeltaDS.FieldByName('signUsed').NewValue),
QuotedStr(DeltaDS.FieldByName('signModify').NewValue),
QuotedStr(DeltaDS.FieldByName('signDelete').NewValue),
QuotedStr(DeltaDS.FieldByName('zjm').NewValue)]);
SYS_CommonDBObject.DO_SQL(sqlStr);
end;

ukModify:
begin
sqlStr := '';
AddUpdateSql(sqlStr,'dyID',DeltaDS);
AddUpdateSql(sqlStr,'xmID',DeltaDS);
AddUpdateSql(sqlStr,'lxsID',DeltaDS);
AddUpdateSql(sqlStr,'tpbz',DeltaDS);
AddUpdateSql(sqlStr,'sftp',DeltaDS);
AddUpdateSql(sqlStr,'tcdj',DeltaDS);
AddCommonFieldUpdateSql(sqlStr,DeltaDS);
if sqlStr <> '' then
begin
ID := DeltaDS.FieldByName('dytcID').OldValue;
sqlStr := Format('update s_dytcn set %s where dytcID = %d ',[sqlStr,ID]);
SYS_CommonDBObject.DO_SQL(sqlStr);
end;
end;

ukDelete:
begin
ID := DeltaDS.FieldByName('dytcID').OldValue;
sqlStr := Format('delete from s_dytcn where dytcID = %d ',[ID]);
SYS_CommonDBObject.DO_SQL(sqlStr);
end;
end;
except On e: Exceptiondo
ShowMessage(e.Message);
end;

Applied := true;
end;
 
谢谢楼上的回复
不过我的两个表里面,B是代码表,不需要做数据更新的.那是不是说直接BeforeUpdateRecord里面对表A写Sql进行更新就可以呢?
还有,我自己最关心的还是视图更新的问题,请使用过视图的朋友帮忙回答
 
后退
顶部