與數據庫有關的問題,如何提示數據重復? |
答題得分者是:cashxin2002
|
BIG-ROM
初階會員 發表:94 回覆:91 積分:37 註冊:2005-04-16 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
試試在 BeforePost 事件中用另一個 Query 來檢查有無重覆資料
例(假設用 Table1 來儲存/編輯資料):
procedure TForm1.Table1BeforePost(Dataset: TDataset); begin Query1.Close; Query1.SQL.Text := 'Select * From Table1 Where id = ' Table1.FieldByName('id').AsInteger; // 檢查 Table1 內有無 id 欄位值有無重覆 Query1.Open; if not Query1.IsEmpty then // Table1 內有重覆的 id 欄位資料了 begin ShowMessage('Table1 內已有 id 欄位值為 ' IntToStr(Table1.FieldByName('id').AsInteger) ' 的資料'); Abort; // 中止接下來的動作 end; end;-- hagar. |
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好﹗ 插個花﹕
當我們在處理檢查是否有資料重复的時候﹐有一個特殊現象的出現﹐即在修改狀態下﹐用普通的判斷方法檢查資料是否重复是有Bug的﹐因為修改狀態中﹐此筆資料本來就是存在于資料庫內﹐如果沒有修改其鍵值欄位的內容﹐然后在做儲存的時候﹐檢驗程式碼就會發現資料表中已經有這筆資料的存在﹐所以將不允許儲存﹐所以我們需要在資料表的新增狀態和修改狀態中﹐寫入各自的判斷控制﹒
以下程式碼于ADOTable1元件的BeforePost事件中﹕ procedure TForm1.ADOTable1BeforePost(DataSet: TDataSet); Var IDRemark : String; //宣告一個變數, 用于記錄輸入資料的索引欄位值 begin IDRemark := IDRemark := Trim(ADOTable1.FieldByName('Idno').AsString); //利用IDRemark變數來記錄當前輸入的資料索引欄位值 ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('Select Idno From Employee '); ADOQuery1.SQL.Add('Where Idno='''+IDRemark+''' '); ADOQuery1.Open; //使用一個ADOQuery元件來查詢資料表中是否有相同索引欄位值的記錄 if not ADOQuery1.IsEmpty then begin if ADOTable1.State <> dsEdit then begin ShowMessage('ID NO is repeat!'); Abort(); //這里有兩個現象, 當您對某筆資料進行修改并存檔的時候, 也會出現BeforePost的事件, 所以先以ADOTable1的State狀態不為dsEdit(修改狀態)來做判斷 end else begin if ADOQuery1.RecordCount > 1 then begin ShowMessage('ID NO is repeat!'); Abort(); //另一個現象就是修改狀態的Post, 因為修改之前的記錄中已經有這樣一筆資料記錄, 所以BeforePost事件中的判斷應以超過2筆資料為依据進行判斷 end; end; end; end;================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟 |
BIG-ROM
初階會員 發表:94 回覆:91 積分:37 註冊:2005-04-16 發送簡訊給我 |
|
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |