![]() |
Query wird zweimal ausgeführt
Ich habe eine mySQL Datenbank und benutze dazu die mysql.pas aus Chewies Tutorial. Ich muss sagen, dass ich heute schon ziemlich was geschaft habe: Datenbank anlegen, Tabelle anlegen, datensätze einfügen ein Query ausführen, um die datensätze in einem StringGrid anzuzeigen. Und da habe ich jetzt ein etwas seltsames verhalten. Beim Start rufe ich diese Funktion auf:
Delphi-Quellcode:
Das Ergebnis wird der Routine FillStringGrid übergeben:
function GetKontakte: TKontakte;
var query : PChar; MySQLRes : PMYSQL_RES; MySQLRow : PMYSQL_ROW; RecCount : Integer; i : Integer; ErrorCode : Integer; begin log('Tabelle auslesen'); ErrorCode := mysql_select_db(Descriptor, DBNAME); if ErrorCode = 0 then begin log('Datenbank ausgewählt'); query := 'SELECT * FROM Kontakte ORDER BY name, vorname'; ErrorCode := mysql_real_query(Descriptor, PChar(query), length(query)); if ErrorCode = 0 then begin log('Query: "SELECT * FROM Kontakte ORDER BY name, vorname"'); MySQLRes := mysql_store_result(Descriptor); if Assigned(MySQLRes) then begin log('QueryResult wurde zugewiesen'); RecCount := mysql_num_rows(MySQLRes); setlength(result, RecCount); for i := 0 to RecCount - 1 do begin MySQLRow := mysql_fetch_row(MySQLRes); result[i].ID := StrToInt(MySQLRow[0]); result[i].Name := MySQLRow[1]; result[i].Vorname := MySQLRow[2]; result[i].Strasse := MySQLRow[3]; result[i].Plz := StrToIntDef(MySQLRow[4], 0); result[i].Ort := MySQLRow[5]; result[i].Telefon := MySQLRow[6]; result[i].Handy := MySQLRow[7]; result[i].EMail := MySQLRow[8]; log(Format('fetch_row: %d', [i])); end; log(Format('Betroffene Zeile: %d', [mysql_affected_rows(Descriptor)])); mysql_free_result(MySQLRes); end else log('QueryResult = nil'); end else log('Query: "SELECT * FROM Kontakte ORDER BY name" fehlgeschlagen'); end else log(Format('Datenbank konnte nicht ausgewählzt werden [%d]', [ErrorCode])); end;
Delphi-Quellcode:
Nur wird GetKontakte zweimal aufgerufen. Das ganze passiert im OnPaint der Form:
procedure TForm1.FillStringGrid(Kontakte: TKontakte);
var i : Integer; begin Kontakte := GetKontakte; StringGrid1.RowCount := length(Kontakte) + 1; for i := 0 to length(Kontakte) - 1 do begin StringGrid1.Cells[0, i + 1] := IntToStr(Kontakte[i].ID); StringGrid1.Cells[1, i + 1] := Kontakte[i].Name; StringGrid1.Cells[2, i + 1] := Kontakte[i].Vorname; StringGrid1.Cells[3, i + 1] := Kontakte[i].Strasse; StringGrid1.Cells[4, i + 1] := IntToStr(Kontakte[i].Plz); StringGrid1.Cells[5, i + 1] := Kontakte[i].Ort; StringGrid1.Cells[6, i + 1] := Kontakte[i].Telefon; StringGrid1.Cells[7, i + 1] := Kontakte[i].Handy; StringGrid1.Cells[8, i + 1] := Kontakte[i].EMail; end; end;
Delphi-Quellcode:
Laut meines Logs (Ich schreibe das immer mit, damit ich weiß, was passiert.) wird der Code in OnPaint auch nur einmal aufgerufen, wie beabsichtigt. Trotzdem führt er die Funktion zweimal aus. Ich weiß jetzt nicht, ob das ein VCL Problem ist oder ob es mit dem Query der Datenbank zu tun hat, denn der Text: log('Tabelle auslesen'); steht auch zweimal im Log. Ich bin da jetzt etwas ratlos. Weiß jemand von euch da weiter?
procedure TForm1.FormPaint(Sender: TObject);
begin if FirstTime then begin log('OnPaint'); FirstTime := False; Form1.Refresh; StringGrid1.Refresh; Descriptor := mysql_init(nil); Connect(Descriptor, _HOST, _USER, _PW, _DB, _PORT); FillStringGrid(GetKontakte); end; end; |
Re: Query wird zweimal ausgeführt
Steht deine Query eventuell vor dem Compilieren auf active:=true ?
Dann wird Sie 2x ausgführt (1x in onCreate und 1x in OnPaint) Schöne Grüße, Jens :hi: |
Re: Query wird zweimal ausgeführt
Ich benutze nicht die TQuery-Komponente wohl gemerkt.
|
Re: Query wird zweimal ausgeführt
Hallo Luckie,
du rufst ja die Funktion FillStringGrid mit dem Parameter GetKontakte auf. Bei der Auswertung des Parameters ist damit der erste Aufruf erklärt. In der Prozedur rufst du dann mit Kontakte := GetKontakte die Funktion ein zweites Mal auf. |
Re: Query wird zweimal ausgeführt
:oops: :duck:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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