Office: (Office 2007) SQL-Abfrage direkt in VBA-Variable?

Helfe beim Thema SQL-Abfrage direkt in VBA-Variable? in Microsoft Access Hilfe um das Problem gemeinsam zu lösen; zu FLookup: Ich verstehe immer noch nicht, was an der Variante mit ..OpenRecordset(..)(0) besser sein soll als an der Verwendung der... Dieses Thema im Forum "Microsoft Access Hilfe" wurde erstellt von raist10, 30. August 2009.

  1. SQL-Abfrage direkt in VBA-Variable?


    zu FLookup:
    Ich verstehe immer noch nicht, was an der Variante mit ..OpenRecordset(..)(0) besser sein soll als an der Verwendung der Recordset-Referenz.
    Die Laufzeit kann es nicht sein, denn die Unterschiede zwischen den beiden Varianten sind nicht einmal eindeutig messbar.
    Was spricht also gegen die Variante mit der Recordset-Referenz?
    Die paar Zeilen Code mehr, die man einmalig in die Funktion schreibt?
    Für mich ist das Code, der klar erkennbar einen Fehler auslöst, obwohl dieser einfachst vermieden werden könnte.

    Anm.: die Variante mit OpenRecordset(..)(0) lass ich mir ja noch eingehen, wenn man sie in einem beliebigem Code-Abschnitt verwendet, um direkt die Daten aus einem sicher vorhandenen DS zu holen, aber nicht in einer Hilfsfunktion, die man nur einmal erstellt und die die Aufgabe hat, genau diesen Zugriff zu vereinfachen.
     
  2. \@ Josef P.

    Doch, die Unterschiede sind meßbar zumindest auf meinem Rechner.

    Ich habe das Ganze allerdings mit ADO durchgespielt, selbst wenn bereits auf eine geöffnete ADO-Connection zugegriffen werden kann liegt der Unterschied zur Variante mit DBEngine bei satten 50% oder knapp 30 Millisekunden zu 60 Millisekunden (DLookUP irgendwas um die 180 Millisekunden).

    Das kann aber nicht nur an meinem Rechner liegen, sondern muß allgemein gültig sein.

    Bin ja nicht von selber drauf gekommen das nach zu messen, sondern habe den Tip aus einem Buch von André Minhorst. Nachgebastelt und selber gemessen komme ich eben auf obige Ergebnisse.

    Wie gesagt, bei bereits bestehender Connection für das ADODB-Recordset.

    Gruß

    Rainer
     
  3. Vergleichst du da gerade Äpfel mit Birnen? Natürlich ist DBEngine auf die aktuelle Jet-DB schneller als die ADODB-Variante.

    Zu Sicherheit: mir geht es nicht um den Vergleich zw. den Dxx-Funktionen und den Recordset-Ersatz-Funktionen sondern um den Unterschied zw.
    Code:
    und
    Code:
    Ich kann dabei weder mit DAO noch mit ADODB einen Unterschied messen. (Je nach Lust von VBA ist mal die eine - später die andere Variante schneller ... anders formuliert: die Differenzen liegen innerhalb der Messtoleranzen. ... du weißt ja: wer misst, misst Mist. *wink.gif*)


    BTW: wie hast du unter ADODB diese Zeile
    Code:
    umgesetzt? .. mittels:
    Code:
     
  4. SQL-Abfrage direkt in VBA-Variable?

    Gebe natürlich zu das ich bei meinen Tests das ADODB.Recordset im klassischen Sinne angesprochen habe:

    Code:
    So meine ich das ich das aufgebaut habe.

    Gruß

    Rainer
     
  5. Ok, dann nimm diesen Code mit direkter Verbindung zu einer SQL-Server-DB und vergleiche ihn mit der DBEngine-Variante auf die verknüpfte Tabelle. ... dann wird vermutlich die ADODB-Variante schneller sein.

    Dass DbEngine(0)(0).OpenRecordset(...)(0) verglichen mit dem Öffnen eines ADODB-Recordsets auf die aktuelle Jet-DB schneller ist, ist klar. Das hat aber nichts mit dem Zugriff auf das Datenfeld über OpenRecordset(...)(0) vs. rst.Fields(0) zu tun. *wink.gif* ... so etwas darf man nur mit der gleichen Zugriffstechnik vergleichen. Sonst vergleicht man nicht den Feldzugriff sondern die Öffnungszeit für die unterschiedlichen Recordset-Varianten.
     
  6. \@ Josef P.

    Darum ging es ja im Prinzip auch, um die Öffnungszeiten der verschiedenen Möglichkeiten so eine Abfrage zu gestalten.

    Aber letztendlich hat es mich ja zum Ziel gebracht, die Variante die ich nutze ist ja gleich schnell wie Deine Variante. Einziger Unterschied ich brauche noch den Err_Handler dazu den Du durch den Einsatz des Recordsets vermeidest.

    Aber auch gut ... hast mich zum Nachdenken gebracht ob ich die Function nicht schnell ändere. Hat ja schließlich so seine Vorteile wenn man immer so programmiert das oben x rein kommt und unten y raus kommt, dann kann man das was dazwischen passiert ja problemlos ändern. ^^

    Wenn ich die aktuelle Story abgearbeitet hab, dann werde ich mir diesen Thread nochmal genauer angucken.

    Auf jeden Fall Danke für den Schubs in die Richtung. *wink.gif*

    Gruß

    Rainer
     
  7. Ich nutze trotzdem eine Fehlerbehandlung in meinen Prozeduren, auch wenn ich sie meisten entferne, wenn ich den Code in einen Beitrag schreibe, damit sie nicht vom eigentlichen Programmcode ablenkt.
    Der Unterschied ist nur, dass in dem von mir gezeigten Beispiel die Fehlerbehandlung nicht zum Logikteil der Prozedur gehört sondern nur für die Ausnahmefehlerbehandlung dient, um z. B. Fehler im SQL-Code u. ä. abzufangen, welche aber bei ordentlicher Programmierung nicht auftreten sollten. *wink.gif*


    Ich erstellte eine Test-Anwendung für den Vergleich der Varianten:
     
  8. SQL-Abfrage direkt in VBA-Variable?

    Ich hätte auch noch Ergebnisse nachzureichen:

    Code:
    DlookUp kennt jeder, hier die anderen beiden Versionen:

    Code:
    Lokal waren es 100.000 Durchläufe übers Netzwerk nur 1000. Ja Josef ich weiß, in der Hilfe steht, dass man DBEngine nicht verwenden soll. Es ist mir immer noch Unbegreiflich, warum man das nicht machen soll. Aber die Hilfe ist seit A97 auch beständig schlechter geworden (meine Empfindung).
     
  9. \@Jan: geht es dir um Mikrosekunden? ... dann nimm CurrentDbC statt DBEngine(0)(0), denn das ist nach der ersten Initialisierung schneller. *biggrin.gif*
    Was habe ich nun für einen Vorteil, wenn ich DBEngine(0)(0) verwende? Einerseits ist es langsamer als CurrentDbC und andererseits von MS nicht empfohlen. Ich finde zumindest für mich keinen Grund es zu verwenden.

    Der Grund warum die CurrentDbC-Variante schneller ist, ist schnell erklärt: es wird nur eine Referenz geprüft und nicht in 2 Containern nachgeschlagen.
     
  10. \@Josef Optimierung braucht man öfters unter Access eher weniger, aber solche Vergleiche sind manchmal einfach interessant. Und ich habe nicht CurrentDbC mit DBEngine verglichen, sondern DLookUp, fLookUp und OpenRecordset()(0). Und das sowohl in einer lokalen Tabelle, als auch übers Netzwerk.

    Den Hinweis bezüglich DBEngine habe ich nur gebracht, um dieser Diskussion aus dem Weg zu gehen. *wink.gif*
     
  11. \@Jan: Ich interpretierte deinen Text so, dass DBEngine(0)(0) die beste Wahl sei, daher erlaubte ich mir auf CurrentDbC hinzuweisen. *wink.gif*

    Zur Vergleichsmessung:
    Bei einer verlinkten Tabelle aus einem lokalem BE kann ich keinen merkbaren Unterschied zw. OpenRecordset(...)(0) und der Recordset-Referenz-Variante feststellen. (Dass Dlookup langsamer ist, ist nicht ungewöhnlich - man muss sich nur den Showplan davon ansehen. *wink.gif*)
    Interessant finde ich, dass bei dir übers Netzwerk OpenRecordset(...)(0)-Variante anscheinend eindeutig langsamer ist als die Variante mit der Rs-Referenz.

    Hier mal eine Messreihe von mir (verknüpfte Tabelle aus lokalem BE):
    1 = OpenRecordset(...)(0)
    2 = Mit Recordset-Referenz
    Code:
    Ausschlaggebend für die Abweichungen dürfte die Ungenauigkeit der Messung sein, sonst würde immer eine Variante die schnellste sein. (Ich messe über eine Klasse und QueryPerformanceCounter)

    Meiner Ansicht nach dürfte die Zugriffsart auf den Feldwert nicht vom Ort des BE abhängig sein, da zu diesem Zeitpunkt das Recordset bereits geöffnet ist. Wenn es doch so aussieht, könnte das möglicherweise auch andere Gründe haben. => ich würde daher die Recordset-Referenz-Variante nicht aufgrund der Geschwindigkeit empfehlen, sondern aufgrund des für mein Empfinden besseren Codes. *Smilie
     
  12. \@Josef Nein, das war nicht meine Absicht. Wenn ich sage, dass ich übers Netz zugreife, wirds wohl auch ein Netzlaufwerk sein (Sorry bin grad ziemlich gereizt). Die Schwankungen darin spielen natürlich eine Rolle. Auch meine Tabelle ist mit 40K Daten deutlich größer als deine (ich habe dein Beispiel angesehen). Wie es sich mit einer Indexsuche vs. Textsuche verhält, wäre auch noch interessant. Mit deinem Mist messen hast du recht und deswegen sind die 7 Sekunden auch entsprechend relativ zu sehen.
     
  13. SQL-Abfrage direkt in VBA-Variable?

    hm .. das dürfte imo keine Auswirkungen auf den Feldzugriff haben, sondern nur mit dem Öffnen des Recordsets zusammenhängen. Für den Vergleich zw. DLookup & Co. ist das auf jeden Fall interessant, aber für den Vergleich zw. OpenRecordset(...)(0) und Recordset-Referenz müsste das egal sein. Aus diesem Grund nahm ich bei meinem Test extra eine Tabelle mit wenigen DS und ging über den PK, damit der Anteil der Zeitmessung für die Datenauswertung so klein wie möglich bleibt.
     
Thema:

SQL-Abfrage direkt in VBA-Variable?

Die Seite wird geladen...
  1. SQL-Abfrage direkt in VBA-Variable? - Similar Threads - SQL Abfrage VBA

  2. SQL-Abfrage mit where

    in Microsoft Access Hilfe
    SQL-Abfrage mit where: SQL-Abfrage mit where-Parameter. PNrHaupt ist eine Zahl. Ich vermute, da liegt der Fehler, aber ich weiss nicht, wie ich das darstellen soll. Bei jeder neuer PNrHaupt soll eine neue Datei erstellt...
  3. SQL-Abfrage in VBA eines Wahr/Falsch-Feldes

    in Microsoft Access Hilfe
    SQL-Abfrage in VBA eines Wahr/Falsch-Feldes: Hallo, ich habe folgendes Problem: In einer Access-Datenbank ist ein Feld ("Versorgungsausfall") vom Typ Bool, also Wahr/Falsch vorhanden. Wenn ich den Inhalt diese Feldes wie folgt abfrage:...
  4. Variablengesteuerte SQL Abfrage aus Excel VBA starten und in Zellen ausgeben

    in Microsoft Excel Hilfe
    Variablengesteuerte SQL Abfrage aus Excel VBA starten und in Zellen ausgeben: Hallo Experten, ich will mittels Excel VBA auf eine Access DB zugreifen (read only). Aus dieser DB möchte ich eine Abfrage starten und das Ergebnis in das Excel Worksheet schreiben. Die Abfrage...
  5. [VBA] Wert aus SQL-Abfrage in Variable speichern

    in Microsoft Access Hilfe
    [VBA] Wert aus SQL-Abfrage in Variable speichern: Hallo, ich möchte das Ergebnis folgender SQL-Abfrage in einer Variable speichern: Code: SELECT sum(Strom*12) FROM TempTab; . hat jemand eine Lösung hierfür? 353605
  6. VBA: SQL Abfrage ausführen und Resultat in eine Tabelle schreiben

    in Microsoft Access Hilfe
    VBA: SQL Abfrage ausführen und Resultat in eine Tabelle schreiben: Hallo Wie kann ich eine SQl Abfrage via VBA ausführen und danach den Wert in eine VBA Variable schreiben? Ich habe es so versucht: Code: Dim qdf As DAO.QueryDef Dim strSql As String Dim...
  7. Abfrage verändern via VBA/SQL

    in Microsoft Access Hilfe
    Abfrage verändern via VBA/SQL: Servus Weiss jemand von euch, wie ich eine Abfrage dynamisch mit vba oder sql verändern kann. D.h. ich möchte mit VBA auf die jeweiligen Felder einer Abfrage zugreifen können und so das...
  8. Wert einer sql-Abfrage in VBA an Textfeld übergeben

    in Microsoft Access Hilfe
    Wert einer sql-Abfrage in VBA an Textfeld übergeben: Hallo, in einem Formular [frmNeu], das auf einer leeren Tabelle beruht, sollen über 3 voneinander abhängigen Kombinationsfelder Daten ausgewählt werden. Das klappt auch super. Anschließend sollen...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden