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

如何使用 SQL 取得符合條件的資料及筆數

尚未結案
hammerce
一般會員


發表:1
回覆:3
積分:0
註冊:2002-10-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-11-01 16:01:18 IP:60.248.xxx.xxx 未訂閱
請教各位先進: 目前小弟使用 MS-SQL 資料庫, 在多人同時使用資料庫的情況下, 想要使用 ADOQuery 正確查詢資料表所有的資料筆數, 以及符合特定 條件的資料及資料筆數, 以判別接下要更新的動作, 請問要如何指定 SQL 敘述, 以避免執行過程因他人更改資料造成計算錯誤的情況呢? 例如: var iCount,iTotal: integer; vData: variant; begin with ADOQuery1 do begin SQL.Add('select count(*) from Customer'); Open; iTotal := Fields[0].AsInteger; Close; SQL.Clear; SQL.Add('select * from Customer where Age >= 40'); iCount := RecordCount; vData := GetData(ADOQuery1); end; ... 如在程式已執行完 iTotal := Fields[0].AsInteger; 還未執行下面程式碼時有其他使用者刪除資料, 計算所得的總筆數就是錯誤的,請問要如何解決呢?
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-11-01 17:39:25 IP:220.132.xxx.xxx 未訂閱
Hi, 這種狀況就得起 transaction 來包裝你的操作, 可以使用 ADOConnection 的 BeginTrans, RollbackTrans, CommitTrans 來將操作整個包起來, 但要注意你 lock 的時間, 若是時間過長會讓其他要讀 database 的 client 產生封鎖作用, 而無法存取, sample 如下,    
begin
  ADOConnection1.BeginTrans;
  // do something
  // your code here
  if(something wrong)
    ADOConnection1.RollbackTrans
  else
    ADOConnection1.CommitTrans;
end;  
hammerce
一般會員


發表:1
回覆:3
積分:0
註冊:2002-10-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-11-02 23:26:08 IP:211.74.xxx.xxx 未訂閱
timhuang 您好! 當程式開始交易,並查詢完資料總筆數後,還未完成交易前, 其他使用者有可能刪除某筆資料,這時之前所查到的總筆數就是 錯誤的,請問有辦法避免這種情況嗎? 我的需求是正確獲得某個 時間點上(比如交易期間) 取得符合條件的資料及筆數及資料表 總資料數.
Arlung Miao
初階會員


發表:9
回覆:44
積分:25
註冊:2004-08-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-11-05 14:59:50 IP:218.18.xxx.xxx 未訂閱
請按以下方式執行:    
adoConnect := ADOQuery1.Connection;
adoConnect.BeginTrans
  with ADOQuery1 do begin
    SQL.Add('select count(*) from Customer (UPDLOCK)'); 
    Open;
    iTotal := Fields[0].AsInteger;
    Close; 
    SQL.Clear;
    SQL.Add('select * from Customer where Age >= 40');
    iCount := RecordCount;
    vData := GetData(ADOQuery1);
  end;
adoConnect.CommitTrans
這裡使用UPDLOCK是為了能達到最大的並行效果(其它用戶可以讀取數據,但是不能更改數據)。當然,也可以用更嚴格的鎖HOLDLOCK/SERIALIZABLE/XLOCK/TABLOCKX
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-11-05 21:48:28 IP:220.132.xxx.xxx 未訂閱
參考 Arlung Miao 兄的建議, 應能解決你的問題, 但要注意鎖定時間的長短, 避免造成效能降低!
hammerce
一般會員


發表:1
回覆:3
積分:0
註冊:2002-10-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-11-07 13:46:18 IP:60.248.xxx.xxx 未訂閱
感謝 timhuang 及 Arlung Miao 的熱心解答, 測試過可以解決我的問題了,非常感謝!!
系統時間:2024-06-18 19:17:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!