![]() |
Re: INSERT INTO & MS Access
@marabu: Es verstößt nicht gegen die Regeln....Die Tabelle wird tausendmal anderweitig verwendet. Ich lese die Feldnamen vorher aus der Accesstabelle aus und übergebe diese dann an den SQL-String folgendermaßen:
Delphi-Quellcode:
Das mySQLDS besitzt mindestens alle Felder, welche in der Accesstabelle vorhanden sind und mehr.
Lst := TStringList.Create;
try for n := 0 to myaccessDS.FieldCount - 1 do begin if (Pos('Logo', myaccessDS.Fields.Fields[n].FieldName) = 0) then Lst.Add(myaccessDS.Fields.Fields[n].FieldName); end; finally myFields := Lst.Commatext; Lst.Free; end; ... while not MySQLDS.Eof do begin myValues := AnsiQuotedStr(mySQLds.FieldByName('Category').AsString, #39) +','; myValues := myValues + AnsiQuotedStr(mySQLds.FieldByName('Name').AsString, #39) +','; ... SQL := 'INSERT INTO race00 (' + myFields + ') VALUES (' + myValues + ')'; try if myaccessDB.Connected then begin myaccessComm.CommandText := SQL; myaccessComm.Execute; end; except end; end; @hoika: Welche Parameter? |
Re: INSERT INTO & MS Access
Zitat:
SQL-Code:
INSERT INTO myTable (Feld1,Feld2,Feld3,Feld4,Feld5,Feld6,Feld7) VALUES (:wert1, :wert2, ...);
Delphi-Quellcode:
myCommand.Parameters.ParamByName('wert1).Value := ...;
|
Re: INSERT INTO & MS Access
Welchen Sinn hat diese Abfrage. davon abgesehen verstehe ich nicht was ich mit der Zuweisung des Doppelpunkts und die von Parambyname machen soll. :?
|
Re: INSERT INTO & MS Access
Moonly,
wenn du schon dein SQL-Statement in einer String-Variable stehen hast, dann sehe die dir doch in dem Debugger mal an. Ist ziemlich durcheinander dein Code ;) die Felder sind alle Felder mit LogoX, die Werte holst du dir aus Category.Wenn jetzt weniger Category als Logo-Felder existieren, knallt es auf jeden Fall. Ausserdem rufst du die Insert-Query für jeden Datensatz in MySQLDS einmal auf, ist das gewollt ? Vielleicht steht ganz hinten (vor der Schliessenklammer) des Value laut deinem Code ein Komma zu viel. Was steht denn nun direkt in der Abfrage (SQL)? Heiko PS: mit Parametern ( : ) kannst du das QuotedStr weglassen, das macht das AsString selber. |
Re: INSERT INTO & MS Access
In der Abfrage stellt man nur parameter ein. Diese erkennt man an dem vorangestellten Doppelpunkt. Später füllt man diese mit Werten.
Vorteile: -Format der Werte wird anhand der Parameter gesetzt -< Keine Quoten nötig -Abfrage kann öfters verwendet werden und nur die Parameter werden an das DBMS übertragen. |
Re: INSERT INTO & MS Access
@hoika:
1. Wenn du aufgepasst hättest, dann würdest du im source auch sehen, dass ich alle Felder einlese bei denen es NICHT LOGO heißt! Ich hole mir nur einen Wert aus einem anderen Dataset aus einem bestimmten Feld. Diese Felder existieren auch mit 100%iger Sicherheit. 2. Jeder Datensatz soll einzeln eingefügt werden 3. Im Insert-Befehl steht alles vollkommen richtig drin, denn ich habe mir meine SQL-Variable beobachtet, habe den Wert dieser kopiert und in der Accesstablle direkt als Abfrage eingefügt, und hier funktioniert der Befehle wenn ich diesen ausführe. @kinzler: Wenn ich erst die parameter setze und dann erst die Werte dann brauche ich doppelt soviel source. außerdem hat das bis jetzt bei all meinen tausenden von abragen immer so geklappt. |
Re: INSERT INTO & MS Access
Du mußt die Abfrage ja nur einmal setzen. In der Schleife brauchst du nur noch die Parameter setzen.
|
Re: INSERT INTO & MS Access
das kommt doch aufs gleiche raus ob ich zusätzlich die parameter setze oder ob ich von vornherein die einzelnen werte setze, oder sehe ich das falsch?
nichts desto trotz bleibt dennoch der fehler bestehen... |
Re: INSERT INTO & MS Access
Zitat:
-Man muß Typen nicht beachten -Abfrage ist übersichtlicher. |
Re: INSERT INTO & MS Access
Die Anzahl der Inserts hängt von der Datenmenge ab. Das könnte schon bis zu den 100000en führen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:26 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