全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1116
推到 Plurk!
推到 Facebook!

Master-Detail的资料完整性

 
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-04-09 17:09:25 IP:218.80.xxx.xxx 未訂閱
处理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?,只能眉毛胡子一把抓。 < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=10543105&CC=235795"> 久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听 發表人 - mustapha.wang 於 2004/04/09 17:13:17
------
江上何人初见月,江月何年初照人
附加檔案:47954_Transaction.rar
系統時間:2024-07-01 21:27:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!