Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   IBDAC: Prepare/Unprepare, was macht Firebird (https://www.delphipraxis.net/186728-ibdac-prepare-unprepare-macht-firebird.html)

hoika 24. Sep 2015 17:27

Datenbank: Firebird • Version: 2 • Zugriff über: IBDAC

IBDAC: Prepare/Unprepare, was macht Firebird
 
Hallo,
ich habe hier etwas Code.

Delphi-Quellcode:
Q: TIBCQuery;

Q.SQL.Clear;
Q.SQL.Add('Select A From Tabelle');
Q.Prepare;
Q.ExecSQL;
Q.UnPrepare;

Q.SQL.Clear;
Q.SQL.Add('Select B From Tabelle');
Q.Prepare;
Q.ExecSQL;
Q.UnPrepare;
Schaue ich mir das mit dem DB-Monitor an, sehe ich natürlich das Prepare/Unprepare, was hier ja nutzlos ist.
IBDAC prepared die Query vor dem ExecSQL ja selbst, wenn sich der SQL-Inhalt geändert hat (oder nicht?).
Lasse ich alle Prepare/Unprepare weg, sehe ich nur noch die ExecSQL's, wo ist das Prepare von IBDAC?

Es geht mir hier nicht um tatsächliche prepared Queries (Parameter-Nutzung usw.),
sondern diesen Code hier.
Was mich so stört, ist auch das UnPrepare.

Macht die DB mit diesem Code mehr als sie müßte?


Weiss das jemand?


Danke
Heiko

IBExpert 24. Sep 2015 20:09

AW: IBDAC: Prepare/Unprepare, was macht Firebird
 
falls du die ibexpert Vollversion hast (oder auch andere firebird traceapi tools), kannst du sehen, was der Server daraus macht, das ist meistens viel wichtiger als das was deine Komponente da so als Protokoll einträgt.

Bei fast allen Komponenten gilt folgendes:

wenn du ein prepare aufrufst, wird die Komponente kein automatisches unprepare machen. Sobald du aber der SQL Text änderst, wird ein unprepare gemacht.

Wird prepare nicht explizit aufgerufen, dann wird nach open/close bzw nach ExecSql automatisch ein unprepare gemacht und mit dem nächsten open/close oder execsql ebenfalls wieder ein neuer prepare/unprepare zyklus.

Dein Code macht beim einmaligen Aufruf nicht mehr und nicht weniger als jede Komponente auf API Ebene auch machen müsste. In der ExecSQL Implementation kommt irgendwo oben sinngemäß if not prepared then prepare ..... und am ende das zugehörige unprepare, falls das unprepared war.

Im Setter für die SQL Property wird auf jeden Fall ein if prepared then unprepare aufgerufen.

wenn du aus den zeilen

Code:
Q.Prepare;
Q.ExecSQL;
Q.UnPrepare;
das hier gemacht hättest, wäre es auf der Datenbankseite identisch abgelaufen.

Code:
Q.ExecSQL;
Erst in Schleifen mit unterschiedlichen Parametern ist ein explizites Prepare/Unprepare oft sinnvoll, aber auch nicht immer ...

hoika 25. Sep 2015 05:41

AW: IBDAC: Prepare/Unprepare, was macht Firebird
 
Hallo Holger,
die Vollversion hatte ich mal gekauft, als du in Barleben (bei Magdeburg) warst
200X :)

Also sollte ich lieber mal den Server statt den DB-Monitor befragen.

Danke


Heiko


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