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

如何於存檔前判斷資料是否重複??

尚未結案
jch
中階會員


發表:111
回覆:224
積分:66
註冊:2003-12-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-12 20:43:45 IP:61.70.xxx.xxx 未訂閱
如題,小弟想要於資料存檔前檢查一下是否有相同的索引值存在,以避免引發錯誤,不知道該如何做呢?? ======================== 我是DELPHI的初學者
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-12 22:59:27 IP:211.76.xxx.xxx 未訂閱
您好:  
 
    ADOConnection1.BeginTrans;
    try
      ADOQuery1.Post;
      ADOConnection1.CommitTrans;
    except
      on E:Exception do
      begin
        ADOConnection1.RollbackTrans;
        if Pos('Attempt to insert duplicate key row',E.Message)>0 then //假設當資料重複時資料庫回傳的錯誤訊有以上字串....
          raise Exception.Create('新增的資料已經存在')
        else
          raise Exception.Create('資料儲存失敗,錯誤訊息如下:'#13 E.message);
      end;
    end;
~~應無所住而生其心~~ 發表人 - terrychen 於 2004/02/12 23:02:31
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-02-13 00:21:19 IP:63.84.xxx.xxx 未訂閱
您好!    若不使用交易處理方法, 也可試試如下方法, 截自于小弟日前完成的專案相關部分, ADOTable1對資料庫進行異動, 而ADOQuery1是做查詢核可的工作, 程式碼請寫于ADOTable1元件的BeforePost事件中:
procedure TForm3.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;
參考看看! ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
jch
中階會員


發表:111
回覆:224
積分:66
註冊:2003-12-01

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-02-13 09:10:51 IP:163.17.xxx.xxx 未訂閱
多謝大哥,但是小弟有一個問題,存檔前多查詢一次不知會不會影響效能嗎?? ======================== 我是DELPHI的初學者
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-02-13 09:16:56 IP:61.221.xxx.xxx 未訂閱
您好: 當資料量大時多少會影響效能,所以可以是是小弟的方法 ~~應無所住而生其心~~
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-02-13 10:00:38 IP:63.84.xxx.xxx 未訂閱
您好﹗    同terrychen兄所言﹐存檔前的核對(舉例中的查詢工作)多多少少會影響﹐但因為是直接使用SQL語法來查詢符合條件的資料記錄﹐如舉例中最多只會擷取出兩筆資料﹐所以造成的影響應不會很大﹐除非資料量已經大得驚人了﹒    P.S 此段程式碼節自于小弟的專案相關部分﹐目前專案上線使用﹐上萬筆的資料錄﹐無明顯效率下降現象﹒        ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
系統時間:2024-11-23 11:27:41
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!