Entwickler-Ecke

Datenbanken - mehrere INSERT mit TQuery


axlegolas - Mo 13.02.06 10:52
Titel: mehrere INSERT mit TQuery

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
TableSet:= TADOQuery.Create(Self);                                        
      TableSet.ConnectionString:= 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+pDatabase+';Persist Security Info=False';
      TableSet.SQL.Clear;
      TableSet.SQL.Add('CREATE TABLE Version(Tabellenname CHARACTER(30) NOT NULL,'+
             'Versionsnummer SMALLINT)');
      TableSet.ExecSQL;
      TableSet.SQL.Clear;
      TableSet.SQL.Add('INSERT INTO Version (Tabellenname,Versionsnummer)');
      TableSet.SQL.Add('VALUES ("Version","'+IntToStr(Tab_Version_VN)+'"),'+
                       '("DerivBestaende","'+IntToStr(Tab_DerivBest_VN)+'"),'+
                       '("RepCashBuchungen","'+IntToStr(Tab_CashRep_VN)+'"),'+
                       '("RepDerivOpenPos","'+IntToStr(Tab_DerivOpenRep_VN)+'"),'+
                       '("RepDerivOrder","'+IntToStr(Tab_DerivOrdRep_VN)+'"),'+
                       '("RepDerivTransList","'+IntToStr(Tab_DerivTransRep_VN)+'"),'+
                       '("RepMarginDetail","'+IntToStr(Tab_MarginRep_VN)+'"),'+
                       '("RepWPBestaende","'+IntToStr(Tab_WPBestRep_VN)+'"),'+
                       '("RepWPOrder","'+IntToStr(Tab_WPOrdRep_VN)+'"),'+
                       '("RepWPTrans","'+IntToStr(Tab_WPTransRep_VN)+'"),'+
                       '("WPBestaende","'+IntToStr(Tab_WPBest_VN)+'");');
      TableSet.ExecSQL;

Fehlermeldung: Fehlendes Semikolon am Ende der SQL Anweisung!?!?

Zudem möchte ich beide ExecSQL zusammenfassen

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt


mkinzler - Mo 13.02.06 11:00

Ich würde die Abfrage als paramterisierten Query ausführen.
TQuery unterstützt nur einfache Statements, daher ist es nicht möglich mehrere Staements auf einmal auszuführen, dafür gibt es spezielle Komponenten.
Für den Zugriff auf access-Datenbanken sind die ADO-Komponenten besser geeignet.


axlegolas - Mo 13.02.06 11:03

Deshalb benutze ich auch eine ADOQuery-Komponente


mkinzler - Mo 13.02.06 11:08

Zitat:
ich möchte mit einer TQuery einen SQL Befehl ausführen

Deshalb ging ich von der BDE aus. TADOCommand wäre dann die richtige Komponente. Den mehrfach INSERT würde ich aber wegwn der Flexibilität in der Anzahl der einzufügenden Datensätze über eine parameterisierten Query (TADOQuery) machen.


axlegolas - Mo 13.02.06 11:18

Irgendwie verstehe ich dich nicht. ich benutze doch die ADOQuery. Es funktioniert auch alles ganz gut, bis auf die SQL-Syntax. Die Fehlermeldung sagt mir es fehlt ein Semikolon und ich sehe den Wald vor lauter Bäumen nicht....
Ich habe gehofft mir kann einer sagen wo dieser Fehler liegt (in der Syntax)!!!!


KidPaddle - Mo 13.02.06 11:24

Welche Datenbank verwendest Du? Außer MySQL kenne ich keine Datenbank, die in einem INSERT - Statement mehrere Wertepaare einfügen kann, sondern immer nur ein Wertepaar pro INSERT. Das würde die Fehlermeldung nach dem fehlenden Semikolon, welches dann nach dem ersten Wertepaar sein sollte, erklären.

Gruß
Thomas


axlegolas - Mo 13.02.06 11:30

Ich bin leider gezwungen eine Access-db zu verwenden. Aber bist du sicher, daß es an der Datenbank liegt? Hört sich für mich nicht plausibel an. Ich denke ich werde irgendwo einen kleinen Syntaxfehler eingebaut haben. In anderen Foren oder Tutorials war es nämlich auch möglich...


noidic - Mo 13.02.06 11:35

Mit Delphi-Tags wärs warscheinlich schneller gegangen...

Am Ende des CREATE TABLE - Statements ist kein Semikolon, tu da mal eins hin.


mkinzler - Mo 13.02.06 11:36

Ein SQL-Query wird immer durch ein Semikolon abgeschlossen. Bei einfachen Queries funktioniert es aber auch ohne.


axlegolas - Mo 13.02.06 11:39

Die CREATE Anweisung funktioniert, da habe ich das mit dem ; schon probiert. Das Problem ist die INSERT Anweisung da crashst...


mkinzler - Mo 13.02.06 11:42

Wie sieht der Code für den mehrfachen INSERT aus?


axlegolas - Mo 13.02.06 11:43

s.o.


mkinzler - Mo 13.02.06 11:46

Du benötigst für einen INSERT immer den ganzen Query. Es reicht nicht nur die VALUES zu wiederholen. Nochmal den Vorschlag diesen Teil zu parametrisieren.


axlegolas - Mo 13.02.06 11:50

Kannst du mir dann kurz erläutern, wie du das meinst mit dem parametisieren?


mkinzler - Mo 13.02.06 11:59

Der Eigenschaft TableSet.SQL.Text folgenden Wert zuweisen:

SQL-Anweisung
1:
INSERT INTO Version (Tabellenname,Versionsnummer) VALUES( :Tabname, :VerNr);                    

Dann mußt du im Sourcecode nur noch die Paramter mit TableSet.Parameters.ParamByName('Tabname').Value := <Wert>;
bzw. .asInteger und TableSet.Parameters.ParamByName('VerNr').Value := <Wert>;setzten.


axlegolas - Mo 13.02.06 12:03

Damit ist das Problem noch immer nicht gelöst, da ich in diesem Fall auch nur eine INSERT Anweisung habe, ich aber doch mehrere Datensätze einfügen muß.!!!!!!!!!


mkinzler - Mo 13.02.06 13:22

Wenn du mehere in einem Durchgang einfügen willst mußt du wie schon gesagt für jeden datensatz das gesammte Statement einfügen, oder eben jeweild die Parameter anpassen und mit ExecSql abschließen.