資料庫Transaction與使用者介面的設計 |
答題得分者是:st33chen
|
frappe
中階會員 發表:88 回覆:114 積分:95 註冊:2008-10-21 發送簡訊給我 |
我使用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 發送簡訊給我 |
[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 發送簡訊給我 |
有點看不懂@@"
好像是多個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 發送簡訊給我 |
===================引 用 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 發送簡訊給我 |
您好,
transaction 是用來維持 各資料表間的同步 的, 例如, 使用者輸入完一個畫面, 按 確定 後, 程式要更新三個資料表. transaction 是說這一次更新, 要不全更新, 要不全不更新 以維持這三個資料表資料的一致性. 當 這三個資料表 全更新完, 再下一個 commit 命令確定寫檔 反之,如果未能三個資料表 全更新完成, 則用 rollback 命令把舊資料叫回來(滾回來) 另外, 當一支程式正在做 transaction 當未 commit 或 rollback 時, 也是為了資料的一致性, 別的程式就不能寫入正在做 transaction 中的這幾個資料表, 所以是鎖定的狀態. 參考一下囉 ===================引 用 frappe 文 章=================== 有點看不懂@@" 好像是多個SQL去執行,錯誤的RollBack, 但是錯誤的話資料庫不是會鎖住不能儲存嗎,為什麼要RollBack? 看了程式碼感覺可能我對Transaction的意義有點錯亂 Transaction是給使用者補救誤刪的資料或編輯錯誤的資料嗎?還是防止資料庫寫入錯誤的資料?
------
IS IT WHAT IT IS 我是 李慕白 請倒著唸. 又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦); 都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |