Bine: ASP / VbScript / Access: Fehlermeldung 0x80040E2F

Hi, ich habe folgendes Problem.
Ich muss in eine Datenbank über ASP Werte eingeben können. Nun hab ich aber das Problem, dass die ID (Primärschlüssel) bei der Tabelle ein Autowert ist.
Demnach kann ich die ID nicht über ein HTML-Formular wie die anderen Werte eingeben. Nach einigem hin und her kam nun folgende Fehlermeldung:

Microsoft OLE DB Provider for ODBC Drivers (0x80040E2F)
[Microsoft][ODBC Microsoft Access Driver] Null-Wert in Index oder Primärschlüssel nicht möglich.
/test-bine/Auftrag31.asp, line 29

line 29:
objRs.Update

Ich habe leider absolut keine Idee wie ich hier weiter komme.
Habe auch schon im Archiv und auf anderen Pages gesucht, aber nichts gefunden. Wär nett, wenn mir jemand helfen kann.

Hier nochmal der komplette Code:

<html>
<head>
<title>neuen Auftrag anlegen</title>
</head>
<body>

<%
Const adOpenKeyset = 1
Const adLockOptimistic = 3

mKunID         = Request.Form("mKunID")
mAuftragsdatum = Request.Form("Auftragsdatum")
mLieferdatum   = Request.Form("Lieferdatum")
mUstSatz       = Request.Form("UstSatz")

EnableSessionState = false
SET objConn = Server.CreateObject("ADODB.Connection")
SET objRs   = Server.CreateObject("ADODB.Recordset")

objConn.open "FILEDSN=Interaktiv.dsn"

If Error=0 Then
 objRs.open "TabAuftraege", objConn, adOpenKeyset, adLockOptimistic
 objRs.AddNew
  objRs.Fields("KunID")=Request.Form("mKunID")
  objRs.Fields("AufAuftragsdatum")=Request.Form("Auftragsdatum")
  objRs.Fields("AufLieferdatum")=Request.Form("Lieferdatum")
  objRs.Fields("AufUstSatz")=Request.Form("UstSatz")
 objRs.Update
 Response.Write("Folgender Datensatz wurde gespeichert: <br>")
 objRs.MoveLast
 Response.Write("<table><tr><td> Auftrags-ID</td>" & objRs.Fields("AufID").Value & "</td> </tr>")
 Response.Write("<tr><td> Kunden-ID</td>" & objRs.Fields("AufKunID").Value & "</td> </tr>")
 Response.Write("<tr><td> Auftragsdatum</td>" & objRs.Fields("AufAuftragsdatum").Value & "</td> </tr>")
 Response.Write("<tr><td> Lieferdatum</td>" & objRs.Fields("AufLieferdatum").Value & "</td> </tr>")
 Response.Write("<tr><td> Umsatzsteuer</td>" & objRs.Fields("AufUstSatz").Value & "</td> </tr></table>")
ELSE
 Response.Write "Fehler beim öffnen der Datenbank"
