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, 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 joachimd
joachimd

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

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
 
#3

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
 
#4

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.739 Beiträge
 
Delphi 6 Enterprise
 
#5

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
 
#6

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.313 Beiträge
 
Delphi 12 Athens
 
#7

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.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (21. Okt 2011 um 17:15 Uhr)
  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 22:40 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 by Thomas Breitkreuz