三层结构,JOIN出来的数据的更新问题(100分)

  • 主题发起人 主题发起人 goodpb1
  • 开始时间 开始时间
G

goodpb1

Unregistered / Unconfirmed
GUEST, unregistred user!
从两个表中join出来一个数据集,在客户端修改后,直接调用
clientdataset1.post;
clientdateset1.applyupdates(0);
我在DataSetProvider.UpdateData可以看到更新的数据已传过来,但没有保存到数据库,我的DataSetProvider连接的是一个adoquery,采用的是数据集更新方式,即设定resolvetodataset:=true;
请问应如何处理,不会非要象书中所说为join的每一个表在服务器端做一个更新吧!
 
反正我是那么处理的
 
难道不能自动更新吗,我知道ADO是可以智能判断更新哪个表的,在两层结构中,用ADO都是这样的呀,三层结构不会这复杂吧
 
不可以的,您應該在中間層分別更新
 
新问题,我现在只对一个数据源进行更新,为什么也不行呢。
中间层使用的ADOQUERY,无论采用交给数据源更新或自己生成SQL语句都没有反应呀
 
不能自动更新!参看李唯的书(多层应用系统篇)。
 
按你的講法你應該是用DCOM寫的程式吧?
這樣試試﹕
把DataSetProvider和adoquery放在中間層﹐然后把前端的clientdateset連上這個
DataSetProvider﹐完成后你就可以用clientdateset1.applyupdates()更新資料到數據庫
 
將DataSetProvider1的Options里的poAllowCommandText設置為True?
 
DataSetProvider1的Options里的poAllowCommandText是设置是否允许CLIENTDATESET通过COMMANDTEXT来SQL语句的。
估计是事务没有提交的问题,在后面加上这个看看
ADOConnection1.CommitTrans;
 
Join出来的表不可以自动更新吧,除非自己写提交语句……
我用BDE做过好象也不行
 
Join自动更新好象不行,我都是自己写SQL进行更新,好在这种情况不是很多
 
我还是自已写提交语句了,多谢各位
 
对于修改多条记录用SQL怎样进行更新呀
 
如果只是单表更新
resolvetodataset:=false;
datasetprovider.OnGetTableName事件中对
TableName:='想更新的表名';
 
解决方法一
ADOQUERY.AfterOpen 代码 (dspMauSK为与adoquery相连的DataSetProvider)
dspMauSK.ResolveToDataSet := True;
adsMauSK.Recordset.Properties.Item['Unique Table'].Value := 'MauSK';
adsMauSK.FieldByName('SK01').ProviderFlags := [pfInKey];
dspMauSK.BeforeUpdateRecord 代码
DeltaDS.FieldByName('SK01').ProviderFlags := [pfInKey, pfInUpdate, pfInWhere];
DeltaDS.FieldByName('MF02').ProviderFlags := [pfInWhere];
DeltaDS.FieldByName('MF03').ProviderFlags := [pfInWhere];
DeltaDS.FieldByName('MF04').ProviderFlags := [pfInWhere];
DeltaDS.FieldByName('MF02x').ProviderFlags := [pfInWhere];
DeltaDS.FieldByName('MF03x').ProviderFlags := [pfInWhere];
DeltaDS.FieldByName('MF04x').ProviderFlags := [pfInWhere];
其它好需修改的字段ProviderFlags的默认设置应该[pfInUpdate, pfInWhere]
解决方法二:
dspMauSK.ResolveToDataSet := False;
dspMauSK.BeforeUpdateRecord 事件中,自己用代码更新,虽然罗嗦,但是比较直观
我一直用这种
 
后退
顶部