![]() |
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:
klappt jedoch nicht weil folgende Meldung kommt ...
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;
Code:
also ich kapier scho dass es was mit den Variablen zu tun hat ... aber warum?!
Im Projekt Firebird_Convert.exe ist eine Exception der Klasse TDBXError mit der Meldung 'Token unknown - line 1, colum 1 Artikel' aufgetreten
.... ich habe testhalber mal die Query zur Entwurfszeit eingestellt ... mit den werten
SQL-Code:
Da kam zwar ne Debuggermeldung ... dass der Cursor nicht mehr zurückkommt ... aber nach einem Refresh ... war der Datensatz eingefügt ...
INSERT INTO ARTIKEL (NUMMER, OBERBEGRIFF) VALUES ('1234', 'Test')
kann mir jemand helfen?! :( Danke ... Euer f4k3 |
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:
Oder lieber gleich Parameter verwenden.
Add('INSERT INTO ' + cbFirebirdTable.Text + '(NUMMER, OBERBEGRIFF) VALUES (' + Nummer + ',''' + Oberbegriff + ''')');
Gruß, Jens |
Re: Paradox to Firebird
Oberbegriff und Nummer sind Strings ... weil Artikelnummern ja auch Buchstaben enthalten können ...
Danke ... ich werds gleich mal ausprobieren. |
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 |
Re: Paradox to Firebird
Zitat:
Add('INSERT INTO ' + cbFirebirdTable.Text + '(NUMMER, OBERBEGRIFF) VALUES('''+Nummer+ ''','''+Oberbegriff+''')'); nun hab ich ein Problem ...
Code:
kann mir mal jemand sagen was des überhaupt heißen soll?! ... und warum dieser fehler bei jeder Abfrage auftritt?!
Im Projekt Firebird_Convert.exe ist eine Exception der Klasse EDatabaseError mit der Meldung 'sqFirebird: Cursor nicht aus Abfrage zurückgekehrt' aufgetreten ...
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 |
Re: Paradox to Firebird
Delphi-Quellcode:
Das kannst Du eindampfen zu
sqFirebird.Active := True;
sqFirebird.ExecSQL(); sqFirebird.Refresh; sqFirebird.Active := False;
Delphi-Quellcode:
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.
sqFirebird.ExecSQL();
(1. Active := True 2. ExcecSQL 3. Refresh) Wenn Du sowieso keine Rückgabewerte erwartest, reicht das ExcecSQL aus. Gruß, Jens |
Re: Paradox to Firebird
Zitat:
|
Re: Paradox to Firebird
Zitat:
Gruß, Jens |
Re: Paradox to Firebird
Zitat:
|
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:
So ungefähr.
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 Gruß, Jens |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:52 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