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 4 von 5   « Erste     234 5      
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 12:14
Ich bin hierfür (mal eben herunter getippt)
Delphi-Quellcode:
procedure CopyADOData( SrcCon, TarCon : TADOConnection; const TableName : string );
var
  SrcData : TADOTable;
  TarData : TADOQuery;
  SqlStrFld : string;
  SqlStrPar : string;
  fld : TField;
begin
  SrcData := TADOTable.Create( nil );
  TarData := TADOQuery.Create( nil );
  try

    SrcData.Connection := SrcCon;
    SrcData.TableName := TableName;
    SrcData.FieldDefList.Update;

    TarData.Connection := TarCon;

    SqlStrFld := '';
    SqlStrPar := '';

    for fld in SrcData.Fields do
      begin
        if not( SqlStrFld = '' )
        then
          SqlStrFld := SqlStrFld + ', ';
        SqlStrFld := SqlStrFld + fld.FieldName;

        if not( SqlStrPar = '' )
        then
          SqlStrPar := SqlStrPar + ', ';
        SqlStrPar := SqlStrPar + ':' + fld.FieldName;
      end;

    TarData.SQL.Text := 'INSERT INTO ' + TableName + ' ( ' + SqlStrFld + ' ) VALUES ( ' + SqlStrPar + ' )';

    TarData.Prepared := True;
    try

      SrcData.Open;
      try

        while not SrcData.Eof do
        begin
          for fld in SrcData.FieldList do
          begin
            TarData.Parameters.ParamByName(fld.FieldName).Value := fld.Value;
          end;
          TarData.ExecSQL;
          SrcData.Next;
        end;

      finally
        SrcData.Close;
      end;

    finally
      TarData.Prepared := False;
    end;

  finally
    TarData.Free;
    SrcData.Free;
  end;
end;
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
Alex.G

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

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 12:15
Und qryMasterExec.Fields[i].FieldName ?
Das funktioniert!
Eine (hoffentlich) letzte Sache noch:
Delphi-Quellcode:
  qrySlaveExec.SQL.Text := Format('INSERT INTO %s (%s) VALUES(%s)', [TableName, InsertStr, ValueStr]);
  while not qryMasterExec.Eof do begin
    qrySlaveExec.Insert;
Ist bei geschlossener Datenmenge nicht möglich. Ein qrySlaveExec.Open kann ich aber, soweit ich weiß, nur bei einem SELECT nutzen.
  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
 
#33

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 12:15
zum fertigbasteln:
Delphi-Quellcode:

Function GetTableValueScript(Ads:TAdodataset;const tableName:String;HasIdentity:Boolean):String;
var

  FieldNames:TStringList;
  Values:TStringList;
  i:Integer;
  FieldNamesStr:String;
  Function Prepare(f:TField):String;
    begin
       if f.IsNull then Result := 'NULL'
       else
       Case
         f.DataType of
          ftSmallint, ftInteger, ftWord,ftAutoInc,ftLargeint,
          ftFloat, ftCurrency, ftBCD ,ftFMTBcd,ftLongWord, ftShortint, ftByte, ftExtended ,ftSingle: Result := Stringreplace(f.AsString, ',','.',[]) ;
          ftString,ftWideString,ftGuid : Result := QuotedStr(f.AsString);
          ftDate, ftDateTime, ftTime : Result := QuotedStr(FormatdateTime('yyyymmdd hh:nn:ss.zzz',f.AsDateTime));
          ftBoolean: Result := IntToStr(Integer(f.AsBoolean));
          // to be continued
       End;
    end;
  Function GetValues:String;
    begin
        Result := StringReplace(Values.Text,#13#10,', ',[rfReplaceAll]);
        Result := Copy(Result,1,Length(Result) - 2);
    end;
begin

  FieldNames:=TStringList.Create;
  Values:=TStringList.Create;
  try
  Ads.CommandText := 'Select top 100 * from ' + tablename;
  Ads.Open;
  for I := 0 to Ads.FieldCount -1 do FieldNames.Add('[' + Ads.Fields[i].FieldName + ']');
  FieldNamesStr := StringReplace(FieldNames.Text,#13#10,', ',[rfReplaceAll]);
  FieldNamesStr := Copy(FieldNamesStr,1,Length(FieldNamesStr) - 2);
  while not Ads.Eof do
    begin
      Values.Clear;
      for I := 0 to Ads.FieldCount -1 do Values.Add(Prepare(Ads.Fields[i]));
      Ads.Next;
      Result := Result + 'Insert Into ' + tablename + '(' + FieldNamesStr + ') VALUES (' + GetValues + ')'  + #13#10#13#10;
    end;
  finally
    FieldNames.Free;
    Values.Free;
  end;
  if HasIdentity then
    Result := 'Set Identity_Insert ' + tableName + ' ON' + #13#10
               + Result
               + 'Set Identity_Insert ' + tableName + ' OFF' + #13#10

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Text := GetTableValueScript(ADS,'[Adressen]',true);
end;
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 joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
679 Beiträge
 
Delphi 12 Athens
 
#34

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 12:34
Delphi-Quellcode:
  qrySlaveExec.SQL.Text := Format('INSERT INTO %s (%s) VALUES(%s)', [TableName, InsertStr, ValueStr]);
  while not qryMasterExec.Eof do begin
    qrySlaveExec.Insert;
Ist bei geschlossener Datenmenge nicht möglich.
  qrySlaveExec.ExecSQL;
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Alex.G

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

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 12:49
Delphi-Quellcode:
  qrySlaveExec.SQL.Text := Format('INSERT INTO %s (%s) VALUES(%s)', [TableName, InsertStr, ValueStr]);
  while not qryMasterExec.Eof do begin
    qrySlaveExec.Insert;
Ist bei geschlossener Datenmenge nicht möglich.
  qrySlaveExec.ExecSQL;
ExecSQL bevor man die Parameter angegeben hat?
EDIT: Ergibt wieder eine Exception

Code:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt pDatenbankabgleich.exe ist eine Exception der Klasse EOleException aufgetreten. Meldung: 'Der Wert NULL kann in die 'ID'-Spalte, 'TestDB2.dbo.Produkt'-Tabelle nicht eingefügt werden. Die Spalte lässt NULL-Werte nicht zu. Fehler bei INSERT'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK  Hilfe  
---------------------------

Geändert von Alex.G (21. Okt 2011 um 13:00 Uhr)
  Mit Zitat antworten Zitat
Alex.G

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

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 14:49
Delphi-Quellcode:
    while not qryMasterExec.Eof do begin
      for i := 0 to qryMasterExec.Fields.Count - 1 do
        valList.Add(qryMasterExec.Fields[i].Value);

      valueStr := valList.CommaText;
      qrySlaveExec.SQL.Text := Format('INSERT INTO %s (%s) VALUES(%s)',
        [TableName, InsertStr, ValueStr]);
      qrySlaveExec.ExecSQL;
      qryMasterExec.Next;
    end;
Gibt mir wieder eine Exception:
Code:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt pDatenbankabgleich.exe ist eine Exception der Klasse EOleException aufgetreten. Meldung: 'Der Name "Acer Monitor       " ist in diesem Kontext nicht zulässig. Gültige Ausdrücke sind Konstanten, konstante Ausdrücke und (in bestimmten Kontexten) Variablen. Spaltennamen sind nicht zulässig'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK  Hilfe  
---------------------------
Wieso sollte Acer Monitor nicht zulässig sein? Es steht an der richtigen Stelle und ist ein 20-Zeichen langer String. (In der Datenbank: nChar(20))
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.737 Beiträge
 
Delphi 6 Enterprise
 
#37

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 15:04
Es ist ein String, wird aber innerhalb des Strings nicht in Anführungsstrichen stehen. D.h. du musst String-Felder in deinem Value-String in Gänsefüßchen setzen, also wäre der Sting gleich:

'1,1,Acer Monitor,10.10.2011' müsste er eigentlich sein:
'1,1,'Acer Monitor','10.10.2011'' und noch eigentlicher, müssten die Anführungsstrich maskiert werden, also:
'1,1,''Acer Monitor'',''10.10.2011''' und das Datumfeld müsste ggf. nochmal anders behandelt werden. In Oracle säh das z.B. evtl. so aus:
'1,1,''Acer Monitor'',To_Date(''10.10.2011'',''dd.mm.yyyy'')'

Besser wäre es glaub ich generell mit Parametern zu arbeiten, dann haste das Problem nicht, denn in der Form wie du das machst, müssteste je nach Feldtyp in der Mastertabelle die Elemente des Value-Strings anpassen.

Edit: Siehe z.B. mal wie Bummi das in #33 gemacht hat!

Der Passus hier:
Delphi-Quellcode:
if f.IsNull then Result := 'NULL'
       else
       Case
         f.DataType of
          ftSmallint, ftInteger, ftWord,ftAutoInc,ftLargeint,
          ftFloat, ftCurrency, ftBCD ,ftFMTBcd,ftLongWord, ftShortint, ftByte, ftExtended ,ftSingle: Result := Stringreplace(f.AsString, ',','.',[]) ;
          ftString,ftWideString,ftGuid : Result := QuotedStr(f.AsString);
          ftDate, ftDateTime, ftTime : Result := QuotedStr(FormatdateTime('yyyymmdd hh:nn:ss.zzz',f.AsDateTime));
          ftBoolean: Result := IntToStr(Integer(f.AsBoolean));
          // to be continued
End
Ralph

Geändert von Jumpy (21. Okt 2011 um 15:07 Uhr)
  Mit Zitat antworten Zitat
Alex.G

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

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 15:11
Es ist ein String, wird aber innerhalb des Strings nicht in Anführungsstrichen stehen. D.h. du musst String-Felder in deinem Value-String in Gänsefüßchen setzen, also wäre der Sting gleich:

'1,1,Acer Monitor,10.10.2011' müsste er eigentlich sein:
'1,1,'Acer Monitor','10.10.2011'' und noch eigentlicher, müssten die Anführungsstrich maskiert werden, also:
'1,1,''Acer Monitor'',''10.10.2011''' und das Datumfeld müsste ggf. nochmal anders behandelt werden. In Oracle säh das z.B. evtl. so aus:
'1,1,''Acer Monitor'',To_Date(''10.10.2011'',''dd.mm.yyyy'')'

Besser wäre es glaub ich generell mit Parametern zu arbeiten, dann haste das Problem nicht, denn in der Form wie du das machst, müssteste je nach Feldtyp in der Mastertabelle die Elemente des Value-Strings anpassen.

Edit: Siehe z.B. mal wie Bummi das in #33 gemacht hat!

Der Passus hier:
Delphi-Quellcode:
if f.IsNull then Result := 'NULL'
       else
       Case
         f.DataType of
          ftSmallint, ftInteger, ftWord,ftAutoInc,ftLargeint,
          ftFloat, ftCurrency, ftBCD ,ftFMTBcd,ftLongWord, ftShortint, ftByte, ftExtended ,ftSingle: Result := Stringreplace(f.AsString, ',','.',[]) ;
          ftString,ftWideString,ftGuid : Result := QuotedStr(f.AsString);
          ftDate, ftDateTime, ftTime : Result := QuotedStr(FormatdateTime('yyyymmdd hh:nn:ss.zzz',f.AsDateTime));
          ftBoolean: Result := IntToStr(Integer(f.AsBoolean));
          // to be continued
End
Es soll ja noch gar kein Datum rein. Werde es morgen oder so mal fertig machen. Allen vielen Dank für die Hilfe!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 15:20
Und dafür war die parametrisierte Variante vorgesehn ... dort muß man sich um nichts kümmern,
aber irgendwo sollte es auch eine QuoteString-Funktion geben, welche die ' für dich setzt.
$2B or not $2B

Geändert von himitsu (21. Okt 2011 um 17:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#40

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 17:02
Wenn Du Parameter benutzt brauchst Du keine Quoted Strings.
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
Antwort Antwort
Seite 4 von 5   « Erste     234 5      


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 03:46 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