Einzelnen Beitrag anzeigen

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