AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Stackoverflow Fehler bei SQL.Active := True
Thema durchsuchen
Ansicht
Themen-Optionen

Stackoverflow Fehler bei SQL.Active := True

Ein Thema von Mackhack · begonnen am 8. Jul 2007 · letzter Beitrag vom 10. Jul 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#1

Stackoverflow Fehler bei SQL.Active := True

  Alt 8. Jul 2007, 07:05
Datenbank: ADS • Version: 8.x • Zugriff über: SQL, ADSTable, ADSQuery
Hallo DPler,

weis jemand was hier falsch ist?

Delphi-Quellcode:
function TFrmMain.IsPhoneNoValid(aPhoneNumber: String): Boolean;
var
  I: Integer;
  NumCount: Integer;
  DashCount: Integer;
begin
  Result := False;
  NumCount := 0;
  DashCount := 0;
  for I := 1 to Length(aPhoneNumber) do
  begin
    case aPhoneNumber[I] of
      '0'..'9': Inc(NumCount, 1);
      '-': Inc(DashCount, 1);
    end;
  end;
  if ( (NumCount <> 10) and (DashCount <> 2) ) then
  begin
    ShowMessage('Phone number does not match US standard pattern!');
    Result := False;
  end
  else
  begin
    Result := True;
  end;
end;

procedure TFrmMain.PItmAddPhoneClick(Sender: TObject);
var
  PhoneNo: String;
begin
  //Input phone number
  PhoneNo := InputBox('Add Phone Number', 'Please add a valide phone number', '');
  if ( PhoneNo <> '' ) then
  begin
    //Check whether phone number is valid or not
    if ( not IsPhoneNoValid(PhoneNo) ) then
    begin
      Exit;
    end;
    with DBModule.Query do
    begin
      //Check whether phone number is present already or not
      Active := False;
      SQL.Text := 'SELECT COUNT(Phone) AS PhoneCount FROM ComMeth WHERE Phone=' + PhoneNo;
      Active := True; [color=#ff0000]<====== Hier kommt ein StackOverflow Fehler[/color]
      if ( FieldByName('PhoneCount').AsInteger > 0 ) then
      begin
        ShowMessage('This phone number exists already');
        Exit;
      end;
      Active := False;
      SQL.Text := 'INSERT INTO ComMeth (Phone) VALUES (' + PhoneNo + ')';
    end;
  end;
end;
Ich gebe eine Rufnummer im Amerikanischen Format xxx-xxx-xxxx ein. Die Tabelle ist bisher noch leer.
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Stackoverflow Fehler bei SQL.Active := True

  Alt 8. Jul 2007, 09:05
Hallo Tobias,

die Fehlerursache dürften die fehlenden single quotes um den string PhoneNo sein.

Bei mir würde dein Code etwa so aussehen:

Delphi-Quellcode:
uses
  Masks;

procedure TDemoForm.NewButtonClick(Sender: TObject);
const
  FMT_SEL = 'SELECT * FROM ComMeth WHERE Phone = %s';
  FMT_INS = 'INSERT INTO ComMeth (Phone) VALUES (%s)';
  FMT_ERR = 'Phone number already exists.'#13#13'%s';
var
  sPhone: string;
begin
  sPhone := Trim(InputBox('Add Phone Number', 'Please add a valid phone number', ''));
  if (sPhone = '')
  or not MatchesMask(sPhone, '[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]') then
    Exit;
  with DBModule.Query do
  begin
    SQL.Text := Format(FMT_SEL, [QuoteStr(sPhone)]);
    Open;
    if IsEmpty then
    begin
      SQL.Text := Format(FMT_INS, [QuotedStr(sPhone)]);
      ExecSQL;
    end else
    begin
      ShowMessage(Format(FMT_ERR, [sPhone]));
      Close;
    end;
  end;
end;
Getippt und nicht getestet.

Freundliche Grüße
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Stackoverflow Fehler bei SQL.Active := True

  Alt 8. Jul 2007, 10:45
Keine parametrisierten Abfragen bei ADS?
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Stackoverflow Fehler bei SQL.Active := True

  Alt 8. Jul 2007, 13:24
Die Frage lautet doch, wieso ein Stackoverflow auftritt. Normalerweise passiert das doch nur bei einer rekursiven Endlosschleife. Ich würde mal schauen, ob die Query irgendwelche Events (AfterOpen, BeforeOpen, OnCalcFields) verwendet, und was DIESE Events dann anstellen.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#5

Re: Stackoverflow Fehler bei SQL.Active := True

  Alt 8. Jul 2007, 20:08
Hallo Marabu,

vielen Dank fuer deinen Code. Ausser einem fehlenden 'd' war alles ok. NUR, der Stackoverflow kommt immer noch.
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#6

Re: Stackoverflow Fehler bei SQL.Active := True

  Alt 9. Jul 2007, 22:03
*Push*
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Stackoverflow Fehler bei SQL.Active := True

  Alt 9. Jul 2007, 23:10
Ein Mimimal-Bsp. mit angehängter Datenbank,

ansonsten ...

was erwartest du ???


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Stackoverflow Fehler bei SQL.Active := True

  Alt 9. Jul 2007, 23:17
Hallo,

hab mal in ein sample-projekt ein wenig reingedebuggt. und tatsächlich rekursiert sich das ADS zu tode.

Er springt immer wieder in TAdsQuery.OpenAdvantageFiles.

Und zwar sehr zuverlässig

Er springt von OpenAdvantageFiles zuerst nach InternalExecute. Dann nach SetParamsFromCursor. Dort greift er auf... DataSet.FieldDefs zu und merkt anscheinend, dass er das initialisieren muss: TAdsDataSet.InitFieldDefs. und von dort ruft er dann... tadaaa! OpenAdvantageFiles auf.

und zwar aufgrund anscheinend einer validierung:

Delphi-Quellcode:
{  if the table is not active then open a temporary table handle }
   {  otherwise get the active table handle }
   if ( Active ) OR ( Handle <> INVALID_ACE_HANDLE ) then
   begin
      bTempHandle := False;
      hHoldHandle := self.Handle;
   end
   else
   begin
      bTempHandle := True;
      hHoldHandle := OpenAdvantageFiles; //böse!
   end;
Active ist halt false... und das handle ist invalide. also hätte man offenbar das irgendwo vorher ändern sollen, kann das sein?

@hoika: ja, an dem häng ich grad dran wie die katze am pressack, wie man bei uns in bayern so schön sagt. ist im moment sozusagen closed source, es sei denn mackhack entscheidet sich zu was anderem.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#9

Re: Stackoverflow Fehler bei SQL.Active := True

  Alt 10. Jul 2007, 02:32
Hi Luke,

heisst das nun es ist ein Fehler von ADS (Extended-System) oder von mir?

In jedem Falle... was kann man dagegen tun?

Ich werd die Tabellen nochmal neu aufbauen dann stell ichs gern rein hier!
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
678 Beiträge
 
Delphi 12 Athens
 
#10

Re: Stackoverflow Fehler bei SQL.Active := True

  Alt 10. Jul 2007, 09:16
Zitat von Mackhack:
Hi Luke,
heisst das nun es ist ein Fehler von ADS (Extended-System) oder von mir?
In jedem Falle... was kann man dagegen tun?
Ich werd die Tabellen nochmal neu aufbauen dann stell ichs gern rein hier!
Extended Systems ist nicht mehr
Solltest du das Problem in einem kleinen Projekt nachstellen können, so schicke es bitte auch an uns (mailto:advantagesupport@ianywhere.de).
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz