![]() |
AW: INSERT INTO SELECT ohne Spaltenliste
@joachimd
Du hast recht, ich hatte nicht gesehen dass er die Tabellen schon angelegt hatte .... |
AW: INSERT INTO SELECT ohne Spaltenliste
Als erstes mache ich ein SELECT * ... über eine ADOConnection zum ersten Server. Danach über eine zweite Connection ein INSERT INTO ...
Leider funktioniert das ganze nicht richtig. Mit diesem Quelltext...
Delphi-Quellcode:
...bekomme ich leider nur Insert's wie:
for i := 0 to qryMaster.Recordset.RecordCount-1 do
begin columnList := ''; valList := ''; qryMasterExec.SQL.Text := 'SELECT * FROM ' + qryMaster.Recordset.Fields.Item['TABLE_NAME'].Value; qryMasterExec.Open; qryMasterExec.Requery; qryMasterExec.Recordset.MoveFirst; for n := 0 to qryMasterExec.Recordcount-1 do begin for t := 0 to qryMasterExec.RecordCount-1 do begin columns[t] := qryMaster.Recordset.Fields.Item['COLUMN_NAME'].Value; values[t] := qryMasterExec.Recordset.Fields.Item[columns[t]].Value; end; qryMasterExec.Recordset.MoveNext; end; for e := 0 to High(values)-1 do begin columnlist := columnlist + columns[e] + ' '; valList := valList + values[e] + ' '; mSQL.Lines.Add('INSERT INTO ' + qryMaster.Recordset.Fields.Item['TABLE_NAME'].Value + ' ('+columnList+') VALUES' + ' ('+valList+')' ); end; qryMaster.Recordset.MoveNext; end;
Code:
(Alle Daten sind ausgedacht!)
INSERT INTO Rechnung (ID ) VALUES (4 )
INSERT INTO Rechnung (ID ID ) VALUES (4 4 ) INSERT INTO Rechnung (ID ID ID ) VALUES (4 4 4 ) INSERT INTO Rechnung (KID ) VALUES (2 ) INSERT INTO Rechnung (KID KID ) VALUES (2 2 ) INSERT INTO Rechnung (KID KID KID ) VALUES (2 2 2 ) INSERT INTO Rechnung (PID ) VALUES (1 ) INSERT INTO Rechnung (PID PID ) VALUES (1 1 ) INSERT INTO Rechnung (PID PID PID ) VALUES (1 1 1 ) INSERT INTO Kunde (ID ) VALUES (3 ) INSERT INTO Kunde (ID ID ) VALUES (3 3 ) INSERT INTO Kunde (ID ID ID ) VALUES (3 3 3 ) INSERT INTO Kunde (Name ) VALUES (Plaum ) INSERT INTO Kunde (Name Name ) VALUES (Plaum Plaum ) INSERT INTO Kunde (Name Name Name ) VALUES (Plaum Plaum Plaum ) INSERT INTO Kunde (Vorname ) VALUES (Jürgen ) INSERT INTO Kunde (Vorname Vorname ) VALUES (Jürgen Jürgen ) INSERT INTO Kunde (Vorname Vorname Vorname ) VALUES (Jürgen Jürgen Jürgen ) INSERT INTO Kunde (Ort ) VALUES (Siegen ) INSERT INTO Kunde (Ort Ort ) VALUES (Siegen Siegen ) INSERT INTO Kunde (Ort Ort Ort ) VALUES (Siegen Siegen Siegen ) INSERT INTO Produkt (ID ) VALUES (2 ) INSERT INTO Produkt (ID ID ) VALUES (2 2 ) INSERT INTO Produkt (ID ID Ort ) VALUES (2 2 Siegen ) INSERT INTO Produkt (Name ) VALUES (Lenovo R500 ) INSERT INTO Produkt (Name Name ) VALUES (Lenovo R500 Lenovo R500 ) INSERT INTO Produkt (Name Name Ort ) VALUES (Lenovo R500 Lenovo R500 Siegen ) INSERT INTO Produkt (Kommentar ) VALUES (Lenovo Thinkpad Laptop ) INSERT INTO Produkt (Kommentar Kommentar ) VALUES (Lenovo Thinkpad Laptop Lenovo Thinkpad Laptop ) INSERT INTO Produkt (Kommentar Kommentar Ort ) VALUES (Lenovo Thinkpad Laptop Lenovo Thinkpad Laptop Siegen ) Was mache ich falsch? |
AW: INSERT INTO SELECT ohne Spaltenliste
Nimm den Debugger und steppe mal durch die Anwendung.
Richte dein Augenmerk besonders auf die Laufvariablen aus den For-Schleifen ;) |
AW: INSERT INTO SELECT ohne Spaltenliste
Nur so ein Gedanke: könnte man nicht das SQL über GetFieldnames zusammensetzen? Aus der hohlen Hand:
Delphi-Quellcode:
Anschließend könnte man dann in einer Schleife den Parametern die aktuellen Werte zuweisen.
InitialSQL := 'INSERT INTO %s(%s) VALUES(%s)';
ADOConnection.GetFieldNames(<Tabellenname>, <Feldliste>); FieldnameStr := <Feldliste>.CommaText; for i := 0 to <Feldliste>.Count - 1 do <Feldliste>[i] := ':' + <Feldliste>[i]; ParamnameStr := <Feldliste>.CommaText; InsertQuery.SQL.Text := Format(InitialSQL, [<Tabellenname>, FieldnameStr, ParamnameStr]); |
AW: INSERT INTO SELECT ohne Spaltenliste
Zitat:
Code:
EDIT: Exception kommt bei conMaster.GetFieldNames(tableName, fieldList);
---------------------------
Benachrichtigung über Debugger-Exception --------------------------- Im Projekt pDatenbankabgleich.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 0046A3CE in Modul 'pDatenbankabgleich.exe'. Schreiben von Adresse 0048AAA8'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen. --------------------------- OK Hilfe --------------------------- |
AW: INSERT INTO SELECT ohne Spaltenliste
Warum richtest Du keinen Verbindungsserver ein, geht auch über Script und fährst
Insert into Ziel Select * from verbindungsserver.ddo.quelle |
AW: INSERT INTO SELECT ohne Spaltenliste
Die Feldliste hast Du aber erzeugt, und die Connection ist aktiv?
|
AW: INSERT INTO SELECT ohne Spaltenliste
Zitat:
Zitat:
Code:
---------------------------
Benachrichtigung über Debugger-Exception --------------------------- Im Projekt pDatenbankabgleich.exe ist eine Exception der Klasse EAbstractError aufgetreten. Meldung: 'Abstrakter Fehler'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen. --------------------------- OK Hilfe --------------------------- |
AW: INSERT INTO SELECT ohne Spaltenliste
Von welchem Typ ist denn Fieldlist? Falls TStrings, dann mach mal TStringlist daraus.
|
AW: INSERT INTO SELECT ohne Spaltenliste
Und wie sieht es mit sowas aus?
Delphi-Quellcode:
Und ich glub das Quoten der Values wurden oftmals vergessen.
Source.SQL.Text := 'SELECT * FROM ' + TableName;
Source.ExecSQL; InsertStr := ''; ValueStr := ''; for i := 0 to Source.ParamCount - 1 do begin InsertStr := InsertStr + IfThen(InsertStr <> '', ', ', '') + Source.Fields[i].FieldName; ValueStr := ValueStr + IfThen(ValueStr <> '', ', :', ':') + Source.Fields[i].FieldName; end; Dest.SQL.Text := Format('INSERT INTO %s (%s) VALUES(%s)', [TableName, InsertStr, ValueStr]); while not Source.Eof do begin Dest.Insert; for i := 0 to Source.ParamCount - 1 do Dest.Params.ParamByName(Source.Fields[i].FieldName).Value := Source.Fields.FieldByName(Source.Fields[i].FieldName).Value; Dest.Post; end; (entfällt bei dem Preparedzeugs aber) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:50 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