Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi [Zeos] Probleme mit Parametern bei SQL - Statement (https://www.delphipraxis.net/133171-%5Bzeos%5D-probleme-mit-parametern-bei-sql-statement.html)

Mithrandir 27. Apr 2009 09:44

Datenbank: Firebird Embedded • Version: 2.1.2 • Zugriff über: ZEOS 6.6.4

[Zeos] Probleme mit Parametern bei SQL - Statement
 
Hi ihr,

Um für meinen Routenplaner möglichst schnell auf die entsprechenden Daten zugreifen zu können, nutze ich eine SQL-Datenbank.

Dabei dachte ich mir, ich könnte mit einem einfachen INSERT - Statement die Daten in die Datenbank eintragen. Allerdings funktioniert das nicht wie gedacht.

So werden die Daten in die Datenbank geschrieben:

Delphi-Quellcode:
procedure TORPDataBase.WriteNodeToDB(Node: TORPNode);
begin
  fQuery := TZQuery.Create(nil);
  try
    DecimalSeparator := '.';
    with fQuery do
    begin
      Connection := fConnection;
      ParamCheck := true;
      SQL.Add('INSERT INTO `NODES` (TILE, TIMESTAMP, TAGS, VISIBLE, USER_ID, LONGITUDE, LATITUDE, ID) VALUES (:tile, :timestamp, :tags, :visible, :userid, :lon, :lat, :id)');
      ParamByName('tile').AsInteger := 0;
      ParamByName('timestamp').AsDateTime := Now();
      ParamByName('tags').AsString := '';
      ParamByName('visible').AsInteger := 1;
      ParamByName('userid').AsInteger := 0;
      ParamByName('lon').AsFloat := StrToFloat(Node.Lon);
      ParamByName('lat').AsFloat := StrToFloat(Node.Lat);
      ParamByName('id').AsInteger := StrToInt(Node.ID);
      ExecSQL;
    end;
  finally
    fQuery.Free;
  end;
end;
So wird die Verbindung aufgebaut:

Delphi-Quellcode:
function TORPDatabase.Connect(DBUser, DBPassword, DBHostName: string): boolean;
begin
  with fConnection do
  begin
    Protocol := 'firebird-2.0';
    ReadOnly := false;
    User     := DBUser;
    Password := Password;
    Database := fCompleteDBPath;
    HostName := DBHostName;
    if not FileExists(fCompleteDBPath) then
      CreateEmptyDB;
    Connect;
    Result := Connected;
  end;
end;
Es scheint, als würden in dem Code oben die Parameter nicht verarbeitet werden. Zumindest sieht der resultierende SQL - String so aus:

SQL-Code:
INSERT INTO `NODES` (TILE, TIMESTAMP, TAGS, VISIBLE, USER_ID, LONGITUDE, LATITUDE, ID) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
Sieht jemand, was ich falsch mache?

mirage228 27. Apr 2009 09:46

Re: [Zeos] Probleme mit Parametern bei SQL - Statement
 
Edit: Vielleicht hilft ein zusätzlicher "Prepare()"-Aufruf.

Viele Grüße

mkinzler 27. Apr 2009 09:49

Re: [Zeos] Probleme mit Parametern bei SQL - Statement
 
Parameter werden serverseitig angewendet. Deshalb verändern sie den Abfragestring nicht.

Mithrandir 27. Apr 2009 09:50

Re: [Zeos] Probleme mit Parametern bei SQL - Statement
 
Zitat:

Zitat von mirage228
Edit: Vielleicht hilft ein zusätzlicher "Prepare()"-Aufruf.
Edit 2: Sicher, dass es SQL.Add() sein muss? Vorherige Einträge bleiben so in der StringList, ggf. solltest Du SQL.Text := ... verwenden.

Viele Grüße

Hi,

Prepare() kennt ZEOS irgendwie nicht.. :gruebel:

An .Add liegt es vermutlich nicht, weil ich das Objekt ja frisch erstellt habe. Ich habe trotzdem mal auf .Text umgestellt. Das Problem löst es leider nicht.. :(

mirage228 27. Apr 2009 09:51

Re: [Zeos] Probleme mit Parametern bei SQL - Statement
 
Moin,

Achso, ja, ich vergaß, ZEOS macht ein "Prepare()" immer nur intern, für den Nutzer gibt es eine solche Funktion nicht...
Also zur Darstellung hat mkinzler ja schon was geschrieben ... die Frage ist nun, ob der Datensatz nun korrekt in der DB landet oder nicht?

Mithrandir 27. Apr 2009 09:52

Re: [Zeos] Probleme mit Parametern bei SQL - Statement
 
Hm.. Also, die Fehlermeldung lautet im Wortlaut:

Code:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt saxxmltest.exe ist eine Exception der Klasse EZSQLException mit der Meldung 'SQL Error: Dynamic SQL Error SQL error code = -104 Token unknown - line 1, column 13 `. Error Code: -104. Invalid token The SQL: INSERT INTO `NODES` (TILE, TIMESTAMP, TAGS, VISIBLE, USER_ID, LONGITUDE, LATITUDE, ID) VALUES (?, ?, ?, ?, ?, ?, ?, ?); ' aufgetreten.
---------------------------
Anhalten  Fortsetzen  Hilfe  
---------------------------

mirage228 27. Apr 2009 09:55

Re: [Zeos] Probleme mit Parametern bei SQL - Statement
 
Das Problem scheint zu sein, dass Firebird die ` um `NODES` nicht mag. Lass die mal weg, müsste auch ohne gehen... ;)

mkinzler 27. Apr 2009 09:55

Re: [Zeos] Probleme mit Parametern bei SQL - Statement
 
Ersetze die Hochkommas um `NODES` mit "NODES" oder lass diese ganz weg

Mithrandir 27. Apr 2009 10:02

Re: [Zeos] Probleme mit Parametern bei SQL - Statement
 
Das war's. :thumb:

Ihm gefielen die Hochkommas nicht, bei TIMESTAMP haben sie gefehlt. ;)

Kleine Frage am Rande:

Ich habe mehrere 100.000 Nodes, die ich in die Tabelle einfügen muss. Für jedes fahre ich ein eigenes "INSERT INTO" Statement auf. Dabei habe ich das Gefühl, dass sich die Performance in Grenzen hält. Kann man da noch was machen, bspw. mehrere Zeilen auf einmal einfügen? Oder ist "INSERT INTO" nur auf eine Zeile beschränkt? :gruebel:

mirage228 27. Apr 2009 10:09

Re: [Zeos] Probleme mit Parametern bei SQL - Statement
 
Das hatte ich auch mal. Es ging wesentlich schneller, als ich
Code:
INSERT INTO ... VALUES (..., ..., ...), (..., ..., ...), ...
also ein großes SQL-Statement mit allen Datensätzen rausgeschickt habe.

mkinzler 27. Apr 2009 10:15

Re: [Zeos] Probleme mit Parametern bei SQL - Statement
 
Den großen Vorteil von Parametern kann man nur Nutzen, wenn man die Abfrage einmalig setzt und dann in den Durchläufen nur die Parameter setzt.

Mithrandir 27. Apr 2009 10:18

Re: [Zeos] Probleme mit Parametern bei SQL - Statement
 
@mirage: Ah, super, die Sytax hab ich gesucht. :thumb:

Zitat:

Zitat von mkinzler
Den großen Vorteil von Parametern kann man nur Nutzen, wenn man die Abfrage einmalig setzt und dann in den Durchläufen nur die Parameter setzt.

Dann hört sich das fast so an, als müsste ich mir die Abfragen doch selbst zusammenfrickeln. Danke. ;)

mkinzler 27. Apr 2009 10:21

Re: [Zeos] Probleme mit Parametern bei SQL - Statement
 
Zitat:

Dann hört sich das fast so an, als müsste ich mir die Abfragen doch selbst zusammenfrickeln. Danke. Wink

Daniel
Im Gegenteil.

Abfrage einmalig mit Parametern setzen. Und dann immer nur die Parameter belgen und .ExecSQL() aufrufen

Mithrandir 27. Apr 2009 10:29

Re: [Zeos] Probleme mit Parametern bei SQL - Statement
 
Zitat:

Zitat von mkinzler
Abfrage einmalig mit Parametern setzen. Und dann immer nur die Parameter belgen und .ExecSQL() aufrufen

Das heißt, die TQuery-Komponente nicht erst beim Prozedurstart erstellen, sondern schon beim .Create der Klasse, und dann gleich das Statement zuweisen, richtig? Und das erhöht die Geschwindigkeit? :gruebel:

mkinzler 27. Apr 2009 10:33

Re: [Zeos] Probleme mit Parametern bei SQL - Statement
 
Zitat:

Das heißt, die TQuery-Komponente nicht erst beim Prozedurstart erstellen, sondern schon beim .Create der Klasse, und dann gleich das Statement zuweisen, richtig?
Oder vor einer etwaigen Schleife.
Zitat:

Und das erhöht die Geschwindigkeit? Grübelnd...
Ja, denn so wird die Abfrage am Server nur einmailg geparst und eine Zugriffsplan erstellt.
Dieser wird später auf die Parameter angewandt.

Mithrandir 27. Apr 2009 10:38

Re: [Zeos] Probleme mit Parametern bei SQL - Statement
 
Zitat:

Zitat von mkinzler
Ja, denn so wird die Abfrage am Server nur einmailg geparst und eine Zugriffsplan erstellt.
Dieser wird später auf die Parameter angewandt.

Ah, cool, danke... :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 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-2025 by Thomas Breitkreuz