Benutzer mit den meisten Antworten
Access VBA Recordset Open einer Abfrage liefert kein Ergebnis obwohl die Abfrage Daten liefert

Frage
-
Hallo
ich habe folgendes VBA Script:
Dim con As ADODB.Connection Dim rst As ADODB.Recordset Set con = CurrentProject.Connection con.CommandTimeout = 120 Set rst = New ADODB.Recordset rst.Open Queryname, con, adOpenKeyset, adLockReadOnly If Not rst.EOF Then
In der Variabeln Queryname wird der Name einer Abfrage übergeben.
Ich habe zwei verschiedene Abfragen, deren Ergebnisse so ausgelesen werden sollen.
Mit einer der beiden Abfragen bekomme ich Daten mit der anderen nicht, obwohl mir beide Abfragen Ergebnisse leifern, wenn ich sie direkt öffne.
Ich habe schon den Connection Time Out erhöht aber das hat keinen Erfolg gebracht.Hat jemand eine Idee, wo das Problem liegen könnte?
Die Abfragen sind prinzipiell identisch und liefern jeweils ein Ergebnisfeld und eine zweistellige Anzahl Datensätze.
Gruß
cheapy
- Bearbeitet Cheaptrick_la Freitag, 4. August 2017 09:27
Antworten
-
So, ich konnte das Problem lösen.
Die Ursache war war ein Wildcard-Zeichen (*) in einer der Abfragen.
Der Versuch statt * das im normalen SQL übliche % zu nehmen sorgte dafür das dann die Abfrage bei "normaler" Ausführung kein Ergebnis lieferte.Ich habe die Geschichte dann komplett anders gelöst und bekomme jetzt meine Daten.
Übrigens das Weglassen von adOpenKeyset, adLockReadOnly führte dazu das im Recordset die Anzahl Datensätze immer auf -1 stand, was mir auch nicht geholfen hat, daher habe ich es wieder eingesetzt.
- Bearbeitet Cheaptrick_la Freitag, 4. August 2017 12:05
- Als Antwort markiert Cheaptrick_la Freitag, 4. August 2017 12:05
Alle Antworten
-
Dann müsste da auch ein Fehler ausgeworfen werden wenn du keine "on error resume next"-Anweisung verwendest.
Ansonsten lass mal die letzten beiden Parameter weg, da ggf. die Abfrage nicht als Keyset verwendet werden kann. Der Open erkennt die Verwendungsmöglichkeit meist selber.
-
Das hat leider auch nichts gebracht. Eine Fehlermeldung belkomme ich auch nicht.
Ich habe in der Zwiwchenzeit mal folgendes porbiert, aber ebenfalls ohne Erfolg:
Dim con As New adodb.Connection Dim rst As New adodb.Recordset Dim cmd As New adodb.Command cmd.ActiveConnection = con cmd.CommandText = "SELECT * FROM " & Queryname cmd.CommandTimeout = 300 rst.Open cmd
-
So, ich konnte das Problem lösen.
Die Ursache war war ein Wildcard-Zeichen (*) in einer der Abfragen.
Der Versuch statt * das im normalen SQL übliche % zu nehmen sorgte dafür das dann die Abfrage bei "normaler" Ausführung kein Ergebnis lieferte.Ich habe die Geschichte dann komplett anders gelöst und bekomme jetzt meine Daten.
Übrigens das Weglassen von adOpenKeyset, adLockReadOnly führte dazu das im Recordset die Anzahl Datensätze immer auf -1 stand, was mir auch nicht geholfen hat, daher habe ich es wieder eingesetzt.
- Bearbeitet Cheaptrick_la Freitag, 4. August 2017 12:05
- Als Antwort markiert Cheaptrick_la Freitag, 4. August 2017 12:05
-
Das kommt halt darauf an, ob man die Anzahl benötigt.
Wenn man nur die Daten lesen möchte, reicht es, die Daten ohne Angaben zu öffnen.
Mit den Angaben wird das Ergebnis erst mal komplett in das Recordset geladen bevor du es verarbeiten kannst.
Bei kleinen Datenmengen ist das i.d.R. kein Problem, bei ein paar 100.000 Sätzen kann das durchaus einen Performanceunterschied ausmachen.
Und bei mehr als 16Mio Sätzen bekommt man nach langer Wartezeit dann einen Fehler ausgeworfen oder vielleicht sogar einen Absturz.Der Unterschied nennt sich ServerCursor (Daten sind im Server) oder ClientCursor (Daten im Recordset).