Evo jedan konkretan slikovit primer:
(baza je employee.fdb)
Procedura koja se izvrsava ADD_EMP_PROJ:
Code:
BEGIN
BEGIN
INSERT INTO employee_project (emp_no, proj_id) VALUES (:emp_no, :proj_id);
WHEN SQLCODE -530 DO
EXCEPTION unknown_emp_id;
END
SUSPEND;
END
Izuzetak unknown_emp_id:
Code:
CREATE EXCEPTION UNKNOWN_EMP_ID 'Invalid employee number or project id.';
Delphi kod kojim izvršavam gore navedenu proceduru:
Code:
procedure TForm1.btnExecuteClick(Sender: TObject);
begin
try
//SQLDataSet2 - Stored Procedure ADD_EMP_PROJ
SQLDataSet2.Params.ParamByName('EMP_NO').AsInteger := -1; //namerno unet nepostojeci EMP_NO, da bi se izazvao izuzetak
SQLDataSet2.Params.ParamByName('PROJ_ID').AsString := 'ABCDE';
SQLDataSet2.ExecSQL();
except
on E: Exception do
MessageDlg(E.Message, mtError, [mbOK], 0);
end;
end;
Delphi daje sledeću poruku:
Citat:
Database Server Error: exception 1 UNKNOWN_EMP_ID
Invalid employee number or project id.
At procedure 'ADD_EMP_PROJ'
Da li je moguće izvući samo Exception Text, tj. "Invalid employee number or project id.", a ne kompletan E.Message?
Druga situacija je slična kao u prethodnom primeru, ali ovaj put se koristi ClientDataSet i unos preko DBGrid-a:
Code:
procedure TForm1.btnApplyUpdatesClick(Sender: TObject);
begin
try
ClientDataSet1.ApplyUpdates(0);
except
on E: Exception do
MessageDlg(E.Message, mtError, [mbOK], 0);
end;
end;
Kako u ovom slučaju doći do teksta izuzetka iz prethodnog primera?
PS. Klik na btnApplyUpdates ne vraća nikakvu poruku, ali naravno loši podaci neće biti zapisani u bazu.
@MatezYU: Predlog za IBEvents mi se sviđa, moraću i to da probam, pogotovo što nudi mnogo više od ovoga što sam hteo.