AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Daten mit SQLDataSet in mysql-Datenbank schreiben
Thema durchsuchen
Ansicht
Themen-Optionen

Daten mit SQLDataSet in mysql-Datenbank schreiben

Ein Thema von AnfängerDelphi · begonnen am 29. Mär 2017 · letzter Beitrag vom 6. Apr 2017
Antwort Antwort
Seite 1 von 3  1 23      
AnfängerDelphi

Registriert seit: 20. Mai 2010
25 Beiträge
 
#1

Daten mit SQLDataSet in mysql-Datenbank schreiben

  Alt 29. Mär 2017, 19:42
Datenbank: Mysql • Version: 5.7 • Zugriff über: Delphi xe3
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:
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;
Wenn ich auf den Button klicke,werde 6 Datensätze in die Datenbank geschrieben.

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
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: Daten mit SQLDataSet in mysql-Datenbank schreiben

  Alt 29. Mär 2017, 20:01
Würde jetzt einfach mal behaupten, dass sowas hgehen sollte:
Delphi-Quellcode:
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;
Also: Meiner Meinung nach kann man nacheinander belibige Statements hintereinander per ExecSQL ausführen lassen.

Ein Zusammenhang muss nicht zwingend gegeben sein, egal ob in einer Schleife oder nicht.

Zitat:
Kann ich einfach eine weitere Insert-Anweisung unter die vorhandene schreiben?
Meiner Meinung nach ganz klar Ja.

Geändert von nahpets (30. Mär 2017 um 10:42 Uhr) Grund: Von Jobo entdeckten Fehler behoben.
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#3

AW: Daten mit SQLDataSet in mysql-Datenbank schreiben

  Alt 30. Mär 2017, 09:28
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;
Ralph
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#4

AW: Daten mit SQLDataSet in mysql-Datenbank schreiben

  Alt 30. Mär 2017, 10:19
Delphi-Quellcode:
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;
  'insert into datenbank_neu.Tabelle42 (spalte1)' +
  'select spalte5 ' +
  'from datenbank_alt.Tabelle47 where datenbank_alt.Tabelle55.reihenfolge =' + IntToStr(z)+';';
  SQLDataSet1.ExecSQL;
Da fehlt wohl versehentlich das 2.mal Setzung des CommandText im Beispiel.
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.
Gruß, Jo
  Mit Zitat antworten Zitat
AnfängerDelphi

Registriert seit: 20. Mai 2010
25 Beiträge
 
#5

AW: Daten mit SQLDataSet in mysql-Datenbank schreiben

  Alt 30. Mär 2017, 22:14
Hallo an alle,

ich habe noch einmal paar Test's durchgeführt und muß sagen,jobo hat recht.
Zitat von jobo:
Mehrer Abfragen / Statements hintereinander funktionieren m.E. in kaum einer dieser Implementierungen.
Wenn ich nur eine Insert-Anweisung verwende,werden 6 Datensätze in die Datenbank geschrieben,bei zwei Insert-Anweisungen bekomme ich eine Fehlermeldung und es wird nur ein Datensatz geschrieben.
Code:
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
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?

Gruß AnfängerDelphi
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#6

AW: Daten mit SQLDataSet in mysql-Datenbank schreiben

  Alt 30. Mär 2017, 23:16
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.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.289 Beiträge
 
Delphi 12 Athens
 
#7

AW: Daten mit SQLDataSet in mysql-Datenbank schreiben

  Alt 31. Mär 2017, 06:52
Moin...
Zitat:
oder ist es besser PHP dafür zu benutzen?
... er hat Jehova gesagt.
Was ist mit dir los? Gleich die Flinte ins Korn werfen wenn etwas nicht auf Anhieb funktioniert.

Hast du dich auch mit den Grundlagen der DBX Komponente befaßt?
http://docwiki.embarcadero.com/Libra...on.TDBXCommand
Zitat:
Die Eigenschaft TDBXCommand.Text wird auf den Befehl gesetzt, der ausgeführt werden soll.
...da steht das das Command.Text für diese eine SQL Anweisung gültig ist die mit ExecSQL ausgeführt wird/werden soll.

http://docwiki.embarcadero.com/Libra...and.Parameters
Zitat:
Parameter können mit der Eigenschaft TDBXCommand.Parameters hinzugefügt.
...das wichtigste sind auch Parameter. Stichwort: SQL Injection.


