Master-Detail的资料完整性 |
|
mustapha.wang
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:89 回覆:409 積分:274 註冊:2002-03-13 發送簡訊給我 |
处理Master-Detail资料时,我们都会用Transaction来保证资料完整性,如在Client:
procedure TForm1.Button2Click(Sender: TObject); begin ADOConnection1.Open; ADOConnection1.BeginTrans; try ADOQuery1.UpdateBatch; ADOQuery2.UpdateBatch; ADOConnection1.CommitTrans; except ADOConnection1.RollbackTrans; Raise; end; end;但是可能会有问题,考虑这样的情形,user编修了主从档资料(新增了一笔主档),Button2保存,但是不幸从档资料有违规,ADOQuery2.UpdateBatch出错,Rollback回来了,user也发现了错误,然后修正了ADOQuery2的资料,再按Button2保存,成功,没有提示错误。 资料真的正确吗?看看资料库,你会发现主档没有存进去。为什么?因为第一此按Button2后,ADOQuery1.UpdateBatch正确执行了,ADOQuery1清掉了所有异动资料标记,表示自己已经是一个没有任何异动资料的DataSet了,第二次按Button2时,ADOQuery1就啥也没做了。 而且,主档再修改时,保存还会因为找不到原来的资料而报错,因为update的where条件用的是第一次失败后的值,而资料库根本没有。这是不是一个比较容易忽略的问题。 如何解决呢?我的想法是先把异动资料保存起来,失败时再恢复这些资料,如果你不怕用户骂,也可以两个资料reload。 procedure TForm1.Button2Click(Sender: TObject); begin ADOConnection1.Open; ADOConnection1.BeginTrans; try ADOQuery1.SaveToFile('D:\wxhyhp.dat'); ADOQuery1.UpdateBatch; if CheckBox1.Checked then Raise Exception.Create('Stop'); ADOConnection1.CommitTrans; except ADOConnection1.RollbackTrans; ADOQuery1.LoadFromFile('D:\wxhyhp.dat'); Raise; end; end;很不爽,ADO不能只保存异动资料。ClientDataSet虽然可以,但如何载入delta?
------
江上何人初见月,江月何年初照人 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |