AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi INSERT INTO SELECT ohne Spaltenliste
Thema durchsuchen
Ansicht
Themen-Optionen

INSERT INTO SELECT ohne Spaltenliste

Ein Thema von Alex.G · begonnen am 18. Okt 2011 · letzter Beitrag vom 24. Okt 2011
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#11

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 18. Okt 2011, 13:30
@joachimd
Du hast recht, ich hatte nicht gesehen dass er die Tabellen schon angelegt hatte ....
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Alex.G

Registriert seit: 30. Aug 2011
31 Beiträge
 
Delphi 7 Enterprise
 
#12

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 07:34
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?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#13

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 07:55
Nimm den Debugger und steppe mal durch die Anwendung.

Richte dein Augenmerk besonders auf die Laufvariablen aus den For-Schleifen
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 08:12
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Alex.G

Registriert seit: 30. Aug 2011
31 Beiträge
 
Delphi 7 Enterprise
 
#15

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 08:23
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);
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#16

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 08:25
Warum richtest Du keinen Verbindungsserver ein, geht auch über Script und fährst

Insert into Ziel
Select * from verbindungsserver.ddo.quelle
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 08:25
Die Feldliste hast Du aber erzeugt, und die Connection ist aktiv?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Alex.G

Registriert seit: 30. Aug 2011
31 Beiträge
 
Delphi 7 Enterprise
 
#18

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 08:30
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

Die Feldliste hast Du aber erzeugt, und die Connection ist aktiv?
Es ist früh am Morgen... 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  
---------------------------
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 08:33
Von welchem Typ ist denn Fieldlist? Falls TStrings, dann mach mal TStringlist daraus.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#20

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 08:49
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (21. Okt 2011 um 10:23 Uhr) Grund: In Source die Params gegen Fields getauscht
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    


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 16:54 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