![]() |
Datenbank: Mysql • Version: 5.7 • Zugriff über: Delphi xe3
Daten mit SQLDataSet in mysql-Datenbank schreiben
Hallo an alle,
ich möchte mehrere Datensätze in eine bestehende Datenbank schreiben. Auf folgende Art und Weise habe ich es mal ausprobiert.
Code:
Wenn ich auf den Button klicke,werde 6 Datensätze in die Datenbank geschrieben.
procedure TForm1.Button4Click(Sender: TObject);
var z : Integer; begin SQLDataSet1.Close; for z := 5 to 10 do begin SQLDataSet1.CommandText := 'insert into datenbank_neu.Tabelle5 (spalte1,spalte2,spalte3)' + 'select spalte5,0,spalte12' + 'from datenbank_alt.Tabelle20 where datenbank_alt.Tabelle20.reihenfolge =' + IntToStr(z)+';'; SQLDataSet1.ExecSQL; Ich benötige aber noch eine zweite Insert-Anweisung,für weitere Daten. Die Daten sollen folgendermaßen geschrieben werden: Zuerst Insert-Anweisung1,dann Insert-Anweisung2,Zähler um 1 erhöhen,dann wieder Insert-Anweisung1 und Insert-Anweisung2.... usw. Kann ich einfach eine weitere Insert-Anweisung unter die vorhandene schreiben,oder muß ich ein weiteres DataSet anlegen und dort die Insert-Anweisung2 unter CommandText einfügen??? Gruß AnfängerDelphi |
AW: Daten mit SQLDataSet in mysql-Datenbank schreiben
Würde jetzt einfach mal behaupten, dass sowas hgehen sollte:
Delphi-Quellcode:
Also: Meiner Meinung nach kann man nacheinander belibige Statements hintereinander per ExecSQL ausführen lassen.
procedure TForm1.Button4Click(Sender: TObject);
var z : Integer; begin SQLDataSet1.Close; for z := 5 to 10 do begin SQLDataSet1.CommandText := 'insert into datenbank_neu.Tabelle5 (spalte1,spalte2,spalte3)' + 'select spalte5,0,spalte12' + 'from datenbank_alt.Tabelle20 where datenbank_alt.Tabelle20.reihenfolge =' + IntToStr(z)+';'; SQLDataSet1.ExecSQL; SQLDataSet1.CommandText := 'insert into datenbank_neu.Tabelle42 (spalte1)' + 'select spalte5 ' + 'from datenbank_alt.Tabelle47 where datenbank_alt.Tabelle55.reihenfolge =' + IntToStr(z)+';'; SQLDataSet1.ExecSQL; Ein Zusammenhang muss nicht zwingend gegeben sein, egal ob in einer Schleife oder nicht. Zitat:
|
AW: Daten mit SQLDataSet in mysql-Datenbank schreiben
Man sollte meiner Erfahrung mit ADO-Komponenten nach, weiß nicht ob's auch anderswo besser geht, so wie bei nahpets Beispiel zwei Anweisungen getrennt hintereinander ausführen. Theoretisch könnte man ja auch alle Anweisungen mit Semikolon getrennt hintereinanderschreiben und das dann nur ein mal Ausführen, aber das klappt mMn nicht.
Man könnte allerdings das ganze Schleifengerafel weglassen zu:
Delphi-Quellcode:
'...where datenbank_alt.Tabelle20.reihenfolge in (5,6,7,8,9,10)'
//oder '...where datenbank_alt.Tabelle20.reihenfolge between 5 and 10' //oder wenn's was dynamisches ist: '...where datenbank_alt.Tabelle20.reihenfolge in ('+SQL_Liste+')' function SQL_Liste:String; var z : integer; begin for z:=5 to 10 do begin if Result<>'' then Result:=Result+',' Result:=Result+IntToStr(z) end; end; |
AW: Daten mit SQLDataSet in mysql-Datenbank schreiben
Zitat:
Ob Schleife oder nicht, man kann immer wieder neue Statements eintragen und ausführen. Und ich würde für DML Statments eher eine Query Object nehmen, statt eines Datasets. Mehrer Abfragen / Statements hintereinander funktionieren m.E. in kaum einer dieser Implementierungen. Warum das so ist, weiß ich nicht. Ein Grund könnte aber sein, dass genau ein Dataset eigentlich mit dem Focus implementiert wurde, eben 1(genau ein) Dataset gemäß Abfrage zurückzuliefern. Das ist etwas anderes als eine kette von DML Statements, die irgendwas in der DB ändern. Für diese Zwecke gibt es glaub ich hier und da extra Script Komponenten. Variante (wenn es nicht mySQL ist) Man kann mehrere Inserts, Updates, Deletes usw. in einem ExecuteSQL mit ADO absetzen, wenn das Zielsystem (die Datenbank) Anonyme Blöcke beherrscht. Das ist aber m.E. bei mySQL nicht der Fall. Die "normale" Variante dazu ist dann eigentlich, auf der DB eine StoredProcedure anzulegen, die Befehlsketten inkl Logik ausführt. Der Aufruf der SP auf dem Client ist dann wieder nur 1 Befehl. Das ist natürlich etwas undynamischer als ein Anonymous Block. |
AW: Daten mit SQLDataSet in mysql-Datenbank schreiben
Hallo an alle,
ich habe noch einmal paar Test's durchgeführt und muß sagen,jobo hat recht. Zitat:
Code:
Gibt es noch eine andere Möglichkeit mit Delphi zwei Datensätze hintereinander in die Datenbank zu schreiben,oder ist es besser PHP dafür zu benutzen?
Exception-Klasse TDBXError mit Meldung 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.datenbank_alt.Tabelle47 where datenbank_alt.Tabelle55.reihenfolge = 5' at line 1'. Prozess
Gruß AnfängerDelphi |
AW: Daten mit SQLDataSet in mysql-Datenbank schreiben
Wie schon gesagt, anonyme Blöcke wären eine Möglichkeit, nach meiner Kenntnis gibt es das (noch) nicht in mysql.
Ich weiß leider auch nicht, was die Implementierungen in PHP oder anderswo können, wie gesagt, Scriptfähigkeit ist selten und wenn gegeben, dann sind die Libs / Komponenten auch gern so benannt. Mit PHP o.ä. wärst Du vermutlich erstmal nicht weiter. Und auch schon gesagt: Der nächste Verwandte der Anonymen Blöcke sind die Stored Procedures. Die sind dafür gemacht. Da die SP selbst mehr oder weniger statisch sind, musst Du dort per Aufruf alle Parameter übergeben, die dort verarbeitet werden sollen. Vorteil ist jedenfalls, dass man damit mehr oder weniger automatisch transaktional arbeitet, vielleicht suchst Du genau deshalb nach sowas. |
AW: Daten mit SQLDataSet in mysql-Datenbank schreiben
Moin...:P
Zitat:
Was ist mit dir los? Gleich die Flinte ins Korn werfen wenn etwas nicht auf Anhieb funktioniert. :evil: Hast du dich auch mit den Grundlagen der DBX Komponente befaßt? ![]() Zitat:
![]() Zitat:
Die Lösung hast doch schon... :gruebel:
Delphi-Quellcode:
Hast du den letzten Stand des Beispiels?
procedure TForm1.Button4Click(Sender: TObject);
var z : Integer; begin SQLDataSet1.Close; for z := 5 to 10 do begin SQLDataSet1.CommandText := 'insert into datenbank_neu.Tabelle5 (spalte1,spalte2,spalte3)' + 'select spalte5,0,spalte12' + 'from datenbank_alt.Tabelle20 where datenbank_alt.Tabelle20.reihenfolge =' + IntToStr(z)+';'; SQLDataSet1.ExecSQL; SQLDataSet1.CommandText := // diese Zeile hat in Beitrag #2 gefehlt. 'insert into datenbank_neu.Tabelle42 (spalte1)' + 'select spalte5 ' + 'from datenbank_alt.Tabelle47 where datenbank_alt.Tabelle55.reihenfolge =' + IntToStr(z)+';'; SQLDataSet1.ExecSQL; Zitat:
Hinweis: Hast du dich mal mit der MySQL Lizenzfalle (libmysql.dll) beschäftigt? ![]() ...oder anders gefragt: Warum ist die Entscheidung auf MySQL gefallen? |
AW: Daten mit SQLDataSet in mysql-Datenbank schreiben
Hallo,
mal ein paar Grundinformationen. Zitat:
Mein Ziel ist es,die Daten von einer bestehenden Mysql-Datenbank in die neue Datenbank zu übertragen,ohne Zwischenspeicherung.
Delphi-Quellcode:
Die fehlende CommandText Zeile habe ich schon eingefügt,aber der Fehler hängt mit der zweiten Insert-Anweisung zusammen.
procedure TForm1.Button4Click(Sender: TObject);
var z : Integer; begin SQLDataSet1.Close; for z := 5 to 10 do begin SQLDataSet1.CommandText := 'insert into datenbank_neu.Tabelle5 (spalte1,spalte2,spalte3)' + 'select spalte5,0,spalte12' + 'from datenbank_alt.Tabelle20 where datenbank_alt.Tabelle20.reihenfolge =' + IntToStr(z)+';'; SQLDataSet1.ExecSQL; SQLDataSet1.CommandText := // diese Zeile hat in Beitrag #2 gefehlt. 'insert into datenbank_neu.Tabelle42 (spalte1)' + 'select spalte5 ' + 'from datenbank_alt.Tabelle47 where datenbank_alt.Tabelle55.reihenfolge =' + IntToStr(z)+';'; SQLDataSet1.ExecSQL; Wenn ich die zweite Insert-Anweisung auskommentiere funktioniert es problemlos. Aber ich benötige auch die zweite Insert-Anweisung. Zitat:
Ich schaue mir es mal genauer an und werde es auch ausprobieren. Zitat:
Kann ich meine Insert-Anweisungen so übernehmen? Gruß AnfängerDelphi |
AW: Daten mit SQLDataSet in mysql-Datenbank schreiben
Hallöle...:P
Ich glaube nicht das mit der 2. Anweisung zusammenhängt...bestenfalls mit dem Statement was du ausführen willst. In diesem Statement hast du einen Syntaxfehler drin. :? Lasse dir das Statement mal über den Debugger anzeigen und schreibe es mal hier rein....:thumb: Prüfe ob die Tabellen im Ziel existieren etc. Es könnte sein, daß das
Delphi-Quellcode:
vor jedem Command.Text erwartet wird. :gruebel:
SQLDataSet1.Close;
Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var z : Integer; begin for z := 5 to 10 do begin SQLDataSet1.Close; // neu SQLDataSet1.CommandText := 'insert into datenbank_neu.Tabelle5 (spalte1,spalte2,spalte3)' + 'select spalte5,0,spalte12' + 'from datenbank_alt.Tabelle20 where datenbank_alt.Tabelle20.reihenfolge =' + IntToStr(z)+';'; SQLDataSet1.ExecSQL; SQLDataSet1.Close; // neu SQLDataSet1.CommandText := // diese Zeile hat in Beitrag #2 gefehlt. 'insert into datenbank_neu.Tabelle42 (spalte1)' + 'select spalte5 ' + 'from datenbank_alt.Tabelle47 where datenbank_alt.Tabelle55.reihenfolge =' + IntToStr(z)+';'; SQLDataSet1.ExecSQL; Zitat:
Deshalb brauchen wir das Original aus dem Debugger... Zitat:
|
AW: Daten mit SQLDataSet in mysql-Datenbank schreiben
Hallo,
Zitat:
Hab mal ein bißchen herumexperimentiert und folgendes herausgefunden. Wenn ich meine originale Insert-Anweisung so in das SQL-Fenster in der Datenbank direkt eintrage,funktioniert es so,wie es sein soll. Nur müßte ich dann immer von Hand den Zähler setzen und dies möchte ich ja durch eine Schleife ersetzen. Dies hier ist nur ein Beispiel zu meinem Original,aber identisch.
SQL-Code:
Ich habe mir auch das mit SQLStoredProc durchgelesen,aber so richtig klar komme ich damit nicht.
insert into datenbank_neu.Tabelle5 (spalte1,spalte2,spalte3)
select spalte5,0,spalte12 from datenbank_alt.Tabelle20 where datenbank_alt.Tabelle20.reihenfolge = 5 insert into datenbank_neu.Tabelle42 (spalte1) select spalte5 from datenbank_alt.Tabelle47 where datenbank_alt.Tabelle55.reihenfolge = 5 Müßte dies dann so aussehen???
Delphi-Quellcode:
Die Verbindung zur Datenbank stelle ich über einen separaten Button her,bevor ich den Button4 anklicke und die Anweisung ausführe.
procedure TForm1.Button4Click(Sender: TObject);
var z : Integer; begin for z := 5 to 10 do begin SQLStoredProc.Close; SQLStoredProc.CommandText := 'insert into datenbank_neu.Tabelle5 (spalte1,spalte2,spalte3)' + 'select spalte5,0,spalte12' + 'from datenbank_alt.Tabelle20 where datenbank_alt.Tabelle20.reihenfolge =' + IntToStr(z)+';';+ 'insert into datenbank_neu.Tabelle42 (spalte1)' + 'select spalte5 ' + 'from datenbank_alt.Tabelle47 where datenbank_alt.Tabelle55.reihenfolge =' + IntToStr(z)+';'; SQLStoredProc.ExecProc; Gruß AnfängerDelphi |
AW: Daten mit SQLDataSet in mysql-Datenbank schreiben
Also ich kann mir nicht vorstellen, dass eine For Schleife oder irgendeinanderes Konstrukt in Delphi die Verarbeitung 2er Insert Statements unmöglich macht.
Kann es sein, dass irgendetwas Deiner vorigen Versuche noch etwas "Rauschen" im Delphicode hinterlassen hat und zu dem Problem führt. Also z.B. ganz banal. 2. Insert wird nicht gegen Deine neue, sondern gegen die OriginalDB gefahren? Kläre das mal, hier gibt es sicher irgendeine Sache, die Du übersiehst. Für Dein Problem ist der Einsatz einer SP wahrscheinlich nicht notwendig. Du hast kein Werte oder Transaktionsproblem, sondern ein falsches SQL oder eine falsche DB in Folge fehlerhafter Delphiprogrammierung oder sowas. Falls Du es per SP machen willst, zu anonymen Blöcken und SP: In einem anonymen Block würdest Du den gesamten SQL Code tatsächlich in einer CommandText Eigenschaft oder so an die DB schicken. IdR wird ein anonymer Block durch irgendwas geklammert, Begin End; .. naja bei MySQL ist das vergebene Liebesmüh Eine SP hat einen Aufbau wie ein Anonymer Block, liegt aber auf der DB selbst und hat einen Namen und Parameter. Letztlich sieht der Code einer Delphi Procedure sehr ähnlich. (Natürlich nicht exakt auf Syntaxebene). Deine CommandEigenschaft sieht dadurch dann ganz anders aus, wenn Du die SP rufst. Hier wird nur der Name und die Parameter (sofern definiert) eingetragen. Hier ein deutsches Beispiel für das Anlegen einer SP in mySQL: ![]() Hier noch ein Link mit diversen Aufruf Varianten in Delphi, allerdings per ADO, sollte sich vom Prinzip aber nicht unterscheiden. ![]() |
AW: Daten mit SQLDataSet in mysql-Datenbank schreiben
Versuch es doch mal so:
Delphi-Quellcode:
Gruß
procedure TForm1.Button4Click(Sender: TObject);
var z : Integer; begin SQLDataSet1.Close; for z := 5 to 10 do begin SQLDataSet1.CommandText := 'insert into datenbank_neu.Tabelle5 (spalte1,spalte2,spalte3)' + 'select spalte5,0,spalte12' + 'from datenbank_alt.Tabelle20 where datenbank_alt.Tabelle20.reihenfolge =' + IntToStr(z)+';'; SQLDataSet1.ExecSQL; SQLDataSet1.Close; SQLDataSet1.CommandText := // diese Zeile hat in Beitrag #2 gefehlt. 'insert into datenbank_neu.Tabelle42 (spalte1)' + 'select spalte5 ' + 'from datenbank_alt.Tabelle47 where datenbank_alt.Tabelle55.reihenfolge =' + IntToStr(z)+';'; SQLDataSet1.ExecSQL; SQLDataSet1.Close; end; K-H |
AW: Daten mit SQLDataSet in mysql-Datenbank schreiben
Moin...:P
Zitat:
Das hatte ich schon in #9 probiert...:zwinker:
Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var z : Integer; begin for z := 5 to 10 do begin SQLDataSet1.Close; // neu SQLDataSet1.CommandText := 'insert into datenbank_neu.Tabelle5 (spalte1,spalte2,spalte3)' + 'select spalte5,0,spalte12' + 'from datenbank_alt.Tabelle20 where datenbank_alt.Tabelle20.reihenfolge =' + IntToStr(z)+';'; SQLDataSet1.ExecSQL; SQLDataSet1.Close; // neu SQLDataSet1.CommandText := // diese Zeile hat in Beitrag #2 gefehlt. 'insert into datenbank_neu.Tabelle42 (spalte1)' + 'select spalte5 ' + 'from datenbank_alt.Tabelle47 where datenbank_alt.Tabelle55.reihenfolge =' + IntToStr(z)+';'; SQLDataSet1.ExecSQL; Zitat:
Weiterhin hatte ich schon 2 Mal gefragt wie die SQL Statements an den ExecSQL ausehen (nicht aus den Quelltext sondern aus dem Debugger) und die exakte Fehlermeldung an diesen Punkten...:roll: @AnfängerDelphi: Wie sollen wir helfen, wenn unsere Fragen nicht exakt beantwortet werden und die Tipps etwas gebracht haben oder nicht. Wir können nicht zur Laufzeit über deine Schulter schauen...:roll: |
AW: Daten mit SQLDataSet in mysql-Datenbank schreiben
@haentschmann
:oops: Hab ich übersehen :oops: Gruß K-H |
AW: Daten mit SQLDataSet in mysql-Datenbank schreiben
:P Alles wird gut...
|
AW: Daten mit SQLDataSet in mysql-Datenbank schreiben
Hallo haentschman,
kann ich dir meine Projektdatei mal zuschicken. Ich glaube so komme ich hier nicht weiter... da ich noch ein Anfänger bin und dir deine Fragen nicht beantworten kann. Gruß AnfängerDelphi |
AW: Daten mit SQLDataSet in mysql-Datenbank schreiben
Dann hängst Du den Source an Deinen nächsten Beitrag und die halbe Miete ist gezahlt.
Nur was der Debugger zeigt wissen wir dann immer noch nicht. Mit dem Debugger kannst Du umgehen? Gruß K-H |
AW: Daten mit SQLDataSet in mysql-Datenbank schreiben
Moin...:P
Zitat:
Aber: Wir wissen nicht wie dein Kenntnisstand ist. :? Die Werkzeuge der IDE sollten dir vertraut sein, sonst kannst du nicht wirklich programmieren. :roll: Das Wichtigste ist aber den Arsch in der Hose zu haben wenn dir verschiedene Begriffligkeiten nichts sagen und nachzufragen. :thumb: Links zu Debugger: ![]() ![]() ![]() |
AW: Daten mit SQLDataSet in mysql-Datenbank schreiben
Hallo,
meine Programmierkenntnisse sind sehr dürftig. Ich kann eine einfache Formularanwendung erstellen,in der auch z.B. If-Anweisung verwendet werden,das wars dann auch schon. Mit dem Debugger kenne ich mich auch nicht aus. Was ist mein Ziel: Ich brauche eigentlich nur eine Schleife,mit der ich meine Daten von Datenbank1 nach Datenbank2 übertrage. haentschman könntest du mir bitte mal deine E-Mail-Adresse aufschreiben,dann schicke ich dir meine Projektdaten zu. Gruß AnfängerDelphi |
AW: Daten mit SQLDataSet in mysql-Datenbank schreiben
Zitat:
Das ist die Mindestvoraussetzung zur Programmentwicklung und absolut kein Hexenwerk! Rechter Mausklick links neben den Sourcecode wo die Zeilennummern stehen macht einen blauen Balken (Haltepunkt) wo Dien Programm dann stehen bleibt wenn Du es in der IDE mit F9 startest. Mit F8 wird dann Zeile für Zeile weitergearbeitet, überall kannst Du Dir die Inhalte der Variablen etc. ansehen, in eine Unterfunktion springst Du mit F7. Bau Dir ein Miniprogramm wo a=1, b=2 , c = a+b berechnet werden und step das im Debugmodus durch, Du wirst sehen das ist kinderleicht! Ciao Stefan |
AW: Daten mit SQLDataSet in mysql-Datenbank schreiben
Moin...:P
Zitat:
Zitat:
Zitat:
|
AW: Daten mit SQLDataSet in mysql-Datenbank schreiben
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich bedanke mich erstmal für die guten Ratschläge und werde,wenn es die Zeit zuläßt,mich mit dem Debugger näher beschäftigen. Im Anhang befindet sich meine originale Projektdatei. Gruß AnfängerDelphi |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:57 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 by Thomas Breitkreuz