Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Query wird nicht vom Programm ausgeführt (https://www.delphipraxis.net/173717-query-wird-nicht-vom-programm-ausgefuehrt.html)

Ykcim 12. Mär 2013 14:40

Datenbank: MySQL • Version: 5 • Zugriff über: UniDac

Query wird nicht vom Programm ausgeführt
 
Hallo Zusammen,

ich bin gerade etwas verwirrt, weil ich das Verhalten meines Programms nicht nachvollziehen kann. Ich hoffe, dass Ihr mir sagen könnt, was da schief geht.

Ich baue in einer Procedure eine Query zusammen, die ich dann ausführe.
Delphi-Quellcode:
Query.SQL.Clear;
            Query.SQL.Add('select * from prozess_position '+
                          ' where status<>100 and (Eckpunkt_ID='+Link[0]); //Link ist ein Array
            for J:=1 to Length(Link) -1 do begin                                      //Für jede Abhängigkeit die Where Bedingung
               WhereQuery:=WhereQuery+' or Eckpunkt_ID='+Link[J] ;
            end;
            WhereQuery:=WhereQuery+')';
            Query.SQL.Add(WhereQuery);
            Query.Open;
Das hat auch wunderbar geklappt, bis ich drei Bedingungen hinzugefügt habe.

Delphi-Quellcode:
and Positionen_ID='+Rows1[1,I] and rueckm=1 and relevant=1


Das Ganze sieht dann so aus:
Delphi-Quellcode:
Query.SQL.Clear;
            Query.SQL.Add('select * from prozess_position '+
                          ' where status<>100 and (Eckpunkt_ID='+Link[0]);
            for J:=1 to Length(Link) -1 do begin                                      //Für jede Abhängigkeit die Where Bedingung
               WhereQuery:=WhereQuery+' or Eckpunkt_ID='+Link[J] ;
            end;
            WhereQuery:=WhereQuery+') and Positionen_ID='+Rows1[1,I]+
                                   ' and rueckm=1 and relevant=1';
            Query.SQL.Add(WhereQuery);
            Query.Open;
Das Problem ist, dass mein Programm einfach garnichts mehr macht - keine Fehlermeldung, keine Reaktion und die Uhr bleibt stehen.
Wenn ich dann den SQL-Text bei
Delphi-Quellcode:
Query.open;
abfange und die Anweisung auf dem MySQL-Server direkt ausführe, bekomme ich das Ergebnis in 0,001 Sek.

Delphi-Quellcode:
select * from prozess_position where status<>100 
and Positionen_ID=313 
and rueckm=1 
and relevant=1 
and (Eckpunkt_ID=8 or Eckpunkt_ID=9 or Eckpunkt_ID=12)
Hat irgendjemand eine Idee, warum mein Programm mit dem SQL-Statement nicht klarkommt, obwohl der MySQL-Server so gar keine Probleme damit hat?

Viele Dank
Patrick

DeddyH 12. Mär 2013 14:55

AW: Query wird nicht vom Programm ausgeführt
 
Hast Du Dir das SQL einmal ausgeben lassen? Vielleicht steht da ja etwas anderes drin, als Du erwartest.

Jumpy 12. Mär 2013 15:30

AW: Query wird nicht vom Programm ausgeführt
 
Du hast in deinem Code auch <>100 und in dem direkten Beispiel =100. Liegt es vllt. daran.

Du könntest auch diese Geschichte mit der WhereQuery-Variablen weglassen und einfach auch in der Schleife nur Query.SQL.Add benutzen...

Ykcim 12. Mär 2013 15:36

AW: Query wird nicht vom Programm ausgeführt
 
Hallo Zusammen,

@DeddyH
Ja, ich habe mir das SQL-Statement ausgeben lassen, indem ich einen Haltepunkt bei "Query.Open;" gesetzt habe und das SQL-Statement abgefragt habe. Wenn ich dieses kopiere und auf dem MySQL-Server ausführe, dann bekomme ich das Ergebnis in 0,001sek.

@Jumpy
Ich arbeite gerade mit zwei Rechnern - der, auf dem ich programmiere hat kein Internet. Ich habe nur einen Schreibfehler beim erstellen des Themas gamacht, denn es muss <>100 heißen. Da ich das Statement aus der Query kopiert habe, ist dieser Fehler nicht vorhanden und somit auch leider nicht die Ursache...

Komisch ist, dass er sich nur verschluckt, wenn ich diese 3 Bedingungen hinzufüge. Wenn ich sie wieder entferne, dann läuft es blitzschnell. An unterschiedliche Positionen im String zu setzen hat auch keinen Erfolg gebracht...

Ich weiß gerade nicht so richtig weiter, weil ich dasnicht nachvollziehen kann...

Gruß
Patrick

Furtbichler 12. Mär 2013 17:01

AW: Query wird nicht vom Programm ausgeführt
 
Was passiert denn, wenn Du einen Breakpoint auf das '.open' setzt und dann beim Debuggen diese eine Zeile ausführst?

Ykcim 12. Mär 2013 17:59

AW: Query wird nicht vom Programm ausgeführt
 
Genau das habe ich ja gemacht, um das Query-Statement auszulesen. Mein Programm hängt sich auf. Ich habe keine Ahnung warum. Ich werde nachher mal gucken, ob es an allen 3 Bedingungen liegt, oder ob ich vielleicht die eine Bedingung herausfinde an der es liegt.

Komisch ist nur, dass der MySQL Server mit der Anweisung kein Problem hat, wenn ich einen Breakpoint auf open lege, das Statement herauskopiere und auf dem MySQL-Server direkt ausführe.

Kann das an den Komponenten liegen? Ich dachte nur, das die UniDac gut sind... Und bis jetzt hatte ich auch noch keine Probleme mit Ihnen...

Danke für die Unterstützung
Patrick

Ich habe es mal eben geprüft:

Das Problem passiert durch die Bedingung " and Rueckm=1". Aber wie gesagt, direkt auf dem Server habe ich keine Probleme...

p80286 12. Mär 2013 18:54

AW: Query wird nicht vom Programm ausgeführt
 
Wieviele Datensätze kommen denn zurück 5,50,500 oder ???

Gruß
K-H

Ykcim 12. Mär 2013 20:34

AW: Query wird nicht vom Programm ausgeführt
 
In dieser Abfrage geht es darum, dass wenn ein Datensatz zurückkommt, dass dann die nachfolgende Procedure übersprungen wird. Große Datenmengen sind also nicht das Problem. In dem aktuellen Beispiel wird auch kein Datensatz zurückgeliefert, so wie es auch sein muss...

Memo 13. Mär 2013 07:33

AW: Query wird nicht vom Programm ausgeführt
 
Bei den UniDAC sollte es einen DBMonitor geben. Damit kann man sehen welchen Befehl der SQL-Server wirklich empfangen hat, also nach dem die Anfrage durch die Komponenten bearbeitet wurde.

Die Query die Du da eingestellt hast, passt an einigen Stellen nicht zu Deinem Quellcode.

handson 13. Mär 2013 10:51

AW: Query wird nicht vom Programm ausgeführt
 
Vielleicht liegt das auch den ganzen ORs, die du benutzt. Zumindest bremst man damit die Abfrage auf dem Server aus. Versuch doch mal UNION:

Code:
(select * from prozess_position where status<>100
and Positionen_ID=313
and rueckm=1
and relevant=1
and Eckpunkt_ID=8)
union
(select * from prozess_position where status<>100
and Positionen_ID=313
and rueckm=1
and relevant=1
and Eckpunkt_ID=9)
union
(select * from prozess_position where status<>100
and Positionen_ID=313
and rueckm=1
and relevant=1
and Eckpunkt_ID=12)
probier es doch damit mal aus, vielleicht klappt das ja besser...

Stephan


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:58 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