END IF
%>
</body>
</html>

  1. Hi Bine,

    Microsoft OLE DB Provider for ODBC Drivers (0x80040E2F)
    [Microsoft][ODBC Microsoft Access Driver] Null-Wert in Index oder Primärschlüssel nicht möglich.
    /test-bine/Auftrag31.asp, line 29

    irgendein Feld darf wohl keinen Null-Wert bekommen. Jetzt gilt es rauszukriegen, welches Feld da keinen Wert kriegt.

    If Error=0 Then
     objRs.open "TabAuftraege", objConn, adOpenKeyset, adLockOptimistic
     objRs.AddNew
      objRs.Fields("KunID")=Request.Form("mKunID")
      objRs.Fields("AufAuftragsdatum")=Request.Form("Auftragsdatum")
      objRs.Fields("AufLieferdatum")=Request.Form("Lieferdatum")
      objRs.Fields("AufUstSatz")=Request.Form("UstSatz")
     objRs.Update

    Okay, hier werden die Felder KunID, AufAuftragsdatum, AufLieferdatum und AufUstSatz gesetzt. Gibt Request.Form da auch wirklich Werte zurück, oder ist eins davon Nothing? Das solltest du überprüfen.

    Response.Write("<table><tr><td> Auftrags-ID</td>" & objRs.Fields("AufID").Value & "</td> </tr>")
     Response.Write("<tr><td> Kunden-ID</td>" & objRs.Fields("AufKunID").Value & "</td> </tr>")
     Response.Write("<tr><td> Auftragsdatum</td>" & objRs.Fields("AufAuftragsdatum").Value & "</td> </tr>")
     Response.Write("<tr><td> Lieferdatum</td>" & objRs.Fields("AufLieferdatum").Value & "</td> </tr>")
     Response.Write("<tr><td> Umsatzsteuer</td>" & objRs.Fields("AufUstSatz").Value & "</td> </tr></table>")

    Hier werden die Werte wieder ausgegeben. Inklusive einem Feld AufID. Das scheint ja in der gleichen Tabelle zu stehen. Ist das vielleicht auf not nullable gesetzt? Denn beim Update wird das ja nicht belegt.

    Ansonsten poste mal die Definition der Tabelle.

    Gruß,
    Martin

    1. HI Martin,

      irgendein Feld darf wohl keinen Null-Wert bekommen. Jetzt gilt es rauszukriegen, welches Feld da keinen Wert kriegt.

      Die Tabelle heißt "TabAuftrag". In ihr sind die Attribute drin, die ihc auch übers Formular hole und zusätzlich das Feld "AufID". Diese Auftrags-ID ist der Primärschlüssel für die Tabelle, klar dass der nicht null sein darf.

      Okay, hier werden die Felder KunID, AufAuftragsdatum, AufLieferdatum und AufUstSatz gesetzt. Gibt Request.Form da auch wirklich Werte zurück, oder ist eins davon Nothing? Das solltest du überprüfen.

      Ja, alle Werte werden richtig und vollständig aus dem Formular übertragen.

      Hier werden die Werte wieder ausgegeben. Inklusive einem Feld AufID. Das scheint ja in der gleichen Tabelle zu stehen. Ist das vielleicht auf not nullable gesetzt? Denn beim Update wird das ja nicht belegt.

      Ich dachte mir bei der Sache eigentlich, dass, wenn ich für das Feld AufID keinen Wert ins Formular mache, dass das Feld dann im Datensatz innerhalb der Datenbank automatisch belegt wird (ist ja auch schließlich mit AutoWert definiert). Aber daraufhin kommt eben diese Fehlermeldung.

      Mein Problem besteht letztendlich darin, dass ich nicht weiß, wie ich es hinbekomme, dass das Feld AufID automatisch belegt wird.
      Hätte mich vielleicht etwas genauer ausdrücken sollen.

      Gruß, Bine

      1. Hallo,

        in der Erklärung bzw. besser der Problembeschreibung ist irgendetwas faul.

        WENN die Tabelle nur EIN Primärschlüsselfeld hat, welches AufID heißt und numerisch ist und zudem noch mit AutoWert gefüllt wird, dann konvergiert die Wahrscheinlichkeit, dass dieser Fehler rein durch die Datenbank MS Access[tm] ausgelöst wird, gegen NULL (0).

        Ich habe diese Funktionalität in den letzten 6 Jahren bestimmt 10.000e Male verwendet, dabei ist nie ein Phänomen deiner Beschreibung entsprechend aufgetreten.

        Untersuche bitte deine Tabellendefinition GENAUER. Vielleicht gehören aus Versehen mehrere Felder zum Primärschlüssel. Bei Bedarf, poste die Tabellendefinition.

        Ja, alle Werte werden richtig und vollständig aus dem Formular übertragen.

        Woran siehst du das?

        Gruß, Frank

        1. Es tut mir leid, ein riesengroßes Missverständnis. Mein Chef hat an der DB rumgepfuscht und mir nicht gesagt, dass er alle Autowerte rausgenommen hat. Tut mir wirklich leid.
          Trotzdem vielen vielen Dank für die Hilfe.

          Aber bevor ich wieder am selben Problem hängen bleib:

          Wie frage ich den maximalen Attribut-Wert des Feldes AufID ab, erhöhe ihn um 1 und schreibe ihn in die nächste Datensatzzeile?

          1. Es tut mir leid, ein riesengroßes Missverständnis. Mein Chef hat an der DB rumgepfuscht und mir nicht gesagt, dass er alle Autowerte rausgenommen hat.

            You're sure? Das macht nicht gerade viel Sinn. Im Wilden Westen[tm] würde man ihn für soetwas erschießen. ;-)

            Irgendwie traue ich auch dieser Wendung in deiner Problembeschreibung nicht.

            Wie frage ich den maximalen Attribut-Wert des Feldes AufID ab, erhöhe ihn um 1 und schreibe ihn in die nächste Datensatzzeile?

            • Sperre die Applikation
            • Formuliere ein SELECT nach dem MAXimalen Wert der Spalte AufID, führe es aus und addiere zu dem erhaltenen Wert 1 dazu
            • Führe den Insert mit den aktuellen Werten durch
            • Gib die Applikation wieder frei

            Gruß, Frank