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.