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

資料庫Transaction與使用者介面的設計

答題得分者是:st33chen
frappe
中階會員


發表:88
回覆:114
積分:95
註冊:2008-10-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-02-15 22:32:28 IP:115.83.xxx.xxx 訂閱
我使用SQL-Server 2005 Express,使用ADO連線
而我的介面是使用DBControl(DBEdit,DBText....),DBGrid,和ToolBar(用ActionList呈現類似DBNavigate的功能)

有幾個問題想請問

1.BeginTrans是寫在DataModule.Open嗎?還是要寫在TADODataSet的Insert/Edit事件?

2.一般程式是否會跟書上教的一樣,放一個ListBox顯示交易過程?還是只放一個RollBack按鈕?因為我感覺這樣畫面總是怪怪的,而且好占空間

3.書上教ListBox顯示交易過程是寫在Delete按鈕裡面,是否有辦法一次顯示所有交易過程?
因為我有一個想法,能否另外做一個Form,專門給誤刪資料或想回覆資料的時候開啟,不知道這樣會不會怪怪的XD
shunaaron
高階會員


發表:13
回覆:94
積分:106
註冊:2006-10-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-02-16 17:28:46 IP:59.124.xxx.xxx 訂閱

[code delphi]
try
if ado.Connected then ado.Connected := False;
ado.Open;
ado.BeginTrans;
SQL := '';
for ttI := 0 to ttSQL.Count-1 do begin
SQL := SQL ttSQL.Strings[ttI] #13#10;
if ((ttI mod 50 =0) and (ttI <>0)) or (ttI = ttSQL.Count-1) then begin
adocmd.CommandText := SQL ;
adocmd.Execute;
SQL:= '';
end;
end;
ado.CommitTrans;
except on E : Exception do begin
ado.RollbackTrans;
Result := '';
raise Exception.Create('-E-儲存錯誤-' E.Message);
end;
end;
[/code]
------
程式沒有這麼難
只是還沒打通其中要絕
frappe
中階會員


發表:88
回覆:114
積分:95
註冊:2008-10-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-02-16 18:38:30 IP:115.83.xxx.xxx 訂閱
有點看不懂@@"
好像是多個SQL去執行,錯誤的RollBack,
但是錯誤的話資料庫不是會鎖住不能儲存嗎,為什麼要RollBack?

看了程式碼感覺可能我對Transaction的意義有點錯亂

Transaction是給使用者補救誤刪的資料或編輯錯誤的資料嗎?還是防止資料庫寫入錯誤的資料?


===================引 用 shunaaron 文 章===================

[code delphi]
try
if ado.Connected then ado.Connected := False;
ado.Open;
ado.BeginTrans;
SQL := '';
for ttI := 0 to ttSQL.Count-1 do begin
SQL := SQL ttSQL.Strings[ttI] #13#10;
if ((ttI mod 50 =0) and (ttI <>0)) or (ttI = ttSQL.Count-1) then begin
adocmd.CommandText := SQL ;
adocmd.Execute;
SQL:= '';
end;
end;
ado.CommitTrans;
except on E : Exception do begin
ado.RollbackTrans;
Result := '';
raise Exception.Create('-E-儲存錯誤-' E.Message);
end;
end;
[/code]
編輯記錄
frappe 重新編輯於 2009-02-16 18:39:02, 註解 無‧
shunaaron
高階會員


發表:13
回覆:94
積分:106
註冊:2006-10-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-02-16 19:12:40 IP:220.128.xxx.xxx 訂閱

===================引 用 shunaaron 文 章===================

[code delphi]
try
if ado.Connected then ado.Connected := False;
ado.Open;
ado.BeginTrans; //開啟交易處理
SQL := '';
for ttI := 0 to ttSQL.Count-1 do begin
SQL := SQL ttSQL.Strings[ttI] #13#10;
if ((ttI mod 50 =0) and (ttI <>0)) or (ttI = ttSQL.Count-1) then begin
adocmd.CommandText := SQL ;
adocmd.Execute;
SQL:= '';
end;
end;
ado.CommitTrans; //當在insert or update or delete( 即資料庫有異動時),都沒發生錯誤的話,更新資料庫
except on E : Exception do begin //例外處理,當Execute或網路中斷時
ado.RollbackTrans; //取消(還原)原本資料
Result := '';
raise Exception.Create('-E-儲存錯誤-' E.Message);
end;
end;
[/code]
如果要使用交易處理機制
就要使用例外處理 try ....except (相關資訊請按F1或看k.top)
以免發生lock等情況
和帳務,庫存等有關時,建議使用
你可以試著一筆一筆insert 時,突然中間有一筆錯誤時
就知交易處理機制是要做什麼的
------
程式沒有這麼難
只是還沒打通其中要絕
編輯記錄
shunaaron 重新編輯於 2009-02-16 19:15:33, 註解 無‧
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-02-19 14:28:57 IP:122.116.xxx.xxx 未訂閱
您好,

transaction 是用來維持 各資料表間的同步 的,
例如, 使用者輸入完一個畫面, 按 確定 後, 程式要更新三個資料表.
transaction 是說這一次更新, 要不全更新, 要不全不更新
以維持這三個資料表資料的一致性.
當 這三個資料表 全更新完, 再下一個 commit 命令確定寫檔
反之,如果未能三個資料表 全更新完成, 則用 rollback 命令把舊資料叫回來(滾回來)

另外, 當一支程式正在做 transaction 當未 commit 或 rollback 時,
也是為了資料的一致性, 別的程式就不能寫入正在做 transaction 中的這幾個資料表,
所以是鎖定的狀態.

參考一下囉

===================引 用 frappe 文 章===================
有點看不懂@@"
好像是多個SQL去執行,錯誤的RollBack,
但是錯誤的話資料庫不是會鎖住不能儲存嗎,為什麼要RollBack?

看了程式碼感覺可能我對Transaction的意義有點錯亂

Transaction是給使用者補救誤刪的資料或編輯錯誤的資料嗎?還是防止資料庫寫入錯誤的資料?
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
系統時間:2024-05-08 0:18:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!