online 1
gast (50)

/ Forum / Datenbanken

DatenbankenDatenbanken

Fragevon ChrisWI05 vom 30.08.2019, 11:41 Options

ADODB Recordset - Welcher CursorType??

Hallo an alle ADODB-User!

Ich habe eine kleine Verständnisfrage, da ich - trotz Onlinehilfe - noch nicht 100prozentig verstanden habe, wann ich welchen Recordset CursorType einsetze.

Zur Zeit nutze ich folgende Anweisung um in Access (via VBA) Daten aus einem ungebunden Formular in entsprechende Tabellen zu schreiben:
============
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset

With rst
.Open <Variable für SQL-String>, CurrentProject.AccessConnection, adOpenKeyset, adLockOptimistic, adCmdText
(...)
.Update
.Close
End With

Set rst = nothing
=============

Zum Auslesen von Datensätzen für ein ungebundes Formular nutze ich:

rst.Open <Variable mit SQL-String>, CurrentProject.AccessConnection, adOpenKeyset, adLockReadOnly, adCmdText


Aufgefallen ist mir, daß - für mich leider noch nicht nachvollziehbar - z.T. obwohl nur ein Datensatz ins Formular geladen wurde und trotz Sicherstellung daß auch nur jener Datensatz in die Datenbank geschrieben wird, welcher gerade bearbeitet wurde - sicherstellen tue ich dies mit einem unsichtbaren textfeld, in welches ich beim Laden des Datensatzes dessen ID eintrage - mehrere bearbeitet werden.
Kurz gesagt, es wird Datensatz mit ID=19 bei Formularaufruf geladen, beim Speichern (trotz strSQL = "SELECT ... FROM ... WHERE ID = & Me.txtID) erfährt jedoch bspw. auch Datensatz ID=18 die Änderung! Hängt das mit einem internen Index der Tabelle zusammen??

Danke für Statements vorab!

Christian


Antwort schreiben

Antwort 1 von ChrisWI05 vom 30.08.2019, 12:44 Options

Ok, habe im Internet was zu den CursorTypes gefunden:
Meine Anmerkungen/Fragen habe ich in "[ ]" dahinter geschrieben.

- ForwardOnly: Nur vorwärts 'Beweugungen' sind möglich. Veränderungen an Datensätzen durch Andere werden nicht berücksichtigt.

- KeySet: Änderungen von anderen sind sichtbar, Hinzugefügte Datensätze nicht. [Inwiefern "sichtbar"? Wenn ich eine Datensatzänderung ereignisgebunden in die Datenbank schreibe, "sehe" ich doch keine durch Dritte geänderten Datensätze?? Oder erhalte ich dann eine Meldung?]

- Dynamic: Alle Änderungen von anderen sind sichtbar [Gleiche Frage: inwiefern "sichtbar"??]

- Static: Es sind keine Änderungen durch Dritte sichtbar, jedoch sind 'vorwärts' und 'rückwärts' Bewegungen möglich. [rückwärts = Rollback?]

Für welchen CursorType müsste ich mich entscheiden, wenn das Szenario wie folgt aussähe:
Mehrere Benutzer greifen zeitgleich auf das BackEnd der AccessDB zu, jedoch nur zu einer sehr geringen Wahrscheinlichkeit zeitgleich auf das gleiche Formular im Frontend. Wird ein Formular aufgrufen, so erfolgt zunächst eine Prüfung, ob in einem unsichtbaren Textfeld (txtID) eine ID eingetragen ist; wenn ja, dann werden die Steuerelemente (Textfelder, Checkboxen) im Formular über ein Recordset mit Daten gefüllt. Das Recordset definiere ich mit einem SQL-Statement (siehe 1.Beitrag) und der WHERE-Bedingung "ID=Me.txtID", danach belege ich die Felder (bspw.: Me.txtVorname = rst("Vorname") usw.) Abschließend schließe ich das Recordset - sinnvoll?

Ist in txtID noch keine ID enthalten, so wird das Formular ohne entsprechende Vorbelegung als "Blanko"formular ausgegeben.

Während der Bearbeitung verstreicht Zeit. Beim Klick auf "Speichern" werden dann die Inhalte/Werte der Steuerelemente via neuem Recordset in die DB geschrieben. (siehe 1.Beitrag)


Verfahre ich so richtig?? Oder muss ich das Recordset während der "Bearbeitungsphase" offen halten?

Antwort 2 von lleopard vom 30.08.2019, 12:53 Options

Hallo Christian,

ehrlich gesagt habe ich es in Access noch gar nicht mit ADODB versucht auf Datensatzebene was zu machen. Funzt aber, wie ich gerade gesehen habe... muß ich mal vertiefen. ;-)

Aber per ADODB erzeugst du quasi ein Connection-Object auf die eigenen Datenbank. Das ist langsamer als der direkte Verweis per DAO auf die Tabelle/Abfrage. Versuch es doch mal so:

Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("Select * FROM TabName WHERE ID = " & Me.txtID)

rs.Movelast
if rs.Recordcount >0 then
'Ja was dann???
end if

With rst
rs. Edit
rs!Feldname = me!Formularfeld '(???)
rs.Update
.Close
End With

Set rst = Nothing


Gruß Leo

Antwort 3 von ChrisWI05 vom 30.08.2019, 15:01 Options

Hallo Leo,

ich habe mich an ADODB orientiert, weil ich mit dem Gedanken spiele das Datenbank-Bachend früher oder später nach SQL-Server zu migrieren. Dabei soll ADODB "kompatibler" als DAO sein.

Ich verstehe bisher nur nicht, wie das mit dem "Änderungen sind sichtbar"(oder eben nicht) zu verstehen ist, wenn ich doch die Inhalte/Werte der Steuerelemente zuerst in ein Recordset einfüge und dann in die DB schreibe. Da "sehe" ich doch eigentlich keine Änderungen. Vermutlich habe ich mich gerade mehrdeutig ausgedrückt - aber welchen CursorType soll ich verwenden und wovon ist das abhängig??


Gruß
Christian

Antwort 4 von lleopard vom 31.08.2019, 08:33 Options

Hallo Christian,

Zitat:
Ich verstehe bisher nur nicht, wie das mit dem "Änderungen sind sichtbar"(oder eben nicht) zu verstehen ist, wenn ich doch die Inhalte/Werte der Steuerelemente zuerst in ein Recordset einfüge und dann in die DB schreibe. Da "sehe" ich doch eigentlich keine Änderungen. Vermutlich habe ich mich gerade mehrdeutig ausgedrückt - aber welchen CursorType soll ich verwenden und wovon ist das abhängig??


Also das steht auf Englisch in der Open-Hilfe bei Access2003:

'adOpenForwardOnly 0 Default.
'Uses a forward-only cursor. _
Identical to a static cursor, except that you can only scroll forward _
through records. This improves performance when you need to make only _
one pass through a Recordset.

'adOpenKeyset 1 Uses a keyset cursor. _
Like a dynamic cursor, except that you can't see records _
that other users add, although records that other users delete _
are inaccessible from your Recordset. Data changes by other users _
are still visible.

'adOpenDynamic 2 Uses a dynamic cursor.
'Additions, changes, and deletions by other users are visible, _
and all types of movement through the Recordset are allowed, _
except for bookmarks, if the provider doesn't support them.

'adOpenStatic 3 Uses a static cursor.
'A static copy of a set of records that you can use to find data _
or generate reports. Additions, changes, or deletions by other users _
are not visible.

'adOpenUnspecified -1 Does not specify the type of cursor.


Jetzt kommt es nur darauf an, was der Client machen darf, wenn er ein Recordset öffnet: soll er alles sehen, auch die Änderungen anderer Clients, dann kommt wohl nur adOpenDynamic in Frage. Soll hingegen nur der aktuelle Datensatz bearbeitet werden, kannst du den Standardwert setzen, also adOpenForwardOnly, oder halt 0

Ansonsten spricht der Text ja für sich...

Gruß Leo

Ähnliche Themen

Word SQL Resultat anzeigen
Schnufi  12.04.2007 - 86 Hits -

Bericht aus Recordset erstellen
Vossibaer  15.08.2007 - 97 Hits - 2 Antworten

Funktion die ein Recordset zurückgibt in VBS?
Tigger1975  13.06.2008 - 63 Hits -

Hinweis

Diese Frage ist schon etwas älter, Sie können daher nicht mehr auf sie antworten. Sollte Ihre Frage noch nicht gelöst sein, stellen Sie einfach eine neue Frage im Forum..

Neue Einträge

Version: supportware 1.9.150 / 10.06.2022, Startzeit:Sun Jan 25 18:15:21 2026