Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Stackoverflow Fehler bei SQL.Active := True (https://www.delphipraxis.net/95518-stackoverflow-fehler-bei-sql-active-%3D-true.html)

Mackhack 8. Jul 2007 06:05

Datenbank: ADS • Version: 8.x • Zugriff über: SQL, ADSTable, ADSQuery

Stackoverflow Fehler bei SQL.Active := True
 
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.

marabu 8. Jul 2007 08:05

Re: Stackoverflow Fehler bei SQL.Active := True
 
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

DGL-luke 8. Jul 2007 09:45

Re: Stackoverflow Fehler bei SQL.Active := True
 
Keine parametrisierten Abfragen bei ADS? :gruebel:

alzaimar 8. Jul 2007 12:24

Re: Stackoverflow Fehler bei SQL.Active := True
 
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.

Mackhack 8. Jul 2007 19:08

Re: Stackoverflow Fehler bei SQL.Active := True
 
Hallo Marabu,

vielen Dank fuer deinen Code. Ausser einem fehlenden 'd' war alles ok. NUR, der Stackoverflow kommt immer noch.

Mackhack 9. Jul 2007 21:03

Re: Stackoverflow Fehler bei SQL.Active := True
 
*Push*

hoika 9. Jul 2007 22:10

Re: Stackoverflow Fehler bei SQL.Active := True
 
Ein Mimimal-Bsp. mit angehängter Datenbank,

ansonsten ...

was erwartest du ???


Heiko

DGL-luke 9. Jul 2007 22:17

Re: Stackoverflow Fehler bei SQL.Active := True
 
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.

Mackhack 10. Jul 2007 01:32

Re: Stackoverflow Fehler bei SQL.Active := True
 
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!

joachimd 10. Jul 2007 08:16

Re: Stackoverflow Fehler bei SQL.Active := True
 
Zitat:

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).


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:18 Uhr.
Seite 1 von 2  1 2      

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