![]() |
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:
Ich gebe eine Rufnummer im Amerikanischen Format xxx-xxx-xxxx ein. Die Tabelle ist bisher noch leer.
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; |
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:
Getippt und nicht getestet.
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; Freundliche Grüße |
Re: Stackoverflow Fehler bei SQL.Active := True
Keine parametrisierten Abfragen bei ADS? :gruebel:
|
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.
|
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. |
Re: Stackoverflow Fehler bei SQL.Active := True
*Push*
|
Re: Stackoverflow Fehler bei SQL.Active := True
Ein Mimimal-Bsp. mit angehängter Datenbank,
ansonsten ... was erwartest du ??? Heiko |
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:
Active ist halt false... und das handle ist invalide. also hätte man offenbar das irgendwo vorher ändern sollen, kann das sein?
{ 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; @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. |
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! |
Re: Stackoverflow Fehler bei SQL.Active := True
Zitat:
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 21:19 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