Martin: Access spinnt?!

Hallo SELFHTML-Gemeinde,
könnt ihr mir bei einem etwas merkwürdigem Problem mit ASP's und Access helfen?

also folgender programmablauf spielen sich ab:

1. Werte in Datenbank (Access) schreiben, dabei eine Autonummer vergeben und diese sofort wieder auslesen.
2. irdendwelche Berechnungen...
3. an der Stelle der Autonummer wieder in dei DB schreiben.

alles klar?

Nun ist das nix aufregendes, aber Access macht daraus eine Sache die aufregt!
Denn es kommt erstens in unregelmäßigen Abständen vor, daß Access die entsprechende Stelle in der Tabelle nicht findet, obwohl diese eindeutig  existiert und zweitens, wenn ich einen Datensatz lösche, daß in eine "beliebige" Stelle geschrieben wird, aber nicht an die mit der zuletzt vergebenen Autonummer.
Ab und zu funktionier es auch.

Hat jemand von diesem inkonsequenten Handling, was Access da betreibt schon mal etwas gehört und kann mir verraten, wie ich es dazu motivieren kann, an die richtige stelle zu schreiben.

Hier noch der Skriptcoode

Vielen Dank und Gruß, Martin.

Set ConnObj = Server.CreateObject ("ADODB.Connection")
     Set rsUpdate = Server.CreateObject ("ADODB.Recordset")
      ConnObj.Open odbcsource
      rsUpdate.Open "Tabelle", ConnObj, adOpenKeySet, adCmdTable
   rsUpdate.AddNew
   WriteData
   rsUpdate.Update
   rsUpdate.MoveLast
   Autonummer = rsUpdate("Autonummer") 'hier wird autonummer vergeben

Set rsOrderMail=Server.CreateObject("ADODB.Recordset")
rsOrderMail.ActiveConnection ="DSN=" & ODBCSource
rsOrderMail.LockType= adLockOptimistic
SQLSTR = "SELECT BestellID, OrderMail FROM Tabelle WHERE Autonummer =" & Autonummer ' an der stelle soll wieder reingeschreiben werden

