2009-07-13 13 views
1

Mögliche Duplizieren:
Query Syntax errorInsert-Anweisung mit where-Klausel

I Einfügewert mit wollen den folgenden Befehl

DoCmd.RunSQL = "insert into tblContract(
Empid, 
Start1, 
Finish1, 
Store1, 
Start2, 
Finish2, 
Store2) 
values ('" & Me.txtEmpNo.Value & "','" 
    & Me.txtContSunStart1.Value & "', '" 
    & Me.txtContSunFinish1.Value & "','" 
    & Me.txtContSunStore1.Value & "','" 
    & Me.txtContSunStart2.Value & "', '" 
    & Me.txtContSunFinish2.Value & "','" 
    & Me.txtContSunStore2.Value & "')" 

Aber beim Einsetzen soll es in der Zeile einzufügen, wo Wert einer Spalte (Testid) in derselben Tabelle ist max (Testid) einer anderen Tabelle.

Diese Abfrage nicht funktioniert:

SQL = " INSERT INTO tblContract (EmpID, Testid, Start1, Ende1, STORE1, Start2, Finish2, Store2) SELECT" & Me.txtEmpNo.Value & „‘, MAX (TestID) ' "& Me.txtContSunStart1.Value &"', ' "& Me.txtContSunFinish1.Value &"', ' "& Me.txtContSunStore1.Value &"', '“& Me.txtContSunStart2. Wert & " '' "& Me.txtContSunFinish2.Value &" ''“& Me.txtContSunStore2.Value & " '" & "FROM tbltesting'"

ich für diese eine Alternative zu finden bin. In ms Zugriff gibt es einen Kompilierungsfehler

+0

Sie müssen etwas klarstellen, was Sie meinen ... Sie können nichts in eine existierende Zeile einfügen, das wäre ein Update. – Guffa

+2

Genaues Duplikat von http://StackOverflow.com/Questions/1119246/Query-Syntax-Fehler – gbn

+0

Sie könnten auch gespeicherte Prozeduren oder parametrisierte Abfragen betrachten, dies wäre sehr unsicher, vor allem, wenn öffentlich, es ist sehr offen für SQL Injektionsangriffe. –

Antwort

3

Sie können eine INSERT SELECT statt einer INSERT-Werte verwenden. sowie.

Auf einem anderen Hinweis, sollten Sie nicht bauen Sie Ihre SQL wie Sie sind. Dies ist anfällig für SQL-Injection. Jemand könnte ganz einfach "; DROP TABLE tblContract" in eines Ihrer Textfelder eingeben!

+0

Er, Access wird nicht mehrere Anweisungen mit dem DoCmd.RunSQL-Befehl ausführen - es wird Ihnen eine "ungültige Zeichen nach Ende der SQL-Anweisung" Fehlermeldung geben. –

+0

BTW, das bedeutet nicht, dass Sie Benutzereingaben nicht validieren sollten, nur dass das genannte Beispiel der SQL-Injection möglicherweise nicht innerhalb von Access (oder irgendeiner Form von Jet/ACE, von denen keine Batch-SQL-Anweisungen unterstützt) passieren kann. –

1

Zuerst müssen Sie den Wert aus der anderen Tabelle abrufen und dann zum Einfügen in diese Tabelle verwenden, Sie können dafür auch einen Trigger verwenden. Beachten Sie, dass Sie denselben Wert zweimal haben können, wenn 2 Benutzer dieselbe Abfrage zur gleichen Zeit ausführen ... Sie müssen die andere Tabelle in diesem Fall sperren ... max() ist problematisch

warum nicht Identität verwenden und dann die scope_identity() Funktion zu ergreifen, nachdem Sie in die andere Tabelle einfügen?

Sie verstehen auch, dass Sie, was zu tun ist ein SQL-Injection-Angriff

+2

SQL-Injektion in einer VBA-Anwendung kann nicht so wichtig sein. –

+0

Ja, aber wie lange wird es eine VBA-Anwendung sein? Diese Dinge bekommen oft ein eigenes Leben und werden portiert – n8wrl

+0

mgroves, einige Leute nutzen Access als Web-Interface. Denken Sie nicht auch, dass Sie Ihre Daten vor verärgerten Mitarbeitern und vor Außenstehenden schützen sollten? SQl Injection muss nicht von außerhalb des Unternehmens kommen. Darüber hinaus wird das Lernen über solche Dinge wie "Ist das offen für Angriffe" der Karriere dieser Person helfen, wenn er sich von Access entfernt. – HLGEM

0

passieren wartet Wenn ich Ihre Frage richtig gelesen Sie

INSERT INTO tblContract(col1..., testId) values 
    ('value1',..., (SELECT MAX(testID) FROM tblOther)); 

gewarnt wollen, dies zu Parallelitätsproblemen führen kann

+0

So dachte ich, dass es getan werden musste. – Powerlord

+3

Und dann einige! Dies ist keine gute Übung und sollte jetzt ausgestanzt werden! Sie kennen entweder den Fremdschlüsselwert im Voraus und fügen den Wert ein oder fügen beide Tabellen in dieselbe Transaktion ein. – Randolpho