請問多執行序要更新資料庫會出現目前已被鎖定,無法更新的問題 |
答題得分者是:malanlk
|
17kobe
初階會員 發表:86 回覆:73 積分:31 註冊:2007-07-30 發送簡訊給我 |
主程式寫
//用for 迴圈來啟動執行序 for .... TsingleProfit.Create; 執行序程式寫有 TADOConn1 := TADOConnection.Create(nil); TADOQuery1 := TADOQuery.create(nil); TADOConn1.Provider := 'Microsoft.ACE.OLEDB.12.0'; TADOConn1.LoginPrompt := false; TADOConn1.Mode := cmShareDenyNone; TADOConn1.ConnectionString := 'User ID=Admin;Persist Security Info=False;' 'Data Source=' g_sTempDBFile ';'; TADOConn1.KeepConnection := true; TADOConn1.Connected := True; TADOQuery1.Connection := TADOConn1; TADOQuery1.SQL.Clear; TADOQuery1.SQL.Add('update 自訂清單 set ' db_field[i] '=''' s_profit[i] ''' where 基金名稱=''' m_FundName ''' and 群組=' inttostr(m_group) ';'); TADOQuery1.ExecSQL; 執行到update時,會不定時出現"無法更新,目前已被鎖定"的例外情況。不知道是為什麼,請大大幫忙 |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
建立一個 global TCriticalSection 變數 LockXY 將 ExecSQL 包住
===================引 用 17kobe 文 章=================== ..... TADOQuery1.SQL.Clear; TADOQuery1.SQL.Add('update 自訂清單 set ' db_field[i] '=''' s_profit[i] ''' where 基金名稱=''' m_FundName ''' and 群組=' inttostr(m_group) ';'); LockXY.Acquire; { lock out other threads } try TADOQuery1.ExecSQL finally LockXY.Release; end;; 執行到update時,會不定時出現"無法更新,目前已被鎖定"的例外情況。不知道是為什麼,請大大幫忙 |
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
|
17kobe
初階會員 發表:86 回覆:73 積分:31 註冊:2007-07-30 發送簡訊給我 |
謝謝你的回覆
我的更新已沒有問題 但是更新完我等所有thread都跑完後,去顯示結果 但是可能是ADOConnection共用,變成只顯示更新前的資料。 而要顯示新的資料變成要 ADOConnection.connected := false; ADOConnection.connected := true; 下達這兩行指令才能抓到更新後的資料 而我不是確定這樣下法對不對,有什麼方法能ADOQuery到新資料,而不用下上面指令嗎 ===================引 用 malanlk 文 章=================== 建立一個 global TCriticalSection 變數 LockXY 將 ExecSQL 包住 ===================引 用 17kobe 文 章=================== ..... TADOQuery1.SQL.Clear; TADOQuery1.SQL.Add('update 自訂清單 set ' db_field[i] '=''' s_profit[i] ''' where 基金名稱=''' m_FundName ''' and 群組=' inttostr(m_group) ';'); LockXY.Acquire; { lock out other threads } try TADOQuery1.ExecSQL finally LockXY.Release; end;; 執行到update時,會不定時出現"無法更新,目前已被鎖定"的例外情況。不知道是為什麼,請大大幫忙
編輯記錄
17kobe 重新編輯於 2008-03-01 16:57:50, 註解 無‧
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
17kobe
初階會員 發表:86 回覆:73 積分:31 註冊:2007-07-30 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
===================引 用 17kobe 文 章=================== query還是舊資料,但去資料庫看已更新完畢。 而且當主視窗關閉時,因為TCriticalSection是全域的,在主視窗的Create建立,在destroy,free掉,而這時執行序還在使用就會造成錯誤的問題,因為已被free。 先將所有執行緒停掉再去 Free TCriticalSection 照你第一篇顯示的程式寫法, 你是在每一個執行緒內 create connection 並沒有共用, 檢查一下 IsolationLevel是否有設對
編輯記錄
malanlk 重新編輯於 2008-03-02 03:12:48, 註解 無‧
|
17kobe
初階會員 發表:86 回覆:73 積分:31 註冊:2007-07-30 發送簡訊給我 |
^^
IsolationLevel屬性改成ilReadUncommitted可以解決資料沒更新的問題。 還有在destroy的Free TCriticalSection之前,要先強制結束執行序(執行一半也不執行了),這個要用哪個指令呢,再跟你請教。 PS:目前只會等待所有執行序完畢後,才關掉主form,想要用強制關掉執行序,但好像有些安全問題,沒free掉之類的。 感謝你很有用的提示。 ===================引 用 malanlk 文 章=================== ===================引 用 17kobe 文 章=================== query還是舊資料,但去資料庫看已更新完畢。 而且當主視窗關閉時,因為TCriticalSection是全域的,在主視窗的Create建立,在destroy,free掉,而這時執行序還在使用就會造成錯誤的問題,因為已被free。 先將所有執行緒停掉再去 Free TCriticalSection 照你第一篇顯示的程式寫法, 你是在每一個執行緒內 create connection 並沒有共用, 檢查一下 IsolationLevel是否有設對
編輯記錄
17kobe 重新編輯於 2008-03-02 20:47:15, 註解 無‧
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
17kobe
初階會員 發表:86 回覆:73 積分:31 註冊:2007-07-30 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
17kobe
初階會員 發表:86 回覆:73 積分:31 註冊:2007-07-30 發送簡訊給我 |
是自行建立的,當初是怕主視窗關閉會發生錯誤的問題。
而thread的 ADOConnection 裡的Mode是使用cmShareDenyNone; 我想可以再去把ADOConnection改都用主視窗的來試試。 ===================引 用 malanlk 文 章=================== 1. 您程式中Thread 的 ADOConnection 是共用 Data Module 裡的? 還是每個 Thread 自行建立? 2. TADOConnection 的 Mode 也要注意一下... |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |