none
Access VBA Recordset Open einer Abfrage liefert kein Ergebnis obwohl die Abfrage Daten liefert RRS feed

  • 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


    Freitag, 4. August 2017 07:51

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.


    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.

    Freitag, 4. August 2017 09:26
  • 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
    
    

    Freitag, 4. August 2017 10:42
  • 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.


    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).

    Freitag, 4. August 2017 14:44