SELECT * FROM Vzakladke.net

Статьи об автоматизации и программировании


Перехват ошибок SQL на Delphi в ADOConnection

 

 

Перехват ошибок SQL на Delphi при работе с компонентом ADO

Механизм, как "запретить - разрешить" выводить сообщение об ошибке подключения программы на Delphi через SQL через компонент TADOConnection.

Типичная обработка ошибки заключается в том, чтобы обрамить блоки кода в конструкции try..except или try..finally. Однако, многие попросту не делают этого, так как им недосуг или обработка исключений оставляется "на потом".

 

Чтобы не выводить сообщения об ошибке можно написать такой код, используя конструкцию "try-finally":

 
procedure TAnswerList.Update(ADO : TADOQuery);
begin
with ADO do
begin
if Active then Close;
SQL.Text:=concat('UPDATE ANSWER_LIST SET ',
'NAME = "', self.Name, ', ',
'NOMER_ID = "', IntToStr(self.Nomer), ', ',
'CREDITOR_ID = "', IntToStr(self.CreditorId), ' ',
'WHERE ID = ' + IntToStr(self.id));
try
ExecSQL;
finally
end;
end;
end;

 

Чтобы грамотно вывести сообщение об ошибке можно использовать другую конструкцию:

 

procedure TAnswerList.Update(ADO : TADOQuery);
begin
with ADO do
begin
if Active then Close;
SQL.Text:=concat('UPDATE ANSWER_LIST SET ',
'NAME = "', self.Name, ', ',
'NOMER_ID = "', IntToStr(self.Nomer), ', ',
'CREDITOR_ID = "', IntToStr(self.CreditorId), ' ',
'WHERE ID = ' + IntToStr(self.id));
try
ExecSQL;
except
On E:Exception Do
begin
ShowMessage(concat('Update answer list failure. ',e.Message,#13#10,SQL.Text));
Exit;
end;
end;
end;

 

 

Как вариант, Вы можете использовать свойство Application.OnException, которое является глобальным обработчиком событий приложения. 

Для этого предлагается оформить обработку исключений в отдельный компонент.

 

unit sExceptionsCatcher;


{***} interface {***}

uses Classes, SysUtils, JPEG;

type
  TsExceptionsCatcher = class(TComponent)
  private
    FEnabled: boolean;
    FGenerateScreenshot: boolean;
    FJPEGScreenshot: boolean;
    FJpegQuality: TJPEGQualityRange;
    FCollectInfo: boolean;
    Fn: TFilename;
    procedure SetEnabled(const Value: boolean);
    { Private declarations }
  protected
    { Protected declarations }
    procedure EnableCatcher;
    procedure DisableCatcher;
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Catcher(Sender: TObject; E: Exception);
  published
    { Published declarations }
    property Enabled: boolean read FEnabled write SetEnabled
                      default False;
  end;

procedure Register;

{***} implementation {***}

uses Windows, Forms, Dialogs, Graphics;

procedure Register;
begin
  RegisterComponents(\'Catch Exceptions\', [TsExceptionsCatcher]);
end;

{ TsExceptionsCatcher }
constructor TsExceptionsCatcher.Create(AOwner: TComponent);
begin
  inherited;
end;

destructor TsExceptionsCatcher.Destroy;
begin
  DisableCatcher;
  inherited;
end;

procedure TsExceptionsCatcher.SetEnabled(const Value: boolean);
begin
  FEnabled := Value;
  if Enabled then EnableCatcher else DisableCatcher;
end;

procedure TsExceptionsCatcher.DisableCatcher;
begin
  Application.OnException := nil;
end;

procedure TsExceptionsCatcher.EnableCatcher;
begin
  Application.OnException := Catcher;
end;

procedure TsExceptionsCatcher.Catcher(Sender: TObject; E: Exception);
begin
  {TODO: Write some exception handling code}
end;

end.

 

 

Реализация функций 

 

 

// скриншот активного окна
procedure TsExceptionsCatcher.DoGenerateScreenshot;
var bmp: TBitmap;
    jpg: TJPEGImage;
begin
  bmp := Screen.ActiveForm.GetFormImage;
  begin
    jpg := TJPEGImage.Create;
    jpg.CompressionQuality := 100;
    jpg.Assign(bmp);
    jpg.SaveToFile(fn+\'.jpg\');
    FreeAndNil(jpg);
  end;
  FreeAndNil(bmp);
end;

 

 


// отчет, в котором будут указаны имя компьютера и имя текущего пользователя
function TsExceptionsCatcher.CollectUserName: string;
var
  uname: pchar;
  unsiz: cardinal;
begin
  uname := StrAlloc(255);
  unsiz := 254;
  GetUserName(uname,unsiz);
  if (unsiz > 0) then
    Result := string(uname) else
    Result := \'n/a\';
  StrDispose(uname);
end;

function TsExceptionsCatcher.CollectComputerName: string;
var
  cname: pchar;
  cnsiz: cardinal;
begin
  cname := StrAlloc(MAX_COMPUTERNAME_LENGTH + 1);
  cnsiz := MAX_COMPUTERNAME_LENGTH + 1;
  GetComputerName(cname,cnsiz);
  if (cnsiz > 0) then
    Result := string(cname) else
    Result := \'n/a\';
  StrDispose(cname);
end;

 

 


// Процедура создает объект класса TStringList, наполняет его информацией, которую надо записать и сохраняет в файл, 
// с именем, аналогичном имени файла со скриншотом
procedure TsExceptionsCatcher.DoCollectInfo(E: Exception);
var sl: TStringList;
begin
  sl := tstringlist.Create;
  sl.add(\'--- This report is created by automated \'+
         \'reporting system.\');
  sl.add(\'Computer name is: [\'+ComputerName+\']\');
  sl.add(\'User name is: [\'+UserName+\']\');
  sl.add(\'--- End of report ----------------------\'+
         \'-----------------\');
  sl.SaveToFile(Fn+\'.txt\');
end;

 

Дата публикации: 2015-05-12 10:36:28

Delphi

1

Отзывы:

Ваше имя:

Ваш e-mail (необязательно):

Сообщение:

Captcha