AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi wird durch Query.SQL.Add() die Datenmenge geschlossen?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Gambit · begonnen am 8. Apr 2005 · letzter Beitrag vom 8. Apr 2005
Antwort Antwort
Seite 1 von 2  1 2      
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#1

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

  Alt 8. Apr 2005, 14:19
Datenbank: MySQL • Version: 4 • Zugriff über: Zeos
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
  Mit Zitat antworten Zitat
Benutzerbild von MagicAndre1981
MagicAndre1981

Registriert seit: 4. Jun 2004
Ort: Nordhausen
2.214 Beiträge
 
Delphi 7 Enterprise
 
#2

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

  Alt 8. Apr 2005, 15:18
Du musst deine Query erst in den Editormodus versetzen.
ZQuery.Edit; So ist es zu mindestens bei den IBX-Komponenten. Aber das dürfte bei den Zeos auch nicht anders sein.

André
André
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

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

  Alt 8. Apr 2005, 15:32
Hi Gambit,

ich sag nur
Zitat von Gambit:
ZQuery.SQL.Add
Hallo???
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
796 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 8. Apr 2005, 15:34
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
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.338 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 8. Apr 2005, 15:40
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.
Peter
  Mit Zitat antworten Zitat
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#6

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

  Alt 8. Apr 2005, 15:40
nein sorry, Paste and Copy Fehler

ich habe in meinem Statement noch vorher

.clear; und nachher
.ExecSQL stehen

das funzte nicht in der beschriebenen weise...
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
796 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 8. Apr 2005, 15:44
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
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.338 Beiträge
 
Delphi 11 Alexandria
 
#8

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

  Alt 8. Apr 2005, 15:44
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.
Peter
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

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

  Alt 8. Apr 2005, 15:46
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#10

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

  Alt 8. Apr 2005, 15:46
@ mikhal:

warum benutzt du noch:
ZQuery.FindField('No').AsString := ZQueryTmp.fieldByName('ID').AsString; .locate sollte eigentlich dazu führen, dass der entsprechende Datensatz aktiv ist, oder?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 13:12 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