Я работаю на Delphi 7 + SQLServerBDE против ADO базы данных Ошибки обработки
в BDE всех баз данных, связанные связанная с erros может быть обработана с использованием EDatabaseError
try
//all database related operations
Except
on EDatabaseError do
begin
showmessage(e.message)
end;
End;
но в ADO я попробовал разные примеры, и у меня возникают разные ошибки, такие как EOleError/EDatabaseError/...
Я пробовал ниже 2 точки, чтобы поднять ошибки в ADO, и у меня возникли разные ошибки
1) В хранимой процедуре сервера sql я поднимаю ошибку в первой строке. когда я выполняю эту процедуру, используя TADOStoredProc в delphi я получаю EOleError.
2) В TADOQuery я написал соврет SQL так, когда я открытьTADOQuery я получаю EDatabaseError.
так что теперь я смущен, как обращаться с ошибками ADO. Я не хочу проверять все ошибки (EOleError, EDatabaseError, EAdoError ...) в каждой форме, поэтому я написал 2 примера, Пожалуйста, предложите мне, какой из них хорош. если вы ошибаетесь, пожалуйста, дайте мне хороший пример.
Пример 1:
Здесь я показывать только одну форму в примере так Delphi Процедура HandleErrors и функция GetErrorDescription может выглядеть глупо. Я не хочу писать один и тот же кусок кода во всех формах. Когда дело доходит до реального сценария, я собираюсь сохранить Delphi Процедура HandleErrors и функция GetErrorDescription на разных устройствах и использовать этот модуль по всему приложению.
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
Procedure HandleErrors(e: Exception);
function GetErrorDescription : WideString;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.GetErrorDescription : WideString;
var
LastErrorIndex : Integer;
begin
LastErrorIndex :=ADOConnection1.Errors.Count-1;
Result:=ADOConnection1.Errors.Item[LastErrorIndex].Description;
//Code :=ADOConnection1.Errors.Item[LastErrorIndex].NativeError;
end;
procedure TForm1.HandleErrors(e: Exception);
var
Code: Integer;
ErrorDescription: WideString ;
begin
if e is EOleError then
ShowMessage(GetErrorDescription)
else
if e is EDatabaseError then
ShowMessage(GetErrorDescription)
else
if e is EADOError then
ShowMessage(GetErrorDescription)
else
ShowMessage(GetErrorDescription)
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
try
// any database related operations
except
on E : Exception do
begin
HandleErrors(E);
end;
end;
end;
end.
Пример 2:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,ADODB, StdCtrls, DB,COMOBJ;
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
LastErrorIndex : Integer;
begin
try
// any database related operations
except
on E : Exception do
begin
LastErrorIndex :=ADOConnection1.Errors.Count-1;
ShowMessage(ADOConnection1.Errors.Item[LastErrorIndex].Description);
end;
end;
end;
end.
, который пример лучше. Не могли бы вы предложить хороший номер
«я не хочу, чтобы проверить все ошибки в каждой форме» Ну, это то, что вы будете иметь, чтобы сделать, если вы настаиваете на ввод AdoConnections и наборов данных в формах. Это не место для них (за исключением небольших тестовых стендов). Поместите (централизовать) их в DataModule и привыкнете к их доступу из ваших форм. Btw, мой ответ на ваш q вчера показал вам, как реализовать централизованный обработчик исключений (см. Ссылку на Application.OnException в коде). – MartynA
@MartynA: (+ 1) Я работаю над старым приложением, которое имеет множество и множество наборов данных в формах, и я не хочу сейчас переместить все эти вещи в модуль данных. поэтому я проверяю, как обрабатывать исключения. Я проверю Application.OnException. Большое спасибо. – DelphiLearner
@MartynA: нормально ли идти с примером 2? – DelphiLearner