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

如何抓取adoStoreproc的錯誤代碼??

尚未結案
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-04 11:47:28 IP:61.220.xxx.xxx 未訂閱
小弟看了李維Delphi 5.x ADO/MTS/COM一書中,處理錯誤訊息, 我遇到的狀況為,假設PK為 A(日期) B(人員ID) C(部門ID) 三個欄位, 當我新增一筆資料的時候,A為USER 輸入值, B,C為預設空白,然後再由stored procedure update B,C兩個欄位的值(此值為抓取user登入的ID,所以同一個輸入時,B,C兩欄位一定相同),且update後絕不會為空白,但是當user輸入重複的日期時,在ADOQuery.post時是可以過的,但是在ADOStoredproc.execute時,會造成PK重複,可是我要在哪抓取錯誤代碼ㄋ??
------
ivankuo
timhuang
尊榮會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-04 12:52:07 IP:211.76.xxx.xxx 未訂閱
引言: 在ADOQuery.post時是可以過的,但是在ADOStoredproc.execute時,會造成PK重複,可是我要在哪抓取錯誤代碼ㄋ??
Hi, 利用 try.. except.. end; 一樣的方式就可以了. 只是是否要再多包一層 transaction 就看你要的功能了.
try
  // ADOConnection1.BeginTrans;
  ADOQuery.post;
  ADOStoredproc.execute;
  // ADOConnection1.CommitTrans;
except
  // ADOConnection1.RollbackTrans;
  // something you can do.
end;
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-04 13:04:41 IP:61.220.xxx.xxx 未訂閱
我要在ADOQuery1PostErrorc還是ADOStoredProc1PostError抓取錯誤代碼ㄋ??
------
ivankuo
timhuang
尊榮會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-04 14:07:37 IP:211.76.xxx.xxx 未訂閱
引言: 我要在ADOQuery1PostErrorc還是ADOStoredProc1PostError抓取錯誤代碼ㄋ??
就你的問題敘來看, post 正常但是 execute 發生問題來看, 應該是不希望出現這樣的資料吧, 如此一來會發生資料的不完 整現象, 若是要明白的找出原因, 就包兩層 try.. 如下:
try
  ADOConnection1.BeginTrans;
  ADOQuery.post;
  try
    ADOStoredproc.execute;
    ADOConnection1.CommitTrans;
  except
    ADOConnection1.RollbackTrans;
    Showmessage('ADOStoredproc.execute Error');
  end;
except
  ADOConnection1.RollbackTrans;
  Showmessage('ADOQuery.post Error');
end;
請務必記得包 transaction 時, 因為有使用 showmessage() 這種會 waiting user 的行為, 務必先 commit 或是 rollback 完成後再showmessage, 以免 user 未處理這個 message , 造成程式 waiting 在那個 transaction 裡, 使得 db 整個會被 lock (鎖定), 就不是理想的程式設計流程了!!
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-04 14:43:03 IP:211.21.xxx.xxx 未訂閱
引言: 我要在ADOQuery1PostErrorc還是ADOStoredProc1PostError抓取錯誤代碼ㄋ??
經我的測試,當ADOStoredProc1發生錯誤時,不會進入ADOStoredProc1PostError執行,所有只好寫了一個procedure去跑:
procedure TForm1.ShowError;
begin
  Case ADOConnection1.Errors.Item[0].Get_NativeError of
    2627: raise Exception.Create('資料重覆,請重新輸入!');
    515: raise Exception.Create('欄位不可空白,請重新輸入!');
    .....
  else
    raise Exception.Create('尚有其他錯誤,請洽程式設計師!');
  end;
end;
  • 執行ADOStoredproc錯誤時: try ADOStoredProc1.ExecProc; except ShowError; end;
  • 執行ADOQuery1錯誤時: procedure TForm1.ADOQuery1PostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction); begin ShowError; end;
參考一下這一篇文章,應該對您有幫助: http://delphi.ktop.com.tw/topic.php?topic_id=21289 ~小弟淺見,參考看看~ 發表人 - channel 於 2003/04/04 14:47:33
------
~小弟淺見,參考看看~
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-07 11:08:45 IP:61.220.xxx.xxx 未訂閱
channel前輩的方式可以了,謝謝幫忙
------
ivankuo
系統時間:2024-07-03 4:26:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!