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
Alex.G

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

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 13: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.740 Beiträge
 
Delphi 6 Enterprise
 
#2

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 14: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 14:07 Uhr)
  Mit Zitat antworten Zitat
Alex.G

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

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 14: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.553 Beiträge
 
Delphi 12 Athens
 
#4

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 14: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.
Ein Therapeut entspricht 1024 Gigapeut.

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

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

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 16: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
Furtbichler
(Gast)

n/a Beiträge
 
#6

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 22. Okt 2011, 09:01
Man kann in TSQL ganz einfach VON einem entfernten Server Daten holen, ohne einen Verbindungsserver einzurichten: Statt dem Tabellennamen nimmst du "OPENROWSET", also z.B.
Code:
Insert into MyLocalTargetTable
  Select *
  From OPENROWSET
    (
    'SQLNCLI',
    'Server=MyRemoteSourceServer;Trusted_Connection=yes;...',
    'SELECT * from MYRemoteSourceTable'
    )
Das Kommando führst Du auf dem Server aus, auf dem sich die Zieltabelle befindet.

Wenn in der Zieltabelle IDENTITY-Spalten enthalten sind, dann musst Du die Feldliste (ohne die die IDENTITY-Spalten) noch hinzupacken, ansonsten bekommst Du eine Exception, und ich glaube, das ist das eigentliche Problem. Denn das der Befehl "INSERT INTO Target SELECT * FROM Source" funktioniert schon, nur eben nicht, wenn IDENITY-Spalten vorhanden sind.

Alternativ könnte man noch mit DTS arbeiten, aber das ist ein wenig kompliziert.
  Mit Zitat antworten Zitat
YogiBär

Registriert seit: 2. Apr 2011
Ort: NRW
2 Beiträge
 
#7

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 24. Okt 2011, 11:57
Hallo zusammen,

nachfolgend ein kleiner Quellcode zum Kopieren von Daten

Delphi-Quellcode:
Function TForm1.DirektCopy(Source,Target:TADOTable):Boolean;
Var
   i,j:Integer;
   cfname:String;
Begin
//
Result := False;
Try
j := Source.FieldCount-1;
Source.First;
  While not Source.Eof do
  Begin
    Target.Insert;
    For i := 0 to j do
    Begin
      cfname:=Source.Fields[i].FieldName;
      if uppercase(cfname) <> 'PINDEXthen
      if uppercase(cfname) <> 'ROWGUIIGthen
      if Target.FindField(cfname) <> nil then
      begin
      if (Target.FieldByName(cfname).FieldType <> TGUIField)
      and (Target.FieldByName(cfname).FieldType <> TAutoIncField) then
         if Source.FieldByName(cfname).AsVariant >'then
           Target.FieldByName(cfname).AsVariant := Source.FieldByName(cfname).AsVariant;
      end;
    end;
    Target.post;
    Source.Next;
  end;
  Result := True;
except
  Showmessage('Fehler bei der Umsetzung der Datenbank ');
end;
end;
  Mit Zitat antworten Zitat
Antwort Antwort


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 15:21 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