Die Lösung hast doch schon...
Delphi-Quellcode:
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;
Hast du den letzten Stand des Beispiels?

Zitat:
Exception-Klasse TDBXError mit Meldung 'You have an error in your SQL syntax...
Das sagt doch alles. Wie sehen die einzelnen CommandText an jedem ExecSQL aus? (Debugger)

Hinweis:
Hast du dich mal mit der MySQL Lizenzfalle (libmysql.dll) beschäftigt?
http://www.entwickler-ecke.de/viewto...er=asc&start=0
...oder anders gefragt: Warum ist die Entscheidung auf MySQL gefallen?

Geändert von haentschman (31. Mär 2017 um 07:22 Uhr)
  Mit Zitat antworten Zitat
AnfängerDelphi

Registriert seit: 20. Mai 2010
25 Beiträge
 
#8

AW: Daten mit SQLDataSet in mysql-Datenbank schreiben

  Alt 31. Mär 2017, 16:49
Hallo,

mal ein paar Grundinformationen.
Zitat von haentschman:
...oder anders gefragt: Warum ist die Entscheidung auf MySQL gefallen?
Die Entscheidung eine Mysql-Datenbank zu benutzen,kommt nicht von mir,sondern wird durch die Software vorgegeben,die ich verwende.
Mein Ziel ist es,die Daten von einer bestehenden Mysql-Datenbank in die neue Datenbank zu übertragen,ohne Zwischenspeicherung.

Delphi-Quellcode:
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;
Die fehlende CommandText Zeile habe ich schon eingefügt,aber der Fehler hängt mit der zweiten Insert-Anweisung zusammen.
Wenn ich die zweite Insert-Anweisung auskommentiere funktioniert es problemlos.
Aber ich benötige auch die zweite Insert-Anweisung.

Zitat:
Hast du dich auch mit den Grundlagen der DBX Komponente befaßt?
Nein,habe ich bis jetzt noch nicht gemacht.
Ich schaue mir es mal genauer an und werde es auch ausprobieren.

Zitat von jobo:
Der nächste Verwandte der Anonymen Blöcke sind die Stored Procedures
Ich habe mir mal kurz die Infos dazu durchgelesen,klingt auf jeden Fall mal nicht schlecht.
Kann ich meine Insert-Anweisungen so übernehmen?

Gruß AnfängerDelphi
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.289 Beiträge
 
Delphi 12 Athens
 
#9

AW: Daten mit SQLDataSet in mysql-Datenbank schreiben

  Alt 31. Mär 2017, 17:01
Hallöle...
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.... Prüfe ob die Tabellen im Ziel existieren etc.
Es könnte sein, daß das SQLDataSet1.Close; vor jedem Command.Text erwartet wird.
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:
use near '.datenbank_alt.Tabelle47 where
...in der Fehlermeldung steht: .datenbank_alt...da ist vor der datenbank_alt ein Punkt? Im Beispiel ist keiner: from datenbank_alt.Tabelle47 where
Deshalb brauchen wir das Original aus dem Debugger...
Zitat:
Ich schaue mir es mal genauer an und werde es auch ausprobieren.
...schaue dir als allererstes die Parameter und deren Verwendung an...da hast du weniger Streß mit QuotedStr Orgien.

Geändert von haentschman (31. Mär 2017 um 17:20 Uhr)
  Mit Zitat antworten Zitat
AnfängerDelphi

Registriert seit: 20. Mai 2010
25 Beiträge
 
#10

AW: Daten mit SQLDataSet in mysql-Datenbank schreiben

  Alt 2. Apr 2017, 18:34
Hallo,

Zitat von haentschman:
Was ist mit dir los? Gleich die Flinte ins Korn werfen wenn etwas nicht auf Anhieb funktioniert.
Ich habe leider nicht immer so viel Zeit zur Verfügung,weil ich dies noch neben meiner regulären Arbeit mache.

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:
  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
Ich habe mir auch das mit SQLStoredProc durchgelesen,aber so richtig klar komme ich damit nicht.
Müßte dies dann so aussehen???
Delphi-Quellcode:
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;
Die Verbindung zur Datenbank stelle ich über einen separaten Button her,bevor ich den Button4 anklicke und die Anweisung ausführe.

Gruß AnfängerDelphi

Geändert von AnfängerDelphi ( 2. Apr 2017 um 18:37 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 Uhr.
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