Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi "Zuviele offene Tabellen" (https://www.delphipraxis.net/799-zuviele-offene-tabellen.html)

theomega 8. Sep 2002 13:01


"Zuviele offene Tabellen"
 
Hallo

in meinem Prorgramm kommt diese Meldung: "zuviele offene Tabellen". Ich habe als Datenbank eine Pardix-DB und als Komops ein TQuery.

für meine Querys habe ich mir eine Funktion geschrieben:
Code:
function TForm1.execquery(querystring:string):integer;
begin;
qrmain.Close;
if dolog = true then memo1.Lines.Add(datetimetostr(now)+': '+querystring);
qrmain.sql.Clear;
qrmain.sql.Add(querystring);
qrmain.ExecSql;
qrMain.Open;
result := qrmain.RecordCount;
end;
eingetlich dürfte doch maximal 1 Tabelle offen sein, nachdem ich bei zweiten Query die erste wieder schließe.

Wie bekomm ich die Meldung weg?

Christian Seehase 8. Sep 2002 13:13

Moin The Omega,

ich hab's mal in der Hilfe nachgeschlagen, da mir ExecSQL vor dem Open etwas seltsam vorkam (wie soll eine Abfrage funktionieren, wenn noch kein Open erfolgte, fragte ich mich?)

Unter ExecSQL fand ich dann:
Zitat:

Zitat von Delphi 5 Hilfe: TQuery.ExecSQL
Für die SELECT-Anweisung verwenden Sie statt ExecSQL die Methode Open.

ExecSQL führt also wohl implizit ein Open aus, so dass Du die Query zweimal öffnest und einmal schliesst, was dann, über kurz oder lang, zu der Fehlermeldung führt.

Ich hoffe mal meine Überlegung stimmt, denn mit Datenbanken hab' ich's nicht so. ;-)

theomega 8. Sep 2002 13:23

jetzt funzt es, aber nur sicherheitshalber: ich habe eine zweite Funktion zum ausführen von Querys, die die Datenbank ändern:
Code:
procedure TForm1.execqueryinsert(querystring:string);
begin;
qrmain.Close;
if dolog = true then memo1.Lines.Add(datetimetostr(now)+': '+querystring);
qrmain.sql.Clear;
qrmain.sql.Add(querystring);
qrmain.ExecSql;
end;
stimmt die den?

Christian Seehase 8. Sep 2002 13:40

Moin The Omega,

ich fürchte mal, dass Du mich meinst :mrgreen:

Wie schon gesagt, mit Datenbanken (und deren Kompos) hab' ich's nicht so, aber wenn meine Überlegung zu ExecSQL stimmt (implizites Öffnen) sollte es so gehen, wie Du es geschrieben hast.

Vermutlich wird's hier aber auch einige geben, die es genau wissen.

MrSpock 9. Sep 2002 12:27

Hallo theomega,

es ist tatsächlich so, dass SQL Abragen, die eine Datenmenge zurückgeben nur mit Open ausgeführt werden sollen. Nur Abfragen, die keine Datenmenge zurückgeben wie DELETE, INSERT, UPDATE sollen mit ExecSQL abgeschickt werden. Der Versuch, die Datenmenge, die mit z.B. DELETE erzeugt wurde, zu öffnen (mit Open), führt zu einem Fehler, weil es ja keine Datenmenge gibt!


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