Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi INSERT INTO SELECT ohne Spaltenliste (https://www.delphipraxis.net/163828-insert-into-select-ohne-spaltenliste.html)

Bummi 18. Okt 2011 13:30

AW: INSERT INTO SELECT ohne Spaltenliste
 
@joachimd
Du hast recht, ich hatte nicht gesehen dass er die Tabellen schon angelegt hatte ....

Alex.G 21. Okt 2011 07:34

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:
  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;
...bekomme ich leider nur Insert's wie:
Code:
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              )
(Alle Daten sind ausgedacht!)
Was mache ich falsch?

Sir Rufo 21. Okt 2011 07:55

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 ;)

DeddyH 21. Okt 2011 08:12

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:
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]);
Anschließend könnte man dann in einer Schleife den Parametern die aktuellen Werte zuweisen.

Alex.G 21. Okt 2011 08:23

AW: INSERT INTO SELECT ohne Spaltenliste
 
Zitat:

Zitat von DeddyH (Beitrag 1131621)
Nur so ein Gedanke: könnte man nicht das SQL über GetFieldnames zusammensetzen? Aus der hohlen Hand:
Delphi-Quellcode:
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]);
Anschließend könnte man dann in einer Schleife den Parametern die aktuellen Werte zuweisen.

Ergibt leider:
Code:
---------------------------
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  
---------------------------
EDIT: Exception kommt bei conMaster.GetFieldNames(tableName, fieldList);

Bummi 21. Okt 2011 08:25

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

DeddyH 21. Okt 2011 08:25

AW: INSERT INTO SELECT ohne Spaltenliste
 
Die Feldliste hast Du aber erzeugt, und die Connection ist aktiv?

Alex.G 21. Okt 2011 08:30

AW: INSERT INTO SELECT ohne Spaltenliste
 
Zitat:

Zitat von Bummi (Beitrag 1131626)
Warum richtest Du keinen Verbindungsserver ein, geht auch über Script und fährst

Insert into Ziel
Select * from verbindungsserver.ddo.quelle

Soll es ohne einen Verbindungsserver lösen :wink:

Zitat:

Zitat von DeddyH (Beitrag 1131627)
Die Feldliste hast Du aber erzeugt, und die Connection ist aktiv?

Es ist früh am Morgen... :-D habe es jetzt erzeugt, trotzdem eine Exception bei columnList := fieldList.CommaText;
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  
---------------------------

DeddyH 21. Okt 2011 08:33

AW: INSERT INTO SELECT ohne Spaltenliste
 
Von welchem Typ ist denn Fieldlist? Falls TStrings, dann mach mal TStringlist daraus.

himitsu 21. Okt 2011 08:49

AW: INSERT INTO SELECT ohne Spaltenliste
 
Und wie sieht es mit sowas aus?
Delphi-Quellcode:
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;
Und ich glub das Quoten der Values wurden oftmals vergessen.
(entfällt bei dem Preparedzeugs aber)


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:50 Uhr.
Seite 2 von 5     12 34     Letzte »    

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