如何攔截關聯性資料庫Delete產生錯誤訊息? |
尚未結案
|
lilisn
一般會員 發表:35 回覆:62 積分:24 註冊:2003-03-09 發送簡訊給我 |
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 發送簡訊給我 |
引言: 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 發送簡訊給我 |
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 發送簡訊給我 |
引言: 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 發送簡訊給我 |
原本程式
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 發送簡訊給我 |
引言: 對不起,表達不清楚,造成困擾 當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) ---- 我只會兩件事,這也不會,那也不會 ---- 眼見不一定為真 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |