線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:975
推到 Plurk!
推到 Facebook!

如何攔截關聯性資料庫Delete產生錯誤訊息?

尚未結案
lilisn
一般會員


發表:35
回覆:62
積分:24
註冊:2003-03-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-16 17:01:05 IP:61.228.xxx.xxx 未訂閱
var B,E,S:String; begin S:='11'; //部門 if MessageDlg('Are you Sure Delete Record ?',mtConfirmation, [mbYes,mbNO],0)=mrYes then begin B:=ADOQuery1.FieldByName('proNo').AsString; ADOQuery1.Next; if ADOQuery1.Eof then ADOQuery1.Prior; E:=ADOQuery1.FieldByName('proNo').AsString; ADOQuery11.SQL.Add('delete product where department=''' S ''' '); ADOQuery11.SQL.Add(' and prono=''' B ''' '); ADOQuery11.ExecSQL; ADOQuery11.Close; ADOQuery1.Close; ADOQuery1.Open; ADOQuery1.Locate('Department;prono',VarArrayOf([S,E]),[]); end; end; 當按Yes時去 ADOQuery11.SQL.Add('delete product where department=''' S ''' '); ADOQuery11.SQL.Add(' and prono=''' B ''' '); ..會出限sql error message :delete statment conflicted with column reference constraint 'FK_product ...... (此[A]:Table代號與另一個[B]:Table代號關聯性資料) 多謝!
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-16 23:17:29 IP:211.76.xxx.xxx 未訂閱
引言: var B,E,S:String; begin S:='11'; //部門 if MessageDlg('Are you Sure Delete Record ?',mtConfirmation, [mbYes,mbNO],0)=mrYes then begin try B:=ADOQuery1.FieldByName('proNo').AsString; ADOQuery1.Next; if ADOQuery1.Eof then ADOQuery1.Prior; E:=ADOQuery1.FieldByName('proNo').AsString; ADOQuery11.SQL.Add('delete product where department=''' S ''' '); ADOQuery11.SQL.Add(' and prono=''' B ''' '); ADOQuery11.ExecSQL; ADOQuery11.Close; ADOQuery1.Close; ADOQuery1.Open; ADOQuery1.Locate('Department;prono',VarArrayOf([S,E]),[]); except on E: EADOError do begin {Do your handle exeption code} end; end; end; end; 當按Yes時去 ADOQuery11.SQL.Add('delete product where department=''' S ''' '); ADOQuery11.SQL.Add(' and prono=''' B ''' '); ..會出限sql error message :delete statment conflicted with column reference constraint 'FK_product ...... (此[A]:Table代號與另一個[B]:Table代號關聯性資料) 多謝!
如果你要攔截訊息後自己處裡的話可以參考紅色的地方,將要要接續處理的 code 寫在 on E: EADOError do (或攔截 EDatabaseError)後.... 如果你要解決 foreign key 的問題,要那去檢視一下 Table 內 FK 參考的對應,是不是刪除的"邏輯"上有錯誤?? ---- 我只會兩件事,這也不會,那也不會 ---- 眼見不一定為真
lilisn
一般會員


發表:35
回覆:62
積分:24
註冊:2003-03-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-02-17 08:58:25 IP:61.228.xxx.xxx 未訂閱
var B,E,S:String; begin S:='11'; //部門 if MessageDlg('Are you Sure Delete Record ?',mtConfirmation, [mbYes,mbNO],0)=mrYes then begin try B:=ADOQuery1.FieldByName('proNo').AsString; ADOQuery1.Next; if ADOQuery1.Eof then ADOQuery1.Prior; E:=ADOQuery1.FieldByName('proNo').AsString; ADOQuery11.SQL.Add('delete product where department=''' S ''' '); ADOQuery11.SQL.Add(' and prono=''' B ''' '); ADOQuery11.ExecSQL; ADOQuery11.Close; ADOQuery1.Close; ADOQuery1.Open; ????????????? 問題 DELETE失敗有何語法可判斷不去run ADOQuery1.Locate..... 如if DELETE失敗 then begin ADOQuery1.Locate('Department;prono',VarArrayOf([S,E]),[]); end; ????????????? except begin showmessage('其它資料庫有相映代號不可刪除'); ADOQuery1.Locate('Department;prono',VarArrayOf([S,B]),[]); end; end; end; 發表人 - lilisn 於 2004/02/17 14:00:52
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-02-17 17:41:18 IP:203.66.xxx.xxx 未訂閱
引言: var B,E,S:String; begin S:='11'; //部門 if MessageDlg('Are you Sure Delete Record ?',mtConfirmation, [mbYes,mbNO],0)=mrYes then begin try B:=ADOQuery1.FieldByName('proNo').AsString; ADOQuery1.Next; if ADOQuery1.Eof then ADOQuery1.Prior; E:=ADOQuery1.FieldByName('proNo').AsString; ADOQuery11.SQL.Add('delete product where department=''' S ''' '); ADOQuery11.SQL.Add(' and prono=''' B ''' '); ADOQuery11.ExecSQL; ADOQuery11.Close; ADOQuery1.Close; ADOQuery1.Open; ????????????? 問題 DELETE失敗有何語法可判斷不去run ADOQuery1.Locate..... 如if DELETE失敗 then begin ADOQuery1.Locate('Department;prono',VarArrayOf([S,E]),[]); end; ????????????? except begin showmessage('其它資料庫有相映代號不可刪除'); ADOQuery1.Locate('Department;prono',VarArrayOf([S,B]),[]); end; end; end; 發表人 - lilisn 於 2004/02/17 14:00:52
抱歉,能否詳述一下您的問題,我現在一頭霧水了??? ---- 我只會兩件事,這也不會,那也不會 ---- 眼見不一定為真
lilisn
一般會員


發表:35
回覆:62
積分:24
註冊:2003-03-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-02-17 18:15:16 IP:61.228.xxx.xxx 未訂閱
原本程式 var B,E,S:String; begin S:='11'; //部門 if MessageDlg('Are you Sure Delete Record ?',mtConfirmation, [mbYes,mbNO],0)=mrYes then begin try B:=ADOQuery1.FieldByName('proNo').AsString; ADOQuery1.Next; if ADOQuery1.Eof then ADOQuery1.Prior; E:=ADOQuery1.FieldByName('proNo').AsString; ADOQuery11.SQL.Add('delete product where department=''' S ''' '); ADOQuery11.SQL.Add(' and prono=''' B ''' '); ADOQuery11.ExecSQL; ADOQuery11.Close; ADOQuery1.Close; ADOQuery1.Open; ADOQuery1.Locate('Department;prono',VarArrayOf([S,E]),[]); except begin showmessage('其它資料庫有相映代號不可刪除'); ADOQuery1.Locate('Department;prono',VarArrayOf([S,B]),[]); end; end; end; 對不起,表達不清楚,造成困擾 當DELETE失敗指標會先指還是會RUN 下一行[AA] ADOQuery1.Locate('Department;prono',VarArrayOf([S,E]),[]); [AA] 而 EXCEPT 之後我必需 showmessage('其它資料庫有相映代號不可刪除'); 指標只向[AA],我必需在指回原來REOCRD ADOQuery1.Locate('Department;prono',VarArrayOf([S,B]),[]); 雖然可行,但不知有何寫法可達到更簡單一點: .... .... IF .....(指刪除成功) THEN ADOQuery1.Locate('Department;prono',VarArrayOf([S,E]),[]); except showmessage('其它資料庫有相映代號不可刪除'); 謝謝大家 .....
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-02-19 10:37:27 IP:203.66.xxx.xxx 未訂閱
引言: 對不起,表達不清楚,造成困擾 當DELETE失敗指標會先指還是會RUN 下一行[AA] ADOQuery1.Locate('Department;prono',VarArrayOf([S,E]),[]); [AA] 而 EXCEPT 之後我必需 showmessage('其它資料庫有相映代號不可刪除'); 指標只向[AA],我必需在指回原來REOCRD ADOQuery1.Locate('Department;prono',VarArrayOf([S,B]),[]); 雖然可行,但不知有何寫法可達到更簡單一點: .... .... IF .....(指刪除成功) THEN ADOQuery1.Locate('Department;prono',VarArrayOf([S,E]),[]); except showmessage('其它資料庫有相映代號不可刪除'); 謝謝大家 .....
改變一下思維邏輯,在 BeforeDelete Event 寫入判斷 '其它資料庫有相映代號不可刪除'的邏輯,這樣就不用再移動 REOCRD Cursor 了,不知道會不會簡化問題,站內有一篇文章討論關於 FK 的討論,跟您的問題很類似 (忘了連結了,Sorry) ---- 我只會兩件事,這也不會,那也不會 ---- 眼見不一定為真
系統時間:2024-06-29 13:39:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!