Stefan: Sytaxfehler???

Hallo,
ich bekomme bei fogendem Script immer die Fhelermeldung:
Microsoft OLE DB Provider for ODBC Drivers-Fehler '80040e14'

[Microsoft][ODBC Microsoft Access Driver] Syntaxfehler in der INSERT INTO-Anweisung.

/eingabe.asp, Zeile 221

Das Script sieht so aus:

<%
T1=Request.Form("Name")
Vorname=Request.Form("Vorname")
Anschrift=Request.Form("Anschrift")
lngTelefon=Request.Form("Telefon")
Mail=Request.Form("Mail")
Taetigkeit=Request.Form("Taetigkeit")
Anbieter=Request.Form("Anbieter")
Region=Request.Form("Region")
lngEingang=Request.Form("Eingang")
lngab=Request.Form("ab dem")
Firmenprofil=Request.Form("Firmenprofil")
Jobprofil=Request.Form("Jobprofil")
Anforderungsprofil=Request.Form("Anforderungsprofil")
if not Request.Form.Count=0 then
ok = true
if ok then
Set Conn = Server.CreateObject("ADODB.Connection")
strcon = "driver={Microsoft Access-Treiber (*.mdb)};" & _
          "dbq=" & Server.MapPath("db1.mdb")
Conn.Open strcon,"",""
' ADO Recordset-Objekt erzeugen und öffnen.
Set rs = Server.CreateObject("ADODB.Recordset")
sql = "INSERT INTO angebote (Name, Vorname, Anschrift, Telefon, Mail, Taetigkeit, Anbieter,"
sql = sql & "Region, Eingang, ab dem, Firmenprofil, Jobprofil, Anforderungsprofil)"
sql = sql & "VALUES ('" & T1 & "', '" & Vorname & "', '"
 sql = sql & Anschrift & "', '" & lngTelefon & "', '" & Mail & "', '"
    sql = sql &  Taetigkeit & "', '" & Anbieter & "', '" & Region & "', '"
      sql = sql & lngEingang & "', '" & lngab & "', '" & Firmenprofil & "', '"
     sql = sql & Jobprofil & "', '" & Anforderungsprofil & "');"
Set rs = Conn.execute(sql)
Conn.close
Set Conn = Nothing
end if
end if
%>

Erkennt jemand den Fehler?
Grüße Stefan

  1. Hallo,
    du hast in Deiner Insert Anweisung alle Values mit ' ' versehen. Sind das denn alles wirklich Strings oder auch Zahlen,Daten oder ähnliches?? Dann wären die Zeichen nämlich falsch.

    Gruß
    JankoW

    1. Hallo,
      du hast in Deiner Insert Anweisung alle Values mit ' ' versehen. Sind das denn alles wirklich Strings oder auch Zahlen,Daten oder ähnliches?? Dann wären die Zeichen nämlich falsch.

      Gruß
      JankoW

      Hallo und danke Jankow,
      ich habe es versucht, die '' bei den Zahlenwerten zu entfernen, bekomme aber immer noch die gleiche Fehlermeldung.
      Was muss ich denn bei Zahlen berücksichtigen?
      Gruß
      Stefan

      1. Hi,
        also die Hochkommas bei den Zahlenwerten zu entfernen ist schon mal richtig. Hast Du ein Datum dabei?? Wenn ja, dann muß die Eingabe folgendermaßen aussehen:

        "#" & Monat & "/" & Tag & "/" & Jahr & "#" damit es richtig aufgenommen wird.

        Sollte das nicht funktionieren, dann lass Dir bitte mal die sql-Anweisung ausgeben, poste sie hier und gib zur Not noch die einzelnen Felder mit Feldertypen an. Dann schauen wir weiter.
        Aber vielleicht klappt das ja auch schon.

        Ciao
        JankoW

        1. huhu Jankow,
          also das hab ich versucht und ich hab mir auch die sql-Anweisung ausgeben lassen:
          INSERT INTO angebote (Name, Vorname, Anschrift, Telefon, Mail, Taetigkeit, Anbieter, Region, Eingang, ab dem, Firmenprofil, Jobprofil, Anforderungsprofil)VALUES ('z', 'z', 'z', 1, 'z', 'z', 'z', 'z', #//#", #//#", ' ', ' ', '');
          Microsoft OLE DB Provider for ODBC Drivers-Fehler '80040e14'

          [Microsoft][ODBC Microsoft Access Driver] Syntaxfehler in der INSERT INTO-Anweisung.

          /eingabe.asp, Zeile 223

          Nur Z eingegeben nd bei ab dem und Eingang Datumswerte. Immer noch
          Syntaxfehler. Vielleicht habe ich es ja falsch geschrieben.

          Set Conn = Server.CreateObject("ADODB.Connection")
          strcon = "driver={Microsoft Access-Treiber (*.mdb)};" & _
                    "dbq=" & Server.MapPath("db1.mdb")
          Conn.Open strcon,"",""
          ' ADO Recordset-Objekt erzeugen und öffnen.
          Set rs = Server.CreateObject("ADODB.Recordset")
          sql = "INSERT INTO angebote (Name, Vorname, Anschrift, Telefon, Mail, Taetigkeit, Anbieter, " & _
            "Region, Eingang, ab dem, Firmenprofil, Jobprofil, Anforderungsprofil)"
          sql = sql & "VALUES ('" & stef & "', '" & Vorname & "', " & _
           "'" & Anschrift & "', " & lngTelefon & ", '" & Mail & "', " & _
             "'" & Taetigkeit & "', '" & Anbieter & "', '" & Region & "', " & _
                 "#" & Monat & "/" & Tag & "/" & Jahr & "#"", " & _
                 "#" & Monat & "/" & Tag & "/" & Jahr & "#"", '" & Firmenprofil & "', " & _
               "'" & Jobprofil & "', '" & Anforderungsprofil & "');"
               Response.Write(sql)
          Set rs = Conn.execute(sql)
          Conn.close
          Set Conn = Nothing
          end if
          end if

          Gruß Stefan

          1. Hallo Stefan!

            Du hast die Anführungszeichen beim Datum doppelt:

            "#" & Monat & "/" & Tag & "/" & Jahr & "#"", " & _
                   "#" & Monat & "/" & Tag & "/" & Jahr & "#"", '" &

            ^^

            Eins muss weg.

            Bis dann
            Alex

            1. Hallo Stefan!

              Du hast die Anführungszeichen beim Datum doppelt:

              "#" & Monat & "/" & Tag & "/" & Jahr & "#"", " & _
                     "#" & Monat & "/" & Tag & "/" & Jahr & "#"", '" &
                                                                 ^^

              Eins muss weg.

              Bis dann
              Alex

              Hallo Alex,
              wenn ich eins weg nehme, bekomme ich die Fehlermeldung, dass ein Anweisungsende erwratet wurde.???????
              Stefan

              1. Hallo Stefan!

                Poste bitte nochmal den ausgegeben Sql String und den Code dazu.

                Bis dann
                Alex

                Hallo Alex,
                wenn ich eins weg nehme, bekomme ich die Fehlermeldung, dass ein Anweisungsende erwratet wurde.???????
                Stefan

                1. Hallo Stefan!

                  Poste bitte nochmal den ausgegeben Sql String und den Code dazu.

                  Bis dann
                  Alex

                  Hallo ALex,
                  also, ich habe über Response.Write den sql String aufgerufen und das Ergebniss bekommen:
                  INSERT INTO angebote (Name, Vorname, Anschrift, Telefon, Mail, Taetigkeit, Anbieter, Region, Eingang, ab dem, Firmenprofil,
                  Jobprofil, Anforderungsprofil)VALUES ('z', 'z', 'z', 1, 'z', 'z', 'z', 'z', #//#", #//#", ' ', ' ', '');
                  Microsoft OLE DB Provider for ODBC Drivers-Fehler '80040e14'

                  [Microsoft][ODBC Microsoft Access Driver] Syntaxfehler in der INSERT INTO-Anweisung.

                  /eingabe.asp, Zeile 223

                  Nur Z eingegeben und bei 'ab dem' und 'Eingang' Datumswerte.

                  Set Conn = Server.CreateObject("ADODB.Connection")
                  strcon = "driver={Microsoft Access-Treiber (*.mdb)};" & _
                            "dbq=" & Server.MapPath("db1.mdb")
                  Conn.Open strcon,"",""
                  ' ADO Recordset-Objekt erzeugen und öffnen.
                  Set rs = Server.CreateObject("ADODB.Recordset")
                  sql = "INSERT INTO angebote (Name, Vorname, Anschrift, Telefon, Mail, Taetigkeit, Anbieter, " & _
                    "Region, Eingang, ab dem, Firmenprofil, Jobprofil, Anforderungsprofil)"
                  sql = sql & "VALUES ('" & stef & "', '" & Vorname & "', " & _
                   "'" & Anschrift & "', " & lngTelefon & ", '" & Mail & "', " & _
                     "'" & Taetigkeit & "', '" & Anbieter & "', '" & Region & "', " & _
                         "#" & Monat & "/" & Tag & "/" & Jahr & "#"", " & _
                         "#" & Monat & "/" & Tag & "/" & Jahr & "#"", '" & Firmenprofil & "', " & _
                       "'" & Jobprofil & "', '" & Anforderungsprofil & "');"
                       Response.Write(sql)
                  Set rs = Conn.execute(sql)
                  Conn.close
                  Set Conn = Nothing
                  end if
                  end if

                  Gruß und Danke
                  Stefan

                  1. Hallo Stefan!

                    Das ist ja immernoch derselbe Quellcode, wie von vorhin.
                    Wie gesagt, die " beim Datum müssen raus.
                    Das Ergebnis von dieser Änderung hätte mich interessiert.
                    Trag am Besten mal vernüftige Daten ein. (Datum)
                    Hast du schon Markus Mühlich´s Methode ausprobiert?
                    (ist sehr viel übersichtlicher)
                    Dann kannst du besser die Fehler finden.

                    Also bis dann nochmal
                    Alex

                    1. Hallo,

                      Das ist ja immernoch derselbe Quellcode, wie von vorhin.
                      Wie gesagt, die " beim Datum müssen raus.
                      Das Ergebnis von dieser Änderung hätte mich interessiert.
                      Trag am Besten mal vernüftige Daten ein. (Datum)
                      Hast du schon Markus Mühlich´s Methode ausprobiert?
                      (ist sehr viel übersichtlicher)
                      Dann kannst du besser die Fehler finden.

                      schaut euch doch einfach mal die Antwort von mir an.
                      Name ist ein reserviertes Wort und der Fehler kommt
                      zu 99% deswegen.

                      Tschau, Stefan

                      1. DANKE, DANKE, DANKE,
                        so Problem behoben!!!
                        Ich danke Euch, das war mit eine grosse Hilfe.
                        Überhaupt hab ich noch nirgends ein Forum wie dieses entdeckt.
                        Ich bin begeistert.
                        Stefan

                      2. Hallo Stefan,

                        schaut euch doch einfach mal die Antwort von mir an.
                        Name ist ein reserviertes Wort und der Fehler kommt
                        zu 99% deswegen.

                        das hatte ich Deinem Namensvetter gestern auch schon mal gesagt, aber zumndest bei mir läuft das Konstrukt auch mit dem Feldnamen "Namen".

                        Wobei ich Dir aber absolut zustimme, das die Verwendung von reservierten Namen zu Vermeiden ist.

                        Gruß
                        Markus

                        1. Hi,
                          ich will jetzt wirklich nicht kleinlich wirken und sicher war es auch nur ein Schreibfehler aber natürlich müßte es mit "Namen" funktionieren nur eben nicht mit "Name" (ohne "n").

                          Nur rein zur Klärung.

                          Ciao
                          JankoW

                          1. Hallo,

                            ich will jetzt wirklich nicht kleinlich wirken

                            Nein ist schon i.O., denn Name <> Namen.

                            Ich habe jetzt das Konstrukt von Stefan nochmal mit seinem Originalquellcode und Anweisungen auf IIS4 und IIS5 durchlaufen lassen, und bei beiden wird die Datenbank mit dem Feldnamen "Name" gefüllt.

                            Und das war mein (versaubeutelter) Erklärungsversuch, daß zumindest in diesem Fall dieser Feldname IMO keinen Einfluß auf die Fehlermeldung haben kann.

                            Natürlich bin ich selber der Ansicht grundsätzlich reservierte Wörter nicht zu verwenden, allerdings ebenso

                            keine Feldnamen aus zwei Wörtern (notfalls gibt es den Unterstrich)
                            keine Großschreibung
                            nur Buchstaben und Ziffern, keine Sonderzeichen
                            nach Möglichkeit Feldnamen verwenden die den Datentyp spiegeln

                            Alleine durch diese Verwendung können viele Syntaxfehler in SQL Anweisungen und mit der Verarbeitung von Variablen verhindert werden.

                            Gruß
                            Markus

                            1. ich will jetzt wirklich nicht kleinlich wirken
                              Nein ist schon i.O., denn Name <> Namen.
                              Ich habe jetzt das Konstrukt von Stefan nochmal mit seinem Originalquellcode und Anweisungen auf IIS4 und IIS5 durchlaufen lassen, und bei beiden wird die Datenbank mit dem Feldnamen "Name" gefüllt.

                              Soweit ich weiss, darf man bei einer Access-Tabelle keine Feldnamen wie 'Name' oder 'Text' haben.
                              Bei einer ECHTEN SQL-Datenbank spielt das wiederum keine Rolle!

                              Bye Andreas

                              1. Hallo Andreas,

                                Soweit ich weiss, darf man bei einer Access-Tabelle keine Feldnamen wie 'Name' oder 'Text' haben.

                                Wenn dem so wäre, würde sich Access 97/2000 schon bei der Definition der Feldnamen mit einer Fehlermeldung beschweren. Dem ist aber nicht so.

                                Leg mal eine Tabelle mit diesen Feldnamen an, und definiere eine Auswahlabfrage - die sich aus der Tabelle bedient. Da wird es auch keine Probleme geben. Was auch vollkommen korrekt ist, da es hier zu keinem Konflikt zu reservierten Wörten kommen kann.

                                Problematisch wird es erst dann, wenn Du Dich der Access eigenen Funktionen bedienst, oder mit VBA selbst Funktionen schreibst. Dann kann es zu Konflikten kommen, muß aber nicht. Wann genau es zu Konflikten kommt, ist nicht mit Bestimmheit zu sagen.

                                Wenn Du dazu weitere Informationen benötigst, kann ich Dir Karl Donaubauers AccessFAQ (www.donkarl.com) empfehlen.

                                Auf dieser IMO besten deutschsprachigen AccessFAQ stehen nicht nur Hinweise zu Namenskonventionen, sondern auch weitere nützliche Tipps und Links.

                                Gruß
                                Markus

                                1. Hallo Markus,

                                  Soweit ich weiss, darf man bei einer Access-Tabelle keine Feldnamen wie 'Name' oder 'Text' haben.

                                  Wenn dem so wäre, würde sich Access 97/2000 schon bei der Definition der Feldnamen mit einer Fehlermeldung beschweren. Dem ist aber nicht so.

                                  Access beschwert sich zwar nicht, aber man sollte es trotzdem nicht machen.

                                  Leg mal eine Tabelle mit diesen Feldnamen an, und definiere eine Auswahlabfrage - die sich aus der Tabelle bedient. Da wird es auch keine Probleme geben. Was auch vollkommen korrekt ist, da es hier zu keinem Konflikt zu reservierten Wörten kommen kann.

                                  Da Accessintern.

                                  Problematisch wird es erst dann, wenn Du Dich der Access eigenen Funktionen bedienst, oder mit VBA selbst Funktionen schreibst. Dann kann es zu Konflikten kommen, muß aber nicht. Wann genau es zu Konflikten kommt, ist nicht mit Bestimmheit zu sagen.

                                  Eigentlich schon. Und zwar, wenn über ODBC bzw. die Jet-Engine eine
                                  Abfrage gestartet wird, die die bösen Wörter im Statement enthält.
                                  SELECT text FROM tabelle WHERE ... bringt einen Fehler
                                  SELECT [text] FROM tabelle WHERE ... funzt, da text in [...] steht.

                                  Ansonsten geht der Treiber hin und prüft das Statement, bzw
                                  übergibt es an die Anwendung. text wird dann erstmal als Schlüsselwort
                                  angesehen, das weder der Feldname weder in [...] eingegrenz ist noch
                                  ein  Tabellenname voransteht. (SELECT tabelle.text FROM tabelle WHERE ...)

                                  Wenn Du dazu weitere Informationen benötigst, kann ich Dir Karl Donaubauers AccessFAQ (www.donkarl.com) empfehlen.

                                  ACK.

                                  Tschau, Stefan

                                  1. Hallo Markus,

                                    Problematisch wird es erst dann, wenn Du Dich der Access eigenen Funktionen bedienst, oder mit VBA selbst Funktionen schreibst. Dann kann es zu Konflikten kommen, muß aber nicht. Wann genau es zu Konflikten kommt, ist nicht mit Bestimmheit zu sagen.

                                    Eigentlich schon. Und zwar, wenn über ODBC bzw. die Jet-Engine eine
                                    Abfrage gestartet wird, die die bösen Wörter im Statement enthält.
                                    SELECT text FROM tabelle WHERE ... bringt einen Fehler
                                    SELECT [text] FROM tabelle WHERE ... funzt, da text in [...] steht.

                                    der Teil war natrülcih Quatsch. Bei DML-Statements (INSERT, ...)
                                    gilt obiges Verfahren. Entweder tabelle.name oder [name] schreiben,
                                    dann gehts auch, ist aber trotzdem nicht zu empfehlen.

                                    Tschau, Stefan

                                  2. Hallo Stefan

                                    SELECT text FROM tabelle WHERE ... bringt einen Fehler
                                    SELECT [text] FROM tabelle WHERE ... funzt, da text in [...] steht.

                                    Folgende Testsituation auf Access97:

                                    text = "text"
                                    strsql(1) = "SELECT text FROM Tabelle1 WHERE (((text)= 'text'));"
                                    strsql(2) = "SELECT " & text
                                    strsql(2) = strsql(2) & " FROM Tabelle1 WHERE (((" & text & ") = 'text'));"

                                    For i = 1 To 2
                                        Set rs(i) = db.OpenRecordset(strsql(i), dbOpenDynaset)
                                            rs(i).AddNew
                                            rs(i)!text = text
                                            rs(i).Update
                                            rs(i).MoveFirst
                                            Do Until rs(i).EOF
                                                MsgBox rs(i)!text
                                                rs(i).MoveNext
                                            Loop
                                    Next

                                    Set db = Nothing
                                    For i = 1 To 2
                                        Set rs(i) = Nothing
                                    Next

                                    Diese Funktion definiert eine Auswahlabfrage die mit dem Schlüsselwort text arbeitet, sowie eine zweite Auswahlabfrage die über die Variable text den String "text" erhält.

                                    Beim Aufruf dieser Funktion treten keine der o.g. Konflikte auf, obwohl eine reserviertes Wort mehrfach verwendet wurde, egal ob als String oder Variable.

                                    Ich werde das heute Abend mal auf den IIS4 und IIS5 setzen, wahlweise mit ODBC und DSN-loser Verbindung. Ich gehe mal davon aus, daß es auch dort zu keinen Konflikten kommt.

                                    Nicht das wir uns falsch verstehen, ich bin absolut davon überzeugt (schon alleine der Lesbarkeit wegen), daß das Einhalten einer Namenskonventionen der einzige sichere Weg ist um 100%ig Konflikte zu vermeiden.

                                    Ich wollte lediglich mal zeigen, daß das Auftreten von Namenskonflikten nicht oder nur schwer replizierbar ist.

                                    Gruß
                                    Markus

                  2. Hallo,

                    INSERT INTO angebote (..,..,..,[ab dem],...,...)

                    Gruß
                    Markus

  2. Hallo Stefan!

    Auf Anhieb sehe ich keinen Fehler. Bei dem Semikolon am Ende des Sql Strings bin ich mir nicht ganz sicher - lass es mal weg.
    Falls es dann immer noch nicht funktionieren sollte, lass dir den SQL String über Response.Write mal ausgeben.
    Vielleicht musst du noch was in den Formularfeldern abfangen (Hochkomma?) '

    Bis dann
    Alex

    1. Hallo Stefan!

      Auf Anhieb sehe ich keinen Fehler. Bei dem Semikolon am Ende des Sql Strings bin ich mir nicht ganz sicher - lass es mal weg.
      Falls es dann immer noch nicht funktionieren sollte, lass dir den SQL String über Response.Write mal ausgeben.
      Vielleicht musst du noch was in den Formularfeldern abfangen (Hochkomma?) '

      Bis dann
      Alex

      Hallo Alex,
      was meinst Du mit abfangen?

  3. Hallo Stefan,

    ich bekomme bei fogendem Script immer die Fhelermeldung:
    Microsoft OLE DB Provider for ODBC Drivers-Fehler '80040e14'

    [Microsoft][ODBC Microsoft Access Driver] Syntaxfehler in der INSERT INTO-Anweisung.

    evtl. hilft: http://www.aspfaq.de/faq/index.asp?FID=85&ELE=7403

    [...]

    sql = "INSERT INTO angebote (Name, Vorname, Anschrift, Telefon, Mail, Taetigkeit, Anbieter,"

    In deinem Fall dürfte das Problem am Spaltennamen "Name" liegen.
    Siehe Artikel.

    HTH, Stefan

  4. Hallo,

    sql = "INSERT INTO angebote (Name, Vorname, Anschrift, Telefon, Mail, Taetigkeit, Anbieter,"
    sql = sql & "Region, Eingang, ab dem, Firmenprofil, Jobprofil, Anforderungsprofil)"
    sql = sql & "VALUES ('" & T1 & "', '" & Vorname & "', '"
    sql = sql & Anschrift & "', '" & lngTelefon & "', '" & Mail & "', '"
        sql = sql &  Taetigkeit & "', '" & Anbieter & "', '" & Region & "', '"
          sql = sql & lngEingang & "', '" & lngab & "', '" & Firmenprofil & "', '"
         sql = sql & Jobprofil & "', '" & Anforderungsprofil & "');"

    huihui, da hast Du aber eine SQL Anweisung.

    1. Wenn Du alle Felder der Tabelle füllen möchtest reicht die Anweisung: sql = "INSERT INTO angebote "
    Nur wenn Du bestimmte Felder der Tabelle füllen möchtest, müssen diese expilizit in Klammern aufgeführt werden.

    2. Es gibt besimmte Regeln zum definieren der Tabellenfelder. Eine hhabe ich dir schon bei Deinem ersten Problem geannt, die zweite Regel heißt: Benenne Feldnamen niemals mit zwei getrennten Worten, denn das kann enorme Probleme bereiten, da dann diese Feldnamen in eckigen Klammern [ab dem] angesprochen werden müssen.

    sql = sql = "INSERT INTO angebote (Name, Vorname, Anschrift, Telefon, Mail, Taetigkeit, Anbieter,Region, Eingang, [ab dem], Firmenprofil, Jobprofil, Anforderungsprofil) VALUES ("

    3. Jetzt noch die einzelnen Values dazu, und der Aufbau der SQL Anweisung ist korrekt:

    sql = sql = "INSERT INTO angebote (Name, Vorname, Anschrift, Telefon, Mail, Taetigkeit, Anbieter,Region, Eingang, [ab dem], Firmenprofil, Jobprofil, Anforderungsprofil) VALUES ("
    sql = sql & "'" & t1 & "',"
    sql = sql & "'" & Vorname & "',"
    sql = sql & "'" & anschrift & "',"
    sql = sql & "'" & lngtelefon & "',"
    sql = sql & "'" & mail & "',"
    sql = sql & "'" & taetigkeit & "',"
    sql = sql & "'" & anbieter & "',"
    sql = sql & "'" & Region & "',"
    sql = sql & "'" & lngEingang & "',"
    sql = sql & "'" & lngab & "',"
    sql = sql & "'" & firmenprofil & "',"
    sql = sql & "'" & jobprofil & "',"
    sql = sql & "'" & Anforderungsprofil & "');"

    Wenn jetzt noch Fehler kommen, kann dies eigentlich nur mit Typumwandlungsproblemen zu tun haben. Aber die bekommst Du wieder mit einer anderen Fehlermeldung angezeigt.

    Du kannst Dich ja dann nochmal melden.

    Gruß
    Markus