如何使用 SQL 取得符合條件的資料及筆數 |
尚未結案
|
hammerce
一般會員 發表:1 回覆:3 積分:0 註冊:2002-10-23 發送簡訊給我 |
請教各位先進: 目前小弟使用 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 發送簡訊給我 |
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 發送簡訊給我 |
|
Arlung Miao
初階會員 發表:9 回覆:44 積分:25 註冊:2004-08-25 發送簡訊給我 |
請按以下方式執行:
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 發送簡訊給我 |
|
hammerce
一般會員 發表:1 回覆:3 積分:0 註冊:2002-10-23 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |