Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi EAccessViolation beim beenden (https://www.delphipraxis.net/5548-eaccessviolation-beim-beenden.html)

wo0zy 10. Jun 2003 23:24


EAccessViolation beim beenden
 
Hi,
hab da mal ein Problem bei meinem Adress-tool.

undzwar läuft bis jetzt alles wunderbar, doch wenn ich das Programm schließe dann kommt immer ne Fehlermeldnung in der was von EAccessViolation steht.
Hier mal der Code, vieleicht findet ihr da ja was raus!
Code:
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ComCtrls, StdCtrls, DB, ZQuery, ZMySqlQuery, ZConnect,
  ZMySqlCon, ZTransact, ZMySqlTr;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    Hilfe1: TMenuItem;
    Einstellungen1: TMenuItem;
    Zugangsdaten1: TMenuItem;
    ListView1: TListView;
    StatusBar1: TStatusBar;
    Hilfe2: TMenuItem;
    N1: TMenuItem;
    Info1: TMenuItem;
    edName: TEdit;
    Label1: TLabel;
    edEmail: TEdit;
    Label2: TLabel;
    edTelefon: TEdit;
    Label3: TLabel;
    edFax: TEdit;
    Label4: TLabel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    trMain: TZMySqlTransact;
    qrMain: TZMySqlQuery;
    dsMain: TDataSource;
    dbMain: TZMySqlDatabase;
    edID: TEdit;
    Label5: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Connect;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button3Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Connect;
begin
  dbMain.Host:='********';
  dbMain.login:='********';
  dbMain.Password:='********';
  dbMain.Database:='delphi';
  dbMain.Connected:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  connect;
  try
    qrMain.Sql.Text:='INSERT INTO `telebase` (`id`,`name`,`email`,`telefon`,`fax`) '+
                      'VALUES '+
                      '('''','''+edName.Text+''','''+edEmail.Text+
                      ''', '''+edTelefon.Text+''','''+edFax.Text+
                      ''');';
    qrMain.ExecSql;
  finally
    dbMain.Connected:=false;
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  dbMain.Connected:=false;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  connect;
  try
    qrMain.Sql.Text:='DELETE FROM `telebase` WHERE `id`='+edID.Text+';';
    qrMain.ExecSql;
  finally
    dbMain.Connected:=false;
  end;
end;

end.
ich hab auch schon versucht beim onClose der Form von der Datenbank zu disconnecten, aber das brachte absolut keine Veränderung.

Specialwork 10. Jun 2003 23:42

Hallo wo0zy,

Zunächst einmal solltest Du die Connect Methode in Deinem Try finally Block unterbringen.

Dann Solltest Du vor einem Disconnect Abfragen, ob die Verbindung noch besteht.

Überarbeitet sieht das so aus:

Delphi-Quellcode:
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ComCtrls, StdCtrls, DB, ZQuery, ZMySqlQuery, ZConnect,
  ZMySqlCon, ZTransact, ZMySqlTr;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    Hilfe1: TMenuItem;
    Einstellungen1: TMenuItem;
    Zugangsdaten1: TMenuItem;
    ListView1: TListView;
    StatusBar1: TStatusBar;
    Hilfe2: TMenuItem;
    N1: TMenuItem;
    Info1: TMenuItem;
    edName: TEdit;
    Label1: TLabel;
    edEmail: TEdit;
    Label2: TLabel;
    edTelefon: TEdit;
    Label3: TLabel;
    edFax: TEdit;
    Label4: TLabel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    trMain: TZMySqlTransact;
    qrMain: TZMySqlQuery;
    dsMain: TDataSource;
    dbMain: TZMySqlDatabase;
    edID: TEdit;
    Label5: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Connect;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button3Click(Sender: TObject);
  private
    { Private-Deklarationen } 
  public
    { Public-Deklarationen } 
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm} 

procedure TForm1.Connect;
begin
  dbMain.Host:='********';
  dbMain.login:='********';
  dbMain.Password:='********';
  dbMain.Database:='delphi';
  dbMain.Connected:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    Connect;

    qrMain.Sql.Clear;
    qrMain.Sql.Add('INSERT INTO `telebase` (`id`,`name`,`email`,`telefon`,`fax`) ');
    qrMain.Sql.Add('VALUES ');
    qrMain.Sql.Add('('''','''+edName.Text+''','''+edEmail.Text);
    qrMain.Sql.Add(''', '''+edTelefon.Text+''','''+edFax.Text+''');');

    qrMain.ExecSql;
  finally
    if qrMain.Connected=True then dbMain.Connected:=false;
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if qrMain.Connected=True then dbMain.Connected:=false;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  try
    Connect;

    qrMain.Sql.Clear;
    qrMain.Sql.Add('DELETE FROM `telebase` WHERE `id`='+edID.Text+';');

    qrMain.ExecSql;
  finally
    if qrMain.Connected=True then dbMain.Connected:=false;
  end;
end;

end.
Gruß, Tom

wo0zy 11. Jun 2003 11:49

Hi,
ich hab das mal ausprobiert, doch leider hat da zu keinem Ergebnis geführt.
Gibts da vieleicht noch irgendetwas anderes woran es liegen könnte?

Phoenix 11. Jun 2003 13:44

Hast Su schonmal versucht, da reinzudebuggen?

Haltepunkt aufs FormClose und dann mal gucken, bei welcher Zeile er die AccVio bringt.

wo0zy 12. Jun 2003 14:09

also ich hab das jetzt mal versucht, aber iregendwie war das ganz schön merkwürdig, er hat alle units von zeos durchlaufen die benötigt wurden, und dann is raus gekommen das bei query.free diese meldung kommt. aber es muss an meinem code liegen denn ich hab schon 2 andere programme mit den gleichen komponenten geschrieben und da kam sowas nicht.

Specialwork 12. Jun 2003 23:40

Hallo wo0zy,

Überprüfe mal durch Debuggen, ob sich an der Stelle, wo query.free aufgerufen wird, Query = nil ist.

Gruß, Tom


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz