![]() |
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:
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.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; Oder habe ich da jetzt einen Denkfehler gemacht? Gruß Gambit |
Re: wird durch Query.SQL.Add() die Datenmenge geschlossen?
Du musst deine Query erst in den Editormodus versetzen.
Delphi-Quellcode:
So ist es zu mindestens bei den IBX-Komponenten. Aber das dürfte bei den Zeos auch nicht anders sein.
ZQuery.Edit;
André |
Re: wird durch Query.SQL.Add() die Datenmenge geschlossen?
Hi Gambit,
ich sag nur Zitat:
|
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:
[edit]
// 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; Man sollte erst richtig lesen, dann schreiben: Das oben ist Murks, weil du mit ZQuery suchst, es sollte wie folgt funktionieren:
Delphi-Quellcode:
[/edit]
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; Grüße Mikhal |
Re: wird durch Query.SQL.Add() die Datenmenge geschlossen?
Um ehrlich zu sein, verstehe ich nicht ganz, was du da machst.
Delphi-Quellcode:
Normalerweise läuft die Schleife durch und es wird nichts in der Tabelle tbl_MyData gemacht.
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; 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. |
Re: wird durch Query.SQL.Add() die Datenmenge geschlossen?
nein sorry, Paste and Copy Fehler
ich habe in meinem Statement noch vorher
Delphi-Quellcode:
und nachher
.clear;
Delphi-Quellcode:
stehen
.ExecSQL
das funzte nicht in der beschriebenen weise... |
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 |
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. |
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.
|
Re: wird durch Query.SQL.Add() die Datenmenge geschlossen?
@ mikhal:
warum benutzt du noch:
Delphi-Quellcode:
.locate sollte eigentlich dazu führen, dass der entsprechende Datensatz aktiv ist, oder?
ZQuery.FindField('No').AsString := ZQueryTmp.fieldByName('ID').AsString;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:27 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