Delphi-PRAXiS
Seite 1 von 2  1 2      

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 09:35

Datenbank: Firebird • Version: 2.1.1 • Zugriff über: DBExpress

Paradox to Firebird
 
Moin Moin liebe DPler ;)

ich hab n problem ... Ich schreib grad n App das mir meine Paradox-tabelle in eine Firebird-tabelle konvertieren soll ... und konvertieren ist hier nicht wirklich wörtlich gemeint :P

Ich möchte nämlich von Datensatz zu Datensatz gehen ... den aus der Paradox in die Firebird-tabelle reinschreiben ... also ich synchronisiere ... triffts glaub ich besser ...

leider funktionierts nicht ... ich hab folgende komponenten:

für BDE = 1x TTable, 1x JvDatasource
für Firebird = 1x TSimpleDataset, 1x JvDatasource, 1x TSQLConnection, 1x TSQLQuery

jetzt werded ihr sagen ... in TSimpleDataset ist doch bereits eine connection enthalten ... stimmt ... aber die kann ich für die TSQLQuery nicht verwenden ... weil die Connection mir nicht angeboten wird ... wenn ichs manuell eingeb kommt ne Fehlermeldung; Aber dürfte erstmal kein problem sein ... Die TQuery ist mit der Datasource verbunden die auf die SimpleDataset Comp. zeigt ...

nun wenn ich auf den button klick ... soll folgendes passieren ...

Delphi-Quellcode:
with sqFirebird.SQL do
      begin
        Clear;

        Nummer     := tblBDE.FieldByName('Nummer').AsString;
        Oberbegriff := tblBDE.FieldByName('Oberbegriff').AsString;

        Add('INSERT INTO ' + cbFirebirdTable.Text + '(NUMMER, OBERBEGRIFF) VALUES (' + Nummer + ',' + Oberbegriff + ')');
      end;

      sqFirebird.Active := True;
      sqFirebird.ExecSQL();
      sqFirebird.Refresh;
      sqFirebird.Active := False;
     
      tblBDE.Next;
klappt jedoch nicht weil folgende Meldung kommt ...

Code:
Im Projekt Firebird_Convert.exe ist eine Exception der Klasse TDBXError mit der Meldung 'Token unknown - line 1, colum 1 Artikel' aufgetreten
also ich kapier scho dass es was mit den Variablen zu tun hat ... aber warum?!

....

ich habe testhalber mal die Query zur Entwurfszeit eingestellt ... mit den werten

SQL-Code:
INSERT INTO ARTIKEL (NUMMER, OBERBEGRIFF) VALUES ('1234', 'Test')
Da kam zwar ne Debuggermeldung ... dass der Cursor nicht mehr zurückkommt ... aber nach einem Refresh ... war der Datensatz eingefügt ...

