HERBERS Excel-Forum - das Archiv
Problem bei Zugriff auf Access Datenbank aus Excel heraus
Karsten Jung
Hallo

Ich habe Datenbanken.
Diese spreche ich über folgendes Makro an:
Sub Verbindung_Access_herstellen(cn, rs, Source_1, Datenbank_1)

'Verbindung zu ACCESS herstellen
Set cn = New ADODB.Connection
cn.ConnectionString = Datenbank_1
'Verbindung öffnen
cn.Open
Set rs = New ADODB.Recordset
With rs
Set .ActiveConnection = cn
.Source = Source_1
.LockType = adLockOptimistic
.CursorType = adOpenKeyset
.Open
End With
End Sub

Ob wohl ich .CursorType = adOpenKeyset mitgebe, wird der sobald .open ausgeführt wird, zeitweise auf adOpenForwardOnly geändert.
Das passiert nicht immer und immer bei unterschiedlichen Datenbankzugriffen.

Ich beende jeden Datenbankzugriff immer mit:
    'Verbindung beenden

rs.Close
'Verbindung beenden
cn.Close
Set rs = Nothing
Set cn = Nothing

Ich öffne in dem Makro mehrere Zugriffe direkt hintereinander.
Jetzt habe ich das Gefühl, dass die Datenbank noch nicht wieder frei ist, wenn ich den nächsten Datenbankzugriff aufrufe.

Was kann das sein?

Gruß

Karsten
AW: Problem bei Zugriff auf Access Datenbank aus Excel heraus
Karsten Jung
Hier der Unterschied.
Als das Macro hängen blieb, sah es aus wie im unteren Bild der obere Teil.
Wenn ich dann
    'Verbindung beenden

rs.Close
'Verbindung beenden
cn.Close
Set rs = Nothing
Set cn = Nothing

ausgeführt habe und das Makro wieder von oben gestartet habe, kommt das untere Ergebnis.
Userbild

Vielleicht kann mir da jemend auf die Sprünge helfen.

Gruß

Karsten
AW: Problem bei Zugriff auf Access Datenbank aus Excel heraus
Yal
Moin,

wenn ich
Select * From ASI Where [Schlüsselfeld] = "13.12.24F"
richtig interpretiere, dann machst Du eine Abfrage auf eine Tabelle, mit dem Ziel, nur einen einzigen Datensatz ("Schlüsselfeld") zu bekommen.
Cursortype ist in dem Fall null relevant.
(Ich gehe davon aus, dass Du dich mit dem Begriff "Cursor" auseinandergesetzt hast, bevor Du die Frage stellst, daher spare ich mir weitere Erklärungen).

VG
Yal

AW: Problem bei Zugriff auf Access Datenbank aus Excel heraus
Karsten Jung
Hallo

Ich sollte den Fehler dazu schreiben.
Er passiert natürlich nur, wenn ich in die Datenbank schreiben möchte, diese aber "readonly" ist.
Userbild
Wenn das Problem nicht vom CursorTyp kommt, woher könnte es sonst noch kommen?

Gruß

Karsten

PS: deine Links schaue ich mir jetzt an.
AW: Problem bei Zugriff auf Access Datenbank aus Excel heraus
Yal
Hallo Karsten,

eine besondere Voraussetzung für das Programmieren ist die Fähigkeit zu lesen. Zugegeben: es ist ja englisch. Also Voraussetzung: Englisch lesen (und verstehen):

In der Fehlermeldung steht "Limitation of the locktype". Es steht nichts von CursorType.

Auch wenn Cursortype von "readonly" faselt, hat es mit dem Problem nicht zu tun. Dafür muss man sich auseinandersetzen, was ein Cursor ist.
Das Problem kommt vom Locktype (da auch: mit Locktype auseinandersetzen): wenn dein Recordset mit einem Locktype gebaut wurde, das das Rückschreiben nicht erlaubt, dann wir das Rückschreiben ("updating") verweigert.

VG
Yal
AW: Problem bei Zugriff auf Access Datenbank aus Excel heraus
Karsten Jung
Tut mir Leid,

ich bin gerade erkältet und sehe teilweise den Wald vor lauter Bäumen nicht mehr und bin leider auch kein Spezialist, was Access angeht.

Ich sende ja
.LockType = adLockOptimistic
beim aufbauen der Verbindung mit.
Meistens übernimmt er das auch.
Nur eben nicht immer.
Dann scheint (sorry falls ich mich falsch ausdrücke) die Datenbank schreibgeschützt zu sein.

Was kann der Grund sein?
Eine fehlerhaft beendete vorherige Verbindung?

Denn wenn ich das Macro dann von vorne starte, funktioniert er oft (aber nicht immer) problemlos.

Gruß

Karsten
AW: Problem bei Zugriff auf Access Datenbank aus Excel heraus
Yal
Hallo Karsten,

ja, der Anfang ist immer schwer :-) Soviel, was man alles auf einmal wissen müsste. Mit der Schwierigkeit, dass man nicht weiss, was relevant ist oder nicht.

Wenn man mit Access arbeitet, hat man selten einen grossen Userkreis. Und auch dann, ist es selten so, dass mehrere Leute gleichzeitig auf dieselbe Datensatz schreiben wollen. Daher kann man durchaus "adLockPessimistic" verwenden. Damit blockierst Du alle Datensätze (in dem Fall nur eine), solang Du Recordset nicht freigibst.

Ein andere Problemstelle scheint die Übergabe von Parameter. Wie es aussieht wird cn und rs als leere Object-Variablen dem Sub übergeben (in ByRef Modus), darin instanziert und teilweise behandelt und irgendwie, irgendwo anders geschlossen. Es ist nicht optimal. Ich habe keine Sicht auf dem gesamten Code, aber ich gehe davon aus, dass irgendwo eine anderen rs deklariert und instanziert wurde. D.h. es bleibt eventuell einen Recordset offen.
Arbeite in dem Fall lieber mit einer Variable auf Modulebene, sodass Du diese nicht als Parameter übergeben muss.

Siehe https://learn.microsoft.com/de-de/office/vba/language/concepts/getting-started/understanding-scope-and-visibility
Lesestufe: MUSS
Verständnisstufe: MUSS (spricht: wenn nicht ausreichend, weitere Materialien/Tutorial einbeziehen)
:-)

ByVal und ByRef sollte auch angeschaut werden.

VG
Yal
AW: Problem bei Zugriff auf Access Datenbank aus Excel heraus
Karsten Jung
Vielen Dank, dass du mir dabei geholfen hast.

Ich habe den vermutlichen Grund gefunden.
Die Datenbank war mittlerweile auf 100MB angewachsen.
Deshalb kam es mir so vor, dass das Update länger gedauert hat, als ich dem Programm zeitgelassen habe, um die nächste Eintragung zu machen.
Ich habe jetzt zwei Dinge gemacht:
1. Eine Überprüfung eingebaut, ob der Zugriff auf die Datenbank schreibeschützt ist.
Wenn nein, alles gut.
Wenn ja, dann habe ich eine Schleife gebaut, die noch mal versucht, auf die Datenbank zuzugreifen.
2. Ich habe die Datenbank verkleinert.

Nächste Woche werde ich mich dann mal tiefer mit den Links von Dir befassen.

Vielen Dank für die Hilfe.

Gruß

Karsten
AW: Problem bei Zugriff auf Access Datenbank aus Excel heraus
Yal
Hallo Karsten,

Du kannst ruhig die "Connection" offen lassen, solang deine Datei offen ist. Es ist keine Mehrwert, diese immer aufs Neu aufzubauen. Kostet wiederum auch nichts, wenn Acces lokal ist.

Ob Du Cursotyp in KeySet oder ForwardOnly öffnen musst, hängt davon, was Du mit den Daten machen möchtest. Es gibt wenige Anwendungsfälle, wo etwas anders als "adOpenForwardOnly" sinnvoll ist. Idealerweise stellt man eine Abfrage so, dass die Anzahl an Record so klein wie möglich ist. MoveNext und MoveFirst ist dann alles was man braucht. https://learn.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/recordset-object-ado

Und noch ist zu prüfen, ob Access überhaupt den Cursortype anbietet. https://learn.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/cursortype-property-ado

VG
Yal