AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Query wird zweimal ausgeführt
Thema durchsuchen
Ansicht
Themen-Optionen

Query wird zweimal ausgeführt

Ein Thema von Luckie · begonnen am 27. Jan 2005 · letzter Beitrag vom 28. Jan 2005
Antwort Antwort
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Query wird zweimal ausgeführt

  Alt 27. Jan 2005, 23:09
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:
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;
Das Ergebnis wird der Routine FillStringGrid übergeben:
Delphi-Quellcode:
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;
Nur wird GetKontakte zweimal aufgerufen. Das ganze passiert im OnPaint der Form:
Delphi-Quellcode:
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;
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?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#2

Re: Query wird zweimal ausgeführt

  Alt 28. Jan 2005, 00:17
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Query wird zweimal ausgeführt

  Alt 28. Jan 2005, 00:30
Ich benutze nicht die TQuery-Komponente wohl gemerkt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Query wird zweimal ausgeführt

  Alt 28. Jan 2005, 00:39
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.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Query wird zweimal ausgeführt

  Alt 28. Jan 2005, 00:56
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:27 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