kann mir jemand helfen?! :(

Danke ...

Euer f4k3

Nersgatt 19. Nov 2008 09:39

Re: Paradox to Firebird
 
Ich gehe mal davon aus, dass "Oberbegriff" in der Datenbank als String gespeichert wird. Dann musst Du es in ' einfassen:
Delphi-Quellcode:
Add('INSERT INTO ' + cbFirebirdTable.Text + '(NUMMER, OBERBEGRIFF) VALUES (' + Nummer + ',''' + Oberbegriff + ''')');
Oder lieber gleich Parameter verwenden.

Gruß,
Jens

f4k3 19. Nov 2008 09:44

Re: Paradox to Firebird
 
Oberbegriff und Nummer sind Strings ... weil Artikelnummern ja auch Buchstaben enthalten können ...

Danke ... ich werds gleich mal ausprobieren.

Nersgatt 19. Nov 2008 09:49

Re: Paradox to Firebird
 
Wenn "Nummer" auch ein String ist, natürlich das auch in ' einfassen.
Ich habe mir angewöhnt, alphanumerische Schlüsselfelder als "Code" zu bezeichnung und nur numerische Felder als "Nummer" zu bezeichnen. So kann man gleich am Namen erkennen womit man es zu tun hat.

Wobei ich nochmal anregen möchte, wirklich Parameter zu verwenden. Das wird auch die Ausführgeschwindigkeit Deiner Routine spürbar verbessern.

Gruß,
Jens

f4k3 19. Nov 2008 09:56

Re: Paradox to Firebird
 
Zitat:

Zitat von Nersgatt
Wenn "Nummer" auch ein String ist, natürlich das auch in ' einfassen.
Ich habe mir angewöhnt, alphanumerische Schlüsselfelder als "Code" zu bezeichnung und nur numerische Felder als "Nummer" zu bezeichnen. So kann man gleich am Namen erkennen womit man es zu tun hat.

Wobei ich nochmal anregen möchte, wirklich Parameter zu verwenden. Das wird auch die Ausführgeschwindigkeit Deiner Routine spürbar verbessern.

Gruß,
Jens

Okay soweit hatts schonmal geklappt ... SQL-Befehl sieht nun folgendermaßen aus ...

Add('INSERT INTO ' + cbFirebirdTable.Text + '(NUMMER, OBERBEGRIFF) VALUES('''+Nummer+ ''','''+Oberbegriff+''')');

nun hab ich ein Problem ...

Code:
Im Projekt Firebird_Convert.exe ist eine Exception der Klasse EDatabaseError mit der Meldung 'sqFirebird: Cursor nicht aus Abfrage zurückgekehrt' aufgetreten ...
kann mir mal jemand sagen was des überhaupt heißen soll?! ... und warum dieser fehler bei jeder Abfrage auftritt?!

Zu den Parametern ... hab mich noch nicht damit beschäftigt ... aber werds mir auf jeden fall mal ankucken ...

Du hast dich ja gerade freiwillig dazu bereit erklärt Hilfestellung zu leisten :D :D :D

Vielen Dank euer F4k3

Nersgatt 19. Nov 2008 10:05

Re: Paradox to Firebird
 
Delphi-Quellcode:
    sqFirebird.Active := True;
      sqFirebird.ExecSQL();
      sqFirebird.Refresh;
      sqFirebird.Active := False;
Das kannst Du eindampfen zu
Delphi-Quellcode:
      sqFirebird.ExecSQL();
Damit sollte das Problem mit dem Cursor auch behoben sein. Ich habe es jetzt nicht ausprobiert, denke aber, dass im Moment Deine Abfrage sogar 3x ausgeführt wird.
(1. Active := True 2. ExcecSQL 3. Refresh)
Wenn Du sowieso keine Rückgabewerte erwartest, reicht das ExcecSQL aus.

Gruß,
Jens

f4k3 19. Nov 2008 10:13

Re: Paradox to Firebird
 
Zitat:

Zitat von Nersgatt
Delphi-Quellcode:
    sqFirebird.Active := True;
      sqFirebird.ExecSQL();
      sqFirebird.Refresh;
      sqFirebird.Active := False;
Das kannst Du eindampfen zu
Delphi-Quellcode:
      sqFirebird.ExecSQL();
Damit sollte das Problem mit dem Cursor auch behoben sein. Ich habe es jetzt nicht ausprobiert, denke aber, dass im Moment Deine Abfrage sogar 3x ausgeführt wird.
(1. Active := True 2. ExcecSQL 3. Refresh)
Wenn Du sowieso keine Rückgabewerte erwartest, reicht das ExcecSQL aus.

Gruß,
Jens

Merci ... läuft grad durch ... etz muss ich nur ne halbe stunde warten bis das dingens durchgelaufen is ;)

Nersgatt 19. Nov 2008 10:16

Re: Paradox to Firebird
 
Zitat:

Zitat von f4k3
Merci ... läuft grad durch ... etz muss ich nur ne halbe stunde warten bis das dingens durchgelaufen is ;)

Ein Grund mehr, sich mit Parametern zu beschäftigen. Dann müsstest Du nur 10 Minuten warten :warn:

Gruß,
Jens

f4k3 19. Nov 2008 10:28

Re: Paradox to Firebird
 
Zitat:

Zitat von Nersgatt
Zitat:

Zitat von f4k3
Merci ... läuft grad durch ... etz muss ich nur ne halbe stunde warten bis das dingens durchgelaufen is ;)

Ein Grund mehr, sich mit Parametern zu beschäftigen. Dann müsstest Du nur 10 Minuten warten :warn:

Gruß,
Jens

mhm ... ich versteh aber des prinzip noch net ganz ... wie weiße ich einem parameter den wert der BDE-Tabelle zu?!

Nersgatt 19. Nov 2008 10:38

Re: Paradox to Firebird
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:17 Uhr.
Seite 1 von 2  1 2      

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