Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Paradox to Firebird (https://www.delphipraxis.net/124455-paradox-firebird.html)

f4k3 19. Nov 2008 11:42

Re: Paradox to Firebird
 
Zitat:

Zitat von Nersgatt
Das Prinzip ist, die eigentliche Query nur einmal zu erstellen (Firebird muss dann auch nur einmal den Querytext parsen und prüfen, ob die Syntax passt).
In Deiner Schleife füllst Du dann nur noch die Parameter.

Für Deinen Fall würde das ungefähr so aussehen (aus dem Kopf zusammen geschrieben, Teilweise Pseudo-Code):


Delphi-Quellcode:
sqFirebird.SQL.Clear;
sqFirebird.SQL.Add('INSERT INTO ' + cbFirebirdTable.Text + '(NUMMER, OBERBEGRIFF) VALUES (:Nummer, :Oberbegriff)');
sqFirebird.PrepareStatement; {Veranlasst Firebird, die Syntax zu prüfen und die Auflistung der Paramter wird erstellt}

FÜR ALLE DATENSÄTZE AUS DER QUELLTABELLE (Schleife)

  {Werte in die Parameter schreiben}
  sqFirebird.ParamByName('NUMMER').AsString := tblBDE.FieldByName('Nummer').AsString;
  sqFirebird.ParamByName('Oberbegriff').AsString := tblBDE.FieldByName('Oberbegriff').AsString;
  sqFirebird.Prepared := True;
  sqFirebird.ExcecSQL(); {und abfeuern}

NÄCHSTER DATENSATZ
So ungefähr.

Gruß,
Jens

mhm ... funzt irgendwie net ... also ich hab in der Query die Params hinzugefügt ... mein code sieht so aus ...

Delphi-Quellcode:
if tblBDE.TableName = 'ART.DB' then
  begin
    tblBDE.First;

    while not tblBDE.Eof do
    begin
      sqFirebird.ParamByName('Nummer').AsString      := tblBDE.FieldByName('Nummer').AsString;
      sqFirebird.ParamByName('Oberbegriff').AsString := tblBDE.FieldByName('Oberbegriff').AsString;

      with sqFirebird.SQL do
      begin
        Clear;
        Add('INSERT INTO ' + cbFirebirdTable.Text + '(NUMMER, OBERBEGRIFF) VALUES(:Nummer, :Oberbegriff)');
        sqFirebird.PrepareStatement;
      end;                                                                                        

      sqFirebird.Prepared := True;
      sqFirebird.ExecSQL();
     
      tblBDE.Next;
    end;
  end
dann bekomm ich zur Laufzeit eine Exception sobald ExecSQL() ausgeführt wird ...

Exception-Klasse EDatabaswError mit Meldung 'sqFirebird: Die Feldnamen für %s konnten nicht erkannt werden'

Nersgatt 19. Nov 2008 12:00

Re: Paradox to Firebird
 
Schau Dir noch mal meinen Code an und vergleiche ihn mit meinem Code.

Die SQL-Abfrage selbst wird bei mir außerhalb der Schleife erstellt. Innerhalb der Schleife werden nur noch die Parameter gefüllt und abgefeuert.
Du hingegen versuchst auf die Parameter zuzugreifen an einer Stelle, wo sie noch gar nicht existieren. Außerdem baust Du wieder innerhalb der Schleife das SQL-Statement zusammen. Genau das wollen wir doch mit den Parametern verwenden.

Gruß,
Jens

f4k3 19. Nov 2008 15:54

Re: Paradox to Firebird
 
Zitat:

Zitat von Nersgatt
Schau Dir noch mal meinen Code an und vergleiche ihn mit meinem Code.

Die SQL-Abfrage selbst wird bei mir außerhalb der Schleife erstellt. Innerhalb der Schleife werden nur noch die Parameter gefüllt und abgefeuert.
Du hingegen versuchst auf die Parameter zuzugreifen an einer Stelle, wo sie noch gar nicht existieren. Außerdem baust Du wieder innerhalb der Schleife das SQL-Statement zusammen. Genau das wollen wir doch mit den Parametern verwenden.

Gruß,
Jens

mhmh ... ich muss es aber innerhalb der schleife machen ... da ich ja die ganzen datensätze durchgehen muss ... naja ... werd mal kucken ob ich irgendwo ne hilfe find ... danke bis dahin ;)

hast mir heut sehr geholfen ... :dp:

hoika 21. Nov 2008 07:42

Re: Paradox to Firebird
 
Hallo,

so etwa muss es aussehen
Delphi-Quellcode:
if tblBDE.TableName = 'ART.DB' then
  begin
    with sqFirebird.SQL do
    begin
      Clear;
      Add('INSERT INTO ' + cbFirebirdTable.Text + '(NUMMER, OBERBEGRIFF) VALUES(:Nummer, :Oberbegriff)');
        sqFirebird.PrepareStatement;
    end;                                                                                        

    sqFirebird.Prepared := True;

    tblBDE.First;

    while not tblBDE.Eof do
    begin
      sqFirebird.ParamByName('Nummer').AsString      := tblBDE.FieldByName('Nummer').AsString;
      sqFirebird.ParamByName('Oberbegriff').AsString := tblBDE.FieldByName('Oberbegriff').AsString;

      sqFirebird.ExecSQL();
     
      tblBDE.Next;
    end;
  end
Das Erstellen der FB-Query und Prepare ausserhalb der Schleife.
Es handelt sich ja immer um die gleiche Abfrage, aber mit anderen Werten,
deshalb ja die Parameter.


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:28 Uhr.
Seite 2 von 2     12   

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