Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Stack-Überlauf? (https://www.delphipraxis.net/13028-stack-ueberlauf.html)

yoshie 9. Dez 2003 17:59


Stack-Überlauf?
 
Hi Leute und zwar habe ich ein klines Problem, immer wenn ich meine SQL Datenbank auslesen will kommt folgender fehler.

IM Project1.exe ist eine Exception der Klasse EStackOverflow aufgtreten. Meldung: 'Stack-Überlauf' Prozess wurde angehalten. Mit einzellne Anweisung oder Start fortsetzen.

Ich habe folgenden Quelltext.

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    dbmain: TZMySqlDatabase;
    trmain: TZMySqlTransact;
    qrmain: TZMySqlQuery;
    ds: TDataSource;
    host: TEdit;
    user: TEdit;
    passwort: TEdit;
    database: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    anlegen: TButton;
    eintragen: TButton;
    anzeigen: TButton;
    StringGrid1: TStringGrid;
    procedure anlegenClick(Sender: TObject);
    procedure eintragenClick(Sender: TObject);
    procedure anzeigenClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.anlegenClick(Sender: TObject);
begin
  dbMain.Host:=host.Text; //Server
  dbMain.Login:=user.Text; //Benutzername
  dbMain.Password:=passwort.Text; //Passwort
  dbMain.Database:=database.Text; //Name der Datenbank
  dbMain.Connected:=True; //Verbindung herstellen
  try
      qrMain.SQL.Text:='CREATE TABLE `adressbuch` ('+
                   '`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,'+
                   '`vorname` TEXT NOT NULL,'+
                   '`name` TEXT NOT NULL,'+
                   '`adresse` TEXT NOT NULL,'+
                   '`wohnort` TEXT NOT NULL,'+
                   '`plz` int NOT NULL'+
                   ');';
  qrMain.ExecSql;

finally
    dbMain.Connected:=False;
  end;

end;

procedure TForm1.eintragenClick(Sender: TObject);
begin
 dbMain.Host:=host.Text; //Server
  dbMain.Login:=user.Text; //Benutzername
  dbMain.Password:=passwort.Text; //Passwort
  dbMain.Database:=database.Text; //Name der Datenbank
  dbMain.Connected:=True; //Verbindung herstellen
  try

  qrMain.SQL.Text:='INSERT INTO `adressbuch` '+
                    '(`id`, `vorname`, `name`, `adresse`, `wohnort`, `plz`)'+
                    ' VALUES '+
                    '('''', '''+edit1.Text+''', '''+edit2.Text+
                    ''', '''+edit3.Text+''', '''+edit4.Text+
                    ''', '''+edit5.Text+''');';

    qrMain.ExecSql; //SQL-Statement ausführen



finally
    dbMain.Connected:=False;
  end;

end;

procedure TForm1.anzeigenClick(Sender: TObject);
var
i, j,k :integer;
begin
  dbMain.Host:=host.Text; //Server
  dbMain.Login:=user.Text; //Benutzername
  dbMain.Password:=passwort.Text; //Passwort
  dbMain.Database:=database.Text; //Name der Datenbank
  dbMain.Connected:=True; //Verbindung herstellen
  qrmain.SQL.Text:='Select * from `adressbuch` order by name;';
  qrmain.Open;
  stringgrid1.rowcount:=0;
  stringgrid1.Cells[0,0] := 'id';
  stringgrid1.Cells[1,0] := 'Vorname:';
  stringgrid1.Cells[2,0] := 'Name:';
  stringgrid1.Cells[3,0] := 'Adresse:';
  stringgrid1.Cells[4,0] := 'Wohnort:';
  stringgrid1.Cells[5,0] := 'PLZ';
  k := qrmain.RecordCount;
  showmessage(inttostr(k));
for i := 1 to k do
 begin
 stringgrid1.RowCount := stringgrid1.RowCount + 1;

   stringgrid1.Cells[1,i] := qrMain.FieldByName('vorname').AsString;
   stringgrid1.Cells[2,i] := qrMain.FieldByName('name').AsString;
   stringgrid1.Cells[0,i] := qrMain.FieldByName('id').AsString;
   stringgrid1.Cells[3,i] := qrMain.FieldByName('adresse').AsString;
   stringgrid1.Cells[4,i] := qrMain.FieldByName('wohnort').AsString;
   stringgrid1.Cells[5,i] := qrMain.FieldByName('plz').AsString;
   qrmain.Next;

 end;

 qrmain.Close;

end;
end.
Könnt ihr mir vielleicht sagen was ich falsch gemacht habe?Ich kann halt keinen fehler erkennen, zumal ich vorher den selben quelltext hatte unnd da ging es danach habe ich meinen rechner formatiert und da war dann das problem siehe unten und dann hab ich das formular neu gemacht und seit dem geht es nicht mehr. wenn ich die alte exe vom vor dem formatieren aufrufe funktioniert es die neue geht nicht. Ich poste noch mal schnell mit dem quellteyt den ich zuerst hatte ist eigentlich hargenau der selbe.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DBTables, DB, StdCtrls, Grids, DBGrids,ComCtrls, ExtCtrls, DBCtrls,
  ZConnect, ZMySqlCon, ZQuery, ZMySqlQuery, ZTransact, ZMySqlTr;


type
  TForm1 = class(TForm)
    Btabanlegen: TButton;
    Ehost: TEdit;
    Euser: TEdit;
    Epw: TEdit;
    edb: TEdit;
    Host: TLabel;
    User: TLabel;
    Label3: TLabel;
    Database: TLabel;
    dsmain: TDataSource;
    beintragen: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Banzeigen: TButton;
    StringGrid1: TStringGrid;
    trmain: TZMySqlTransact;
    qrmain: TZMySqlQuery;
    dbmain: TZMySqlDatabase;
    procedure BtabanlegenClick(Sender: TObject);
    procedure beintragenClick(Sender: TObject);
    procedure BanzeigenClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BtabanlegenClick(Sender: TObject);
begin
  dbMain.Host:=ehost.Text; //Server
  dbMain.Login:=euser.Text; //Benutzername
  dbMain.Password:=epw.Text; //Passwort
  dbMain.Database:=edb.Text; //Name der Datenbank
  dbMain.Connected:=True; //Verbindung herstellen
  try
      qrMain.SQL.Text:='CREATE TABLE `adressbuch` ('+
                   '`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,'+
                   '`vorname` TEXT NOT NULL,'+
                   '`name` TEXT NOT NULL,'+
                   '`adresse` TEXT NOT NULL,'+
                   '`wohnort` TEXT NOT NULL,'+
                   '`plz` INT NOT NULL'+
                   ');';
  qrMain.ExecSql;

finally
    dbMain.Connected:=False;
  end;

end;

procedure TForm1.beintragenClick(Sender: TObject);
 begin
 dbMain.Host:=ehost.Text; //Server
  dbMain.Login:=euser.Text; //Benutzername
  dbMain.Password:=epw.Text; //Passwort
  dbMain.Database:=edb.Text; //Name der Datenbank
  dbMain.Connected:=True; //Verbindung herstellen
  try

  qrMain.SQL.Text:='INSERT INTO `adressbuch` '+
                    '(`id`, `vorname`, `name`, `adresse`, `wohnort`, `plz`)'+
                    ' VALUES '+
                    '('''', '''+edit1.Text+''', '''+edit2.Text+
                    ''', '''+edit3.Text+''', '''+edit4.Text+
                    ''', '''+edit5.Text+''');';

    qrMain.ExecSql; //SQL-Statement ausführen



finally
    dbMain.Connected:=False;
  end;

end;


procedure TForm1.BanzeigenClick(Sender: TObject);
var
i, j,k :integer;
begin
  dbMain.Host:=ehost.Text; //Server
  dbMain.Login:=euser.Text; //Benutzername
  dbMain.Password:=epw.Text; //Passwort
  dbMain.Database:=edb.Text; //Name der Datenbank
  dbMain.Connected:=True; //Verbindung herstellen
  qrmain.SQL.Text:='Select * from `adressbuch` order by name;';
  qrmain.Open;
  stringgrid1.rowcount:=0;
  stringgrid1.Cells[0,0] := 'id';
  stringgrid1.Cells[1,0] := 'Vorname:';
  stringgrid1.Cells[2,0] := 'Name:';
  stringgrid1.Cells[3,0] := 'Adresse:';
  stringgrid1.Cells[4,0] := 'Wohnort:';
  stringgrid1.Cells[5,0] := 'PLZ';
  k := qrmain.RecordCount;
  //showmessage(inttostr(k));
for i := 1 to k do
 begin
 stringgrid1.RowCount := stringgrid1.RowCount + 1;

   stringgrid1.Cells[1,i] := qrMain.FieldByName('vorname').AsString;
   stringgrid1.Cells[2,i] := qrMain.FieldByName('name').AsString;
   stringgrid1.Cells[0,i] := qrMain.FieldByName('id').AsString;
   stringgrid1.Cells[3,i] := qrMain.FieldByName('adresse').AsString;
   stringgrid1.Cells[4,i] := qrMain.FieldByName('wohnort').AsString;
   stringgrid1.Cells[5,i] := qrMain.FieldByName('plz').AsString;
   qrmain.Next;

 end;

 qrmain.Close;

end;


end.
Und 2. habe ich immer wieder das Problem, dass mir beim öffnen meines Programmes Delphi plötzlich sagt, dass ich das Formular nicht mehr öffnen kann. Und somit darf ich das ganze Formular neu machen, Quelltext bleibt erhalten. Ich arbeite mit den Zeos komponenten.

Wäre dankbar für Hilfe


grüße yosh

yoshie 9. Dez 2003 20:10

Re: Stack-Überlauf?
 
irgendwie habe ich immer das problem, d ass mir keiner antworten will/kann

Stanlay Hanks 9. Dez 2003 21:12

Re: Stack-Überlauf?
 
Hi. Der Thread is jetzt erst seit ein bisschen mehr als zwei Stunden offen. :wink:
Aber ich bin sicher, dass dir noch wer helfen wird. Ich persönlich möchte dir helfen, kanns aber leider nicht, weil ich noch nix mit SQL gemacht hab.

TIP: Häng deinen Source als Anhang an, dann muss man nicht soweit scrollen.

Man liest sich, Stanlay :hi:

SirThornberry 9. Dez 2003 21:28

Re: Stack-Überlauf?
 
An welcher Stelle genau kommt der Fehler?? sende einfach mal die zeile in der es auftritt. Wenn es direkt beim absenden des sql-befehls kommt, versuch mal an deine anweisung hinten " limit 50" anzuhängen und schau ob der fehler dann immer noch kommt. Ist das nicht der fall such mal ob du den stack irgendwo bei den compilerschaltern höher setzen kannst oder ob es eine funktion bei der verwendeten komponente gibt die, die ergebnismenge zwischenspeichert. (hatten den fehler auch schon allerdings nur 1 mal und der ist von selbst wieder verschwunden)

yoshie 9. Dez 2003 21:43

Re: Stack-Überlauf?
 
der fehler kommt sobald man den button betätigt, ich habe schon den sql befehl ausgeklammert und da kommt der fehler tortzdem ( mit limit 50 geht es auch nicht, gerade probiert .-(

SirThornberry 9. Dez 2003 21:53

Re: Stack-Überlauf?
 
sobald man WElCHEN Button klickt? du hast mehrere... und setz mal paar haltepunkte um zu sehen wo genau in der procedure des buttonclick der fehler kommt

yoshie 9. Dez 2003 21:54

Re: Stack-Überlauf?
 
wenn ich auf den button daten anzeigen klicke haltepunkte kann ich keine setzen, weil sofort bei dem procedureablauf das programm abstürzt

SirThornberry 9. Dez 2003 21:56

Re: Stack-Überlauf?
 
vielleicht hängts auch mit deinem zweiten problem zusammen. Sind alle packages richtig wieder eingebunden? lösche mal alle dcu-dateien und auch die projectdateien die beim compilieren angelegt werden. manchmal wird da zeug drin gespeichert was nicht mehr zutrifft.

yoshie 9. Dez 2003 22:04

Re: Stack-Überlauf?
 
hbae deinen rat befolgt, aber klappen tut es trotzdem nicht, ich verstehe es einfach nicht, als fehler auszuschließen ist die sql db denn mit der alten exe funnktioniert es ja, es regt mich einfach nuur auf

SirThornberry 9. Dez 2003 23:33

Re: Stack-Überlauf?
 
du solltest in jeder zeile deines onClick ereignisses mal einen haltepunkt setzen um nachvollziehen zu können nach welcher zeile der Fehler auftritt

yoshie 10. Dez 2003 15:25

Re: Stack-Überlauf?
 
und zwar kommt der fehler bei der zeile

qrmain.open;

eddy 11. Dez 2003 00:49

Re: Stack-Überlauf?
 
Hallo yoshie,

ich kann Dir zwar nicht in Deinem Quelltext weiterhelfen, aber diese Ausschrift habe ich für gewöhnlich dann erhalten, wenn Delphi anders funktioniert als wie ich mir das denke. Die von Dir genannte Fehlermeldung ist typisch für eine Art von Unendlich-Schleife in einer ungewollten Rekursion. Finden konnte ich solche üblen Fallen durch das Nutzung von F7 ab dem Stopp-Punkt.

mfg
eddy

mikhal 14. Dez 2003 10:54

Re: Stack-Überlauf?
 
Ich kenne MySQL nicht näher (ich denke jedenfalls, dass du MySQL verwendest), deshalb gestatte mir folgende Fragen:

1. Bist du sicher, daß der Tabellenname in Hochkommata gestzt werden muß, wenn du ein SQL-Statement formulierst?
2. Ist bei dir Auto-Commit auf dem SQL-Server eingeschaltet. Wenn nicht fehlt nach dem Insert-Statement ein Commit-Statement.
3. wegen 2. Kannst du überprüfen, ob überhaupt Daten in deine Tabelle geschrieben wurden?
4. Warum machst du dir selbst das Leben schwer und verwendest ein StringGrid. Verbinde dein TDataset mit einer DataSource und verwende ein DBGrid. Das sollte auch mit den ZEOS-Komponenten funktionieren.

Grüße
Mikhal

Edit: Ich habe eben gesehen, daß du auch die Spaltennamen in Hochkommata gesetzt hast. Wenn das bei MySQL tatsächlich gefordert wird, weicht das sehr vom SQL-Standard ab, wo Hochkommata bei Bezeichnern nur gesetzt werden, wenn der Tabellen oder Spaltenname einem geschützten Wort entsprechen.

Chewie 14. Dez 2003 11:19

Re: Stack-Überlauf?
 
Also ich bin bei MySQL auch ohne Hochkommata (sind das nicht eigentlich Akzente und keine Hochkommata?) um Tabellennamen ausgekommen.

yoshie 14. Dez 2003 17:12

Re: Stack-Überlauf?
 
der fehler lag bei dr installation der komponente, habe es neu installiert und dann hat es funktioniet


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:10 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