Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi wird durch Query.SQL.Add() die Datenmenge geschlossen? (https://www.delphipraxis.net/43775-wird-durch-query-sql-add-die-datenmenge-geschlossen.html)

Gambit 8. Apr 2005 14:19

Datenbank: MySQL • Version: 4 • Zugriff über: Zeos

wird durch Query.SQL.Add() die Datenmenge geschlossen?
 
Hallo,


wenn ich versuche folgenden Code auszuführen, bekomme ich die Fehlermeldung: "ZQuery: Operation bei geschlossener Datenmenge nicht ausführbar"(wohl nach dem zweiten Schleifendurchlauf):

Delphi-Quellcode:

ZQuery.Open;
ZQueryTmp.Open;

while not ZQueryTmp.Eof do
begin
  if ZQuery.Locate('No', ZQueryTmp.FieldValues['ID'] , []) then
  begin
     ZQuery.SQL.Add('Update tbl_MyData set No= '+ ZQueryTmp.fieldByName('ID').AsString)+' where No = '+
                            ZQueryTmp.fieldByName('ID').AsString);
  end;
  ZQueryTmp.Next;
end;
wird durch das alleinige Hinzufügen des SQL-Strings denn schon die Datenmenge geschlossen bzw überschrieben? Ich würde gerne mit SQL-Anweisungen arbeiten aber ich kann irgendwo nicht einsehen, dass ich vor der .Locate Anweisung jedesmal ein "select * from..." ausführen soll.
Oder habe ich da jetzt einen Denkfehler gemacht?

Gruß

Gambit

MagicAndre1981 8. Apr 2005 15:18

Re: wird durch Query.SQL.Add() die Datenmenge geschlossen?
 
Du musst deine Query erst in den Editormodus versetzen.
Delphi-Quellcode:
ZQuery.Edit;
So ist es zu mindestens bei den IBX-Komponenten. Aber das dürfte bei den Zeos auch nicht anders sein.

André

Stevie 8. Apr 2005 15:32

Re: wird durch Query.SQL.Add() die Datenmenge geschlossen?
 
Hi Gambit,

ich sag nur
Zitat:

Zitat von Gambit
Delphi-Quellcode:
ZQuery.SQL.Add

Hallo??? :lol:

mikhal 8. Apr 2005 15:34

Re: wird durch Query.SQL.Add() die Datenmenge geschlossen?
 
Dein SQL-wird mit jedem Durchlauf immer größer, weil du immer wieder eine Zeile hinzufügst. Aber du machst nichts mit der Zeile. Dann verwendest du ein Update-Statement, also einen SQL-Befehl, der keine Ergebnismenge liefert. Ein solches Statement kann nicht mit Open ausgeführt werden, hierzu gibt es die Methode ExecSQL.

Versuch es mal wie folgt:
Delphi-Quellcode:
// ZQuery.Open; // Absolut unnötig
ZQueryTmp.Open;

while not ZQueryTmp.Eof do
begin
  if ZQuery.Locate('No', ZQueryTmp.FieldValues['ID'] , []) then
  begin
     ZQuery.SQL.Text('Update tbl_MyData set No= '+ ZQueryTmp.fieldByName('ID').AsString)+' where No = '+ 
                            ZQueryTmp.fieldByName('ID').AsString); // SQL-Statement wird immer wieder überchrieben!
     ZQuery.ExecSQL; // Das Update-Statement ausführen!
  end;
  ZQueryTmp.Next;
end;
[edit]
Man sollte erst richtig lesen, dann schreiben: Das oben ist Murks, weil du mit ZQuery suchst, es sollte wie folgt funktionieren:
Delphi-Quellcode:
ZQuery.Open;
ZQueryTmp.Open;

while not ZQueryTmp.Eof do
begin
  if ZQuery.Locate('No', ZQueryTmp.FieldValues['ID'] , []) then
  begin
     ZQuery.Edit;
     ZQuery.FindField('No').AsString := ZQueryTmp.fieldByName('ID').AsString;
     ZQuery.Post;
  end;
  ZQueryTmp.Next;
end;
[/edit]
Grüße
Mikhal

Jasocul 8. Apr 2005 15:40

Re: wird durch Query.SQL.Add() die Datenmenge geschlossen?
 
Um ehrlich zu sein, verstehe ich nicht ganz, was du da machst.
Delphi-Quellcode:
ZQuery.Open;
ZQueryTmp.Open;

while not ZQueryTmp.Eof do // Hier läufst du durch deine Tabelle, die in zquerytmp gewählt wurde.
begin
  if ZQuery.Locate('No', ZQueryTmp.FieldValues['ID'] , []) then // Wenn du in ZQuery was findest, machst du etwas:
  begin
     // hier änderst du nur die SQL-Anweisung in ZQuery
     ZQuery.SQL.Add('Update tbl_MyData set No= '+ ZQueryTmp.fieldByName('ID').AsString)+' where No = '+
                            ZQueryTmp.fieldByName('ID').AsString);
     // und machst nichts damit.
  end;
  ZQueryTmp.Next; // Ab zum nächsten Datensatz
end;
Normalerweise läuft die Schleife durch und es wird nichts in der Tabelle tbl_MyData gemacht.

Ich habe das Gefühl, du unterschlägst einen Teil des Sources. Ich habe den ZEOS-Komponenten zwar nicht gearbeitet, aber bei allen anderen Query-Komponente, die ich kenne, führt ein Verändern der SQL-Anweisung NICHT zum close.
Erst ein :
Open
ExecSQL (Mag sein, dass es bei ZEOS anders heißt)
Active := True
führt implizit zu einem close.

Gambit 8. Apr 2005 15:40

Re: wird durch Query.SQL.Add() die Datenmenge geschlossen?
 
nein sorry, Paste and Copy Fehler

ich habe in meinem Statement noch vorher

Delphi-Quellcode:
.clear;
und nachher
Delphi-Quellcode:
.ExecSQL
stehen

das funzte nicht in der beschriebenen weise...

mikhal 8. Apr 2005 15:44

Re: wird durch Query.SQL.Add() die Datenmenge geschlossen?
 
Ja weil nach dem ExecSQL die Query geschlossen wird.

Im übrigen steht anschließend keine Select-Statement mehr in deiner Query und der Fehler wird durch den nächsten Aufruf von Locate ausgelöst.

Grüße
Mikhal

Jasocul 8. Apr 2005 15:44

Re: wird durch Query.SQL.Add() die Datenmenge geschlossen?
 
Das kann nicht funktionieren.
Erst benutzt du ZQuery zum suchen. Dann machst du ein Update-Statement. Dadurch wird deine erste Abfrage in ZQuery geschlossen. Das nächst Locate muss dan zwangsläufig fehlschlagen, weil deine ursprüngliche Abfrage ja gelöscht wurde.

Stevie 8. Apr 2005 15:46

Re: wird durch Query.SQL.Add() die Datenmenge geschlossen?
 
Dann musst du das nicht über ein SQL einfügen sondern ein TZQuery.Append, ... (Felder füllen), Post machen, denn wir bereits gesagt, liefert das ExecSQL bei einem Update erstens keine Sätze zurück und 2 ist das DataSet imho auch nicht geöffnet.

Gambit 8. Apr 2005 15:46

Re: wird durch Query.SQL.Add() die Datenmenge geschlossen?
 
@ mikhal:

warum benutzt du noch:
Delphi-Quellcode:
ZQuery.FindField('No').AsString := ZQueryTmp.fieldByName('ID').AsString;
.locate sollte eigentlich dazu führen, dass der entsprechende Datensatz aktiv ist, oder?


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