2017-01-14 2 views
0

Я работаю на 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. 

, который пример лучше. Не могли бы вы предложить хороший номер

+1

«я не хочу, чтобы проверить все ошибки в каждой форме» Ну, это то, что вы будете иметь, чтобы сделать, если вы настаиваете на ввод AdoConnections и наборов данных в формах. Это не место для них (за исключением небольших тестовых стендов). Поместите (централизовать) их в DataModule и привыкнете к их доступу из ваших форм. Btw, мой ответ на ваш q вчера показал вам, как реализовать централизованный обработчик исключений (см. Ссылку на Application.OnException в коде). – MartynA

+0

@MartynA: (+ 1) Я работаю над старым приложением, которое имеет множество и множество наборов данных в формах, и я не хочу сейчас переместить все эти вещи в модуль данных. поэтому я проверяю, как обрабатывать исключения. Я проверю Application.OnException. Большое спасибо. – DelphiLearner

+0

@MartynA: нормально ли идти с примером 2? – DelphiLearner

ответ

0

Как я уже сказал в комментарии, вы не должны разбрасывать AdoConnections и наборы данных по нескольким формам/Вместо этого вы должны поместить их в datamodule, а затем использовать блок данных в единицах ваших форм. Таким образом, вы сможете подключить TDataSources и db-aware компоненты в форме к наборам данных datamodule.

Другое, что вы можете сделать, это установить обработчик исключений для всей среды для централизации обработки исключений, если это то, что вы хотите сделать. Объект Delphi Application имеет событие OnException, которое вы можете назначить своему собственному обработчику исключений, используя код, показанный ниже.

Недостатком обработчика исключений для всего приложения является то, что в обработчике OnException может быть сложно определить, какой из ваших объектов отвечает за причинение исключения.

type 
    TMainForm = class(TForm) 
    [...] 
    procedure FormCreate(Sender: TObject); 
    private 
    procedure ApplicationException(Sender: TObject; E: Exception); 
    public 
    end; 

procedure TMainForm.FormCreate(Sender: TObject); 
begin 
    Application.OnException := ApplicationException; 
end; 

procedure TMainForm.ApplicationException(Sender: TObject; E: Exception); 
var 
    AErrors : Errors; 
    AError : Error; 
    i : Integer; 
    S : String; 
begin 
    Caption := 'Exception'; 
    if E is EDatabaseError then begin 
    AErrors := DataModule1.AdoQuery1.Connection.Errors; 
    for i := 0 to AErrors.Count - 1 do begin 
     AError := AErrors.Item[i]; 
     S := Format('Number: %d, NativeError: %d, source: %s, description: %s', 
     [AError.Number, AError.NativeError, AError.Source, AError.Description]); 
     Memo1.Lines.Add(S); 
    end; 
    end; 
end; 
Смежные вопросы