Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:22 Uhr.
Seite 1 von 2  1 2      

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