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

请教一个有关dbexpress交易问题

答題得分者是:pgdennis
xxiaowang
中階會員


發表:51
回覆:75
積分:55
註冊:2005-01-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-28 11:16:29 IP:219.134.xxx.xxx 未訂閱
各位前辈,小弟刚学Delphi,请教一个dbexpress交易问题: 我用Delph7 MSSQL2000,连接资料库用TSQLConnection TSQLQuery TDataSetProvider TClientDataset,显示资料至DBGrid中,在TClientDataSet的OnAfterPost事件中呼叫Dataset.ApplyUpdates(0)。 也即用家在DBGrid中每Post一个Record就会马上ApplyUpdate。因是多个用家使用,请问怎样用交易的方式? 交易代码写在哪儿?谢谢!
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-28 12:48:38 IP:202.62.xxx.xxx 未訂閱
您好﹗    可使用SQLConnection元件的交易功能﹕StartTransaction(開始一筆交易); Commit(确認一筆交易); Rollback(取消一筆交易) 使用的方法Help中有詳細的Example﹐以下摘自Delphi Help的SQLConnection元件說明﹕
procedure TForm1.TransferButtonClick(Sender: TObject);
var
  Amt: Integer;
  TD: TTransactionDesc;
begin
  if not SQLConnection1.InTransaction then
  begin
    TD.TransactionID := 1;
    TD.IsolationLevel := xilREADCOMMITTED;
    SQLConnection1.StartTransaction(TD);
    try
      Amt := StrToInt(AmtEdit.Text);
      Debit.Params.ParamValues['Amount'] := Amt;
      Credit.Params.ParamValues['Amount'] := Amt;
      SQLConnection1.Commit(TD); {on success, commit the changes};
    except
      SQLConnection1.Rollback(TD); {on failure, undo the changes};
    end;
  end;
end;
================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
xxiaowang
中階會員


發表:51
回覆:75
積分:55
註冊:2005-01-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-28 13:49:54 IP:219.134.xxx.xxx 未訂閱
谢谢你,cashxin2002, 你的这段代码我能理解,可是我的意思是: 当我在DBGrid中修改记录,因在ClientDataSet的Afterpost中使用了ApplyUpdate,所以当Focus移动其它记录时,先前修改的记录会post而且ApplyUpdate,这时的交易代码写在哪儿啊?谢谢!
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-28 14:35:08 IP:202.62.xxx.xxx 未訂閱
您好﹗    有些不太理解您的意思﹐您是需要使用SQLConnection的交易功能還是單單使用ClientDataSet的ApplyUpdates功能﹖ 若是前者的話﹐可新增三個按鈕﹐在其OnClick事件中分別下StartTransaction(1)(開始一筆交易); Commit(1)(确認一筆交易); Rollback(1)(取消一筆交易) 在下達StartTransaction的方法之后的所有異動資料﹐若要更新回后端資料庫﹐皆需要使用Commit方法﹒雖然ClientDataSet中的ApplyUpdate有触發﹐但因其包在SQLConnection交易之中﹐所以在沒有确認交易時﹐ApplyUpdate方法亦不會對后端資料庫有異動﹒ 若是后者的話﹐除了使用增加一個按鈕﹐在其OnClick事件中控制ApplyUpdates之外﹐也可嘗試將代碼寫在ClientDataSet元件的BeforeClose事件中﹐要注意在适合的時機﹐將ClientDataSet元件Close﹐以應達到更新資料的目的﹒    ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
xxiaowang
中階會員


發表:51
回覆:75
積分:55
註冊:2005-01-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-04-28 15:04:44 IP:219.134.xxx.xxx 未訂閱
您好! 我要的是您说的第一种情况。 但我不想添加按钮,因为我不想用户太麻烦,在DBGRID中修改记录每次都要点按钮。 是不是可以将StartTransaction(1)写在ClientDataSet的OnBeforeEdit,OnbeforeInsert,OnbeforeDelete中,每一类动作都要StartTransaction吗?而且Commit(1)及Rollback(1)写在哪儿呢? 谢谢指教!
pgdennis
資深會員


發表:41
回覆:526
積分:443
註冊:2002-05-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-04-28 15:35:33 IP:218.163.xxx.xxx 未訂閱
我的想法是既然只有更動一筆資料後,就馬上就Applyupdate那需要做Transaction嗎? 只要在OnAfterPost中
  try
    TClientDataset.ApplyUpdates(-1);
  except
    TClientDataset.CancelUpdates;
  end;
應該就是你要的,只有多個事務才需要用到Transaction,很明顯的你只有一個事務。 星期一,星期二...星期日..星期一..無窮迴圈@@
------
星期一,二...無窮迴圈@@
xxiaowang
中階會員


發表:51
回覆:75
積分:55
註冊:2005-01-26

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-04-28 15:50:00 IP:219.134.xxx.xxx 未訂閱
pgdennis,您好! 您说得的有道理,但是问题是,如果是多用户并发访问的话,这样会不会有什么问题? 谢谢!
pgdennis
資深會員


發表:41
回覆:526
積分:443
註冊:2002-05-23

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-04-28 22:05:36 IP:203.67.xxx.xxx 未訂閱
多用戶問題,是考量搶資源的問題,這個Transaction無法替你解決,Transaction只能保證多事務能全部成功或失敗。 只是如果幾乎同時有多人對同一筆資料更新,那資料就會變成最後更新的那筆資料為主。 如果用Transaction那反而不好,因為你用了就把資料lock了, 那後面的人都要排隊等他做完。 但是這樣結果還是一樣,資料還是會變成最後更新的那筆。 星期一,星期二...星期日..星期一..無窮迴圈@@
------
星期一,二...無窮迴圈@@
xxiaowang
中階會員


發表:51
回覆:75
積分:55
註冊:2005-01-26

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-04-29 08:22:50 IP:218.17.xxx.xxx 未訂閱
您好,pgdennis 谢谢您,我懂了。但还有一问题要请教: 有一资料表中有一审核码Field,当审核码Field为1时,用户才能修改资料。 如某笔资料审核码Field为0, 这时用户A正在修改该笔资料中其它Field,用户B在用户A还没有更新之前,将该笔资料的审核码Field修改为1并已经更新至资料库,所以用户A更新修改就会违反逻辑规则。请问这种情况怎么避免? 谢谢!
pgdennis
資深會員


發表:41
回覆:526
積分:443
註冊:2002-05-23

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-04-29 12:02:44 IP:218.163.xxx.xxx 未訂閱
這個就要自己處理了,如果是更新錯誤那可以利用TClientDataSet.OnReconcileError Event來處理錯誤。    但你的問題是屬於自行定義的邏輯錯誤,假如你檢查機制是寫在Trigger中,那就直接用抓他的錯誤即可。 如果檢查機制是寫在程式中,那很明顯的你必須在程式中applyupdate前先檢查 資料庫中的資料,確定是否資料已被更改。 再行處理。 星期一,星期二...星期日..星期一..無窮迴圈@@
------
星期一,二...無窮迴圈@@
系統時間:2024-04-20 5:34:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!