rsOrderMail.Open (SQLSTR)       
rsOrderMail("OrderMail") = txtOrderMail  
rsOrderMail.Update      
rsOrderMail.Close  
Set rsOrderMail = Nothing  
  1. Hallo Martin,

    erstmal noch ein paar Fragen zu deinem Posting.

    1. Werte in Datenbank (Access) schreiben, dabei eine Autonummer vergeben und diese sofort wieder auslesen.

    Wird die ID fortlaufend vergeben (1, 2, 3, ...) oder per Zufall ermittelt ?

    Denn es kommt erstens in unregelmäßigen Abständen vor, daß Access die entsprechende Stelle in der Tabelle nicht findet, obwohl diese eindeutig  existiert und zweitens, wenn ich einen Datensatz lösche, daß in eine "beliebige" Stelle geschrieben wird, aber nicht an die mit der zuletzt vergebenen Autonummer.
    Ab und zu funktionier es auch.

    MDAC hat in Version 2.1 und 2.5 Probleme bei einem Delete im Zusammenhang mit JET-Datenbanken (Access)
    http://support.microsoft.com/support/kb/articles/Q230/1/31.ASP?LN=EN-US&SD=gn&FR=1

    »»  Set ConnObj = Server.CreateObject ("ADODB.Connection")

    Set rsUpdate = Server.CreateObject ("ADODB.Recordset")
          ConnObj.Open odbcsource
          rsUpdate.Open "Tabelle", ConnObj, adOpenKeySet, adCmdTable
       rsUpdate.AddNew
       WriteData
       rsUpdate.Update
       rsUpdate.MoveLast
       Autonummer = rsUpdate("Autonummer") 'hier wird autonummer vergeben

    Probier mal das hier: (nur bei fortlaufender ID)

    Set ConnObj = Server.CreateObject ("ADODB.Connection")
        Set rsUpdate = Server.CreateObject ("ADODB.Recordset")
           ConnObj.Open odbcsource
           Call GetMaxID()
        Set rsUpdate = Nothing
    Set ConnObj = Nothing

    Private Sub GetMaxID()

    ' Sollte wegen Application.Lock auf jeden Fall gesetzt werden,
    ' da ansonsten die Anwendung bei einem Fehler evtl. immer noch
    ' gesperrt ist
    On Error Resume Next
        Application.Lock
        rsUpdate.Open "Tabelle", ConnObj, adOpenKeySet, adCmdTable
            rsUpdate.AddNew
            WriteData
            rsUpdate.Update
        rsUpdate.Close
        rsUpdate.open "SELECT max(Autonummer) As maxID FROM Tabelle", ConnObj, 3, 3
            Autonummer = rsUpdate("maxID")
        rsUpdate.Close
        Application.Unlock

    End Sub

    Wenn Du eine nicht fortlaufende ID hast, solltest Du dieser aber selbst ermitteln,
    und Access die Arbeit ersparen. (Rnd bzw. Random in der IIS-Hilfe)
    Dann hast Du die volle Kontrolle über deine ID's und kannst Sie besser verwenden.

    Tschau, Stefan

    1. Hallo Stefan,
      danke soweit. Ich habe eine fortlaufende ID eingestellt und werde es mal so ausprobieren.
      Gruß Martin:)

  2. Hallo,

    versuch mal das:

    http://support.microsoft.com/support/kb/articles/q221/9/31.asp

    HOWTO: Return Record's Autonumber Value Inserted
      into Access DB

    Viele Gruesse aus dem Altmuehltal

    Michael Schneider

    info@asp-components.de
    www.asp-components.de

    Hallo SELFHTML-Gemeinde,
    könnt ihr mir bei einem etwas merkwürdigem Problem mit ASP's und Access helfen?

    also folgender programmablauf spielen sich ab:

    1. Werte in Datenbank (Access) schreiben, dabei eine Autonummer vergeben und diese sofort wieder auslesen.
    2. irdendwelche Berechnungen...
    3. an der Stelle der Autonummer wieder in dei DB schreiben.

    alles klar?

    Nun ist das nix aufregendes, aber Access macht daraus eine Sache die aufregt!
    Denn es kommt erstens in unregelmäßigen Abständen vor, daß Access die entsprechende Stelle in der Tabelle nicht findet, obwohl diese eindeutig  existiert und zweitens, wenn ich einen Datensatz lösche, daß in eine "beliebige" Stelle geschrieben wird, aber nicht an die mit der zuletzt vergebenen Autonummer.
    Ab und zu funktionier es auch.

    Hat jemand von diesem inkonsequenten Handling, was Access da betreibt schon mal etwas gehört und kann mir verraten, wie ich es dazu motivieren kann, an die richtige stelle zu schreiben.

    Hier noch der Skriptcoode

    Vielen Dank und Gruß, Martin.

    »»  Set ConnObj = Server.CreateObject ("ADODB.Connection")

    Set rsUpdate = Server.CreateObject ("ADODB.Recordset")
          ConnObj.Open odbcsource
          rsUpdate.Open "Tabelle", ConnObj, adOpenKeySet, adCmdTable
       rsUpdate.AddNew
       WriteData
       rsUpdate.Update
       rsUpdate.MoveLast
       Autonummer = rsUpdate("Autonummer") 'hier wird autonummer vergeben

    Set rsOrderMail=Server.CreateObject("ADODB.Recordset")

    »»  rsOrderMail.ActiveConnection ="DSN=" & ODBCSource
    »»  rsOrderMail.LockType= adLockOptimistic
    »»  SQLSTR = "SELECT BestellID, OrderMail FROM Tabelle WHERE Autonummer =" & Autonummer ' an der stelle soll wieder reingeschreiben werden
    »»  
    »»  rsOrderMail.Open (SQLSTR)    
    »»  rsOrderMail("OrderMail") = txtOrderMail
    »»  rsOrderMail.Update    
    »»  rsOrderMail.Close
    »»  Set rsOrderMail = Nothing