none
OpenRecordset mit IDENTITY-Spalte liefert 3622: dbSeeChanges ist erforderlich RRS feed

  • Frage

  • Hallo SQL-Spezialisten,

    nachdem es mir glücklich gelungen ist, mein Access-Backend in eine SQL-Server-Datenbank (an dieser Stelle nochmals herzlichen Dank an Olaf Helper) zu verlagern und mein ACCESS-Frontend mit den Tabellen der SQL-Server-Datenbank per ODBC zu verlinken, taucht ein neues Problem auf.

    Unten gezeigt VBA-Funktion lieferte immer ein Ergebnis, wenn die angesprochenen Tabellen im Access-Backend  lagen.
    Seit ich die Tabellen des SQL-Servers anspreche wird der dritte Beispielselect (c) abgewiesen mit

    "3622: Wenn Sie auf eine SQL-Server-Tabelle zugreifen, die eine IDENTITY-Spalte enthält, müssen Sie für die OpenRecordset-Methode die dbSeeChanges-Option verwenden"


    Da ich diese Option aber in den Aufruf eingebaut habe:
    Set rs = CurrentDb.OpenRecordset(CurrSelect, , dbReadOnly + dbSeeChanges)
    verstehe ich nicht, weshalb die Fehlermeldung immer noch kommt.


    Hinweis:
    Directory_ID ist im SQL-Server mit Identität = true angelegt



    Bin gespannt, wo der Haken ist!!


    Bereits jetzt herzlichen Dank für Eure Mühe, über diese Frage zu nachzudenken.

    Klaus-Jürgen Gruber 



    Public Function GetValue(TableName As String, WhereString As String, TableField As String) As Variant

    'Liest aus der Tabelle TableName vom ersten gefundenen Record das Feld TableField mit der Einschränkung des WhereString
    Dim rs As DAO.Recordset
    Dim CurrSelect As String
    Dim Ergebnis As Variant


    On Error GoTo Err_GetValue_OnError
    Ergebnis = Null
    CurrSelect = "Select " & TableField & "  From " & TableName & " WHERE " & WhereString
    'z.B. _
    a)      Select DirectoryName From Directory WHERE Directory_ID = 1 _
    b)      Select Directory_Parent_ID From Directory WHERE Directory_ID = 1 _
    c)      Select Directory_ID  From Directory WHERE AblageOrt_für = 'Projektdaten'

    Debug.Print "CurrSELECT = " & CurrSelect
    'Set rs = CurrentDb.OpenRecordset(CurrSelect, , dbReadOnly)   '(bisheriger Aufruf mit dem Access-Backend)
    Set rs = CurrentDb.OpenRecordset(CurrSelect, , dbReadOnly + dbSeeChanges)
    If Not rs.EOF Then
        Ergebnis = rs.Fields(0)
    End If


    Exit_GetValue_OnError:
        Set rs = Nothing
        GetValue = Ergebnis
        Exit Function
    Err_GetValue_OnError:

        MsgBox Err.Number & " " & Err.Description, , "Funktion GetValue"
        Ergebnis = Null
        Sanduhr_rücksetzen
        Resume Exit_GetValue_OnError

    End Function

        
    Dienstag, 26. November 2019 14:06

Antworten

Alle Antworten

  • Hi,

    hast Du exakt das SQL Statement, dass hier abgesetzt werden soll, mal direkt gegen den SQL Server abgesetzt?

    Kommentier On Error Goto Irgendwas mal aus und schau, ob der Fehler wirklich exakt von dieser Stelle kommt.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Dienstag, 26. November 2019 14:19
    Moderator
  • Hi Stefan,

    hab gerade im SQL-Server "SELECT   Directory_ID  From Directory WHERE AblageOrt_für = 'Projektdaten' " ausprobiert: funktioniert

    Den "On Error Goto ..." auskommentieren hat nur zur folge, daß ich statt meiner eigenen eine Messagebox vom System bekomme.

     

    
    Dienstag, 26. November 2019 14:56
  • Hab das ganze durch einen:
     DLookup(TableField, TableName, WhereString)

    ersetzt. Der kanns !!!!!

    Sollte ich also keine Lösung für mein bisheriges Coding finden werd' ich wohl DLookup einsetzen.

    Interessieren würd's mich aber schon !! Zumal ich der Meinung war, daß ein DLookup länger dauert als meine Methode.

    Danke 
    Klaus-Jürgen

    Dienstag, 26. November 2019 15:10
  • Set rs = CurrentDb.OpenRecordset(CurrSelect, , dbReadOnly + dbSeeChanges)

    Laut https://docs.microsoft.com/de-de/office/client-developer/access/desktop-database-reference/recordsetoptionenum-enumeration-dao wird dbSeeChanges nur unterstütz, wenn der RecordSet vom Typ Dynaset ist, versuche es also mal mit

    Set rs = CurrentDb.OpenRecordset(CurrSelect, dbOpenDynaset, dbReadOnly + dbSeeChanges)


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Dienstag, 26. November 2019 15:51
  • Hallo Olaf,

    Du bist erneut der "Kenner des Systems".
    Genau dieses dbOpenDynaset hat an dieser und noch an vielen weiteren Stellen gefehlt (die ich jetzt natürlich alle durchflöhen muss).
    Das Ändern auf DLookUp wäre nur an wenigen Stellen eine machbare Umgehung gewesen.

    Erneut herzlichen Dank
    beste Grüße
    Klaus-Jürgen Gruber

    PS.
    Falls Du mal nach München kommst, bist Du herzlichst auf ein Bier eingeladen!!
    Mittwoch, 27. November 2019 06:56