Office: (Office 2013) ADO-Alternative für einfachen DAO-Aufruf einer SP im SQL-Server

Helfe beim Thema ADO-Alternative für einfachen DAO-Aufruf einer SP im SQL-Server in Microsoft Access Hilfe um das Problem gemeinsam zu lösen; Ich habe eine einfache Routine um beliebige Stored Procedures via VBA & DAO von einem SQL-Server aufzurufen. Das schöne daran ist, dass man beliebig... Dieses Thema im Forum "Microsoft Access Hilfe" wurde erstellt von stefaktiv, 8. März 2018.

  1. ADO-Alternative für einfachen DAO-Aufruf einer SP im SQL-Server


    Ich habe eine einfache Routine um beliebige Stored Procedures via VBA & DAO von einem SQL-Server aufzurufen. Das schöne daran ist, dass man beliebig viele Parameter hintereinander klemmen kann und sich darum schon mal keine Sorgen machen muss:


    Code:
    Der Aufruf ist denkbar einfach - z.B. via

    Code:
    Jetzt hätte ich gerne für einen Aufruf mittels ADO / ADODB gleichermaßen eine so leichte Möglichkeit. Leider hab ich nur Lösungen mit Command-Befehlen gefunden. Das geht zwar technisch ohne Probleme - allerdings muss man immer pro Parameter einen eigenen Parameter im Command-Befehl definieren. Das ist für einen Aufruf mit beliebig vielen Parametern aber hinderlich.

    Gibt es ggf. eine einfachere Möglichkeit?

    Irgendwo hab ich eine Lösung gesehen, bei welcher der SQL-String mit einem Execute-Befehl über die Connection abgesetzt wurde. Leider scheint das eine One-Way-Lösung zu sein - man bekommt also nicht einmal ein Ergebnis. Und ein ADO-Recordset wird auch nicht zurückgegeben.

    :)
     
    stefaktiv, 8. März 2018
    #1
  2. Hallo!

    Sowohl ADODB.Recordset.Open als auch ADODB.Connection.Execute können einen SQL-Text mit "exec Schema.Prozedurname @Param1 = ..." verarbeiten und ein Recordset zurückgeben.
    Wie sieht der von der getestet VBA-Code aus, der kein Recordset zurückgibt?

    Zur Sicherheit nachgefragt: "Set nocount on" ist in der Prozedur im SQL-Server eingestellt?

    mfg
    Josef
     
    Josef P., 10. März 2018
    #2
  3. Du könntest an ein Command Objekt das Parameter Array direkt übergeben - sofern alles korrekt Formatiert ist. Das Formatieren erspart man sich über die Parameter Collection.
    Schlussendlich macht es auch nichts anderes als einen String zu erzeugen und natürlich einiges mehr.

    Wenn man z.b. bei Shapes seine SP einsetzen möchte, geht es auch nur indem man den String selbst zusammenstellt.
     
    markusxy, 10. März 2018
    #3
  4. ADO-Alternative für einfachen DAO-Aufruf einer SP im SQL-Server

    Muss die Bezeichnung von "@Param1 =" dann mit derjenigen übereinstimmen, die in der betreffenden Prozedur hinterlegt sind? Das wäre schwierig, weil es eben so viele Prozeduren sind.


    Also korrekt formatiert sind die Parameter auch in der DAO-Routine schon. Das erledigt die Funktion

    Code:
    Dort wird z.B. ein String-Wert in Anführungszeichen gesetzt oder Datumswerte entsprechend formatiert. Daher könnte ich eigentlich diesen String auch direkt verwenden.

    Wie genau übergebe ich das jetzt an das Command Objekt - also wohin genau?
     
    Zuletzt von einem Moderator bearbeitet: 7. Januar 2021
    stefaktiv, 11. März 2018
    #4
  5. Natürlich müssen die genau so wie bei der Verwendung in der Pass-Through-Abfrage übereinstimmen.
    Wenn du @xyz = 1 übergibst, wird der SQL-Server nicht erkennen können, dass der Wert 1 zum Parameter @abc gehört, weil es @xyz nicht gibt. *wink.gif*

    Code:
    Die Zusammenstellung des SQL-Ausdrucks bleibt im Vergleich zur PT-Abfrage unverändert.

    mfg
    Josef
     
    Josef P., 11. März 2018
    #5
  6. Benützt du die VBA Hilfe eigentlich auch?

    Schau dir die command.Execute Methode an und lies es sorgfältig durch.
    Da findest du alles dazu *wink.gif*

    LG Markus

    /Edit:
    Schau dir auch alle Infos zum CommandObjekt und aller Methoden/Eigenschaften an.
    Um Effizient mit ADO arbeiten zu können musst du das wissen. Ansonsten bist du immer nur am Suchen von Beispielcodes und kannst ihn dennoch nicht effizient einsetzen.
     
    Zuletzt von einem Moderator bearbeitet: 7. Januar 2021
    markusxy, 11. März 2018
    #6
  7. Leider führt weder die Suche in der MS-Hilfe, noch im wirklich ausführlichen Buch "Office Access Programmierung" von MS Press zu dem gewünschten Ergebnis. Es ist mir zwar schon gelungen Stored Procedures mit einem Parameter aufzurufen - spätestens ab dem zweiten klappt es aber nicht mehr.

    Hier mein aktueller Code:


    Code:
    Dazu noch folgende Funktion für die Parameterliste:


    Code:
    Ich hab auch schon versucht mit "EXEC NAME_SP Parameter" als cmdText zu arbeiten - leider hat das auch nicht funktioniert. Gleiches gilt, wenn ich die Parameterliste mit dem Connection-Objekt abschicke und daraus den Recordset entnehmen will.
     
    stefaktiv, 12. März 2018
    #7
  8. ADO-Alternative für einfachen DAO-Aufruf einer SP im SQL-Server

    Ach ja - eine nette neue, nette Fehlermeldung gibt es auch noch:

     
    stefaktiv, 12. März 2018
    #8
  9. Hallo!

    Ich verwende einmal deine anfangs gezeigte PT-Abfrage-Variante und mach daraus eine PT- und eine ADODB-Variante.
    Der folgende Code ist nur Luftcode => enthält möglicherweise Fehler, aber die Vorgehensweise sollte erkennbar sein.

    Code:
    Anm.:
    Ich selbst verwende die Klasse AdodbHandler für den OLEDB-Zugriff.


    mfg
    Josef
     
    Josef P., 12. März 2018
    #9
  10. Leider kommt wieder die bisher unbekannte Fehlermeldung:
    Code:
    Auffällig ist folgendes: wird nur ein Parameter übergeben, dann geht es. Sind es mehrere, dann geht es nicht. Also bei Stored-Procedures, bei denen nur eine ID als Übergabe erwartet wird, da klappt es. Bei anderen klappt es selbst dann nicht, wenn nur die ID übergeben wird und beim zweiten Wert schon ein Standard vorgegeben ist. Bei einer DAO-Übergabe klappt das schon.


    Zu dem Hinweis mit der Connection wäre meine Frage, ob es von der Performance besser ist, wenn ich ganz zu Beginn beim Öffnen der Datenbank die Connection aufbaue und als Global bereitstelle. Schließt sich das nicht nach einiger Zeit von selbst wieder?
     
    stefaktiv, 13. März 2018
    #10
  11. Hallo!

    Wie sieht eine SQL-Anweisung mit mehreren Parametern aus, bei der dieser Fehler kommt?

    Code:
    Und da die Frage noch offne ist: Ist in den gepseicherten Prozeduren "SET NOCOUNT ON" gesetzt?

    mfg
    Josef
     
    Josef P., 13. März 2018
    #11
  12. Also die Parameter sind nur zwei Zahlen - eine ID und die Aufrufart.

    Beispiel: "EXEC spMeineProzedur 1710, 1"


    SET NOCOUNT geht leider nicht:

    Code:
    Die Stored Procedures sind nämlich "native kompiliert". Ich hab den Server auf die In-Memory-Technik umgestellt. Beim DAO-Aufruf geht es wie gesagt.
     
    stefaktiv, 13. März 2018
    #12
  13. ADO-Alternative für einfachen DAO-Aufruf einer SP im SQL-Server

    Dieses Details hättest auch etwas früher schon mal erwähnen können.

    Dann ist SET NOCOUNT ON nicht erforderlich, weil automatisch aktiv für die SP.

    Mal davon abgesehen, dass varParameter in deinem Code bei direktem Aufruf kein multidimensionales Array ist, sollte der Code so funktionieren.

    Bzgl. multidimensionales Array: Ich weiß nicht, wie du deinen Code aufrufst, dass es deswegen nicht zu einem Laufzeitfehler kommt, aber vielleicht ist das schon die einfache Ursache dafür, dass dein Code bestenfalls mit einem Parameter funktioniert!

    Wenn das nicht der Fehler war, dann zeig mal ein minimales, aber vollständiges (inkl. SP-Code), Beispiel, das den Fehler reproduziert.
     
    Zuletzt von einem Moderator bearbeitet: 7. Januar 2021
  14. Hier die SP:

    Code:
    Hier der Aufruf, also dass, was anschließend in strSQL steht:

    Code:
    Der vollständige Aufruf sieht jetzt so aus:


    Code:
     
    stefaktiv, 17. März 2018
    #14
  15. Als Ergebnis wird angezeigt:

     
    stefaktiv, 17. März 2018
    #15
Thema:

ADO-Alternative für einfachen DAO-Aufruf einer SP im SQL-Server

Die Seite wird geladen...
  1. ADO-Alternative für einfachen DAO-Aufruf einer SP im SQL-Server - Similar Threads - ADO Alternative einfachen

  2. ADO: Recordset in Array

    in Microsoft Excel Hilfe
    ADO: Recordset in Array: Hallo zusammen, ich hab eine Frage bzgl. der Abfrage von Daten aus txt-Dateien via ADO. Nachfolgender Code funktioniert reibungslos, ruft den (mittels SQL-Abfrage evtl. gefilterten) Inhalt einer...
  3. Recordset auf Inhalt prüfen (ADO, SQL)

    in Microsoft Excel Hilfe
    Recordset auf Inhalt prüfen (ADO, SQL): Hallo, ich versuche u.a. in folgender Abfrage zu prüfen ob das Recordset einen Wert enthält. Und obwohl mit dem verwendeten SQl-String mir in Access ein Ergebnis angezeigt wird, läuft der Code so...
  4. Export in Excel per ADO

    in Microsoft Excel Hilfe
    Export in Excel per ADO: Hallo Excel-Gemeinde, ich möchte gerne meine Daten beim Schließen einer Exceldatei zurück in einen "Container" (Excel-Datei) schreiben. Beim Start werden die entsprechenden Tabellenwerte aus dem...
  5. Datensätze eines ADO Recordset OHNE Schleife in Tabelle schreiben

    in Microsoft Access Hilfe
    Datensätze eines ADO Recordset OHNE Schleife in Tabelle schreiben: Hallo Zusammen, ich suche eine Möglichkeit, die Datensätze eines ADO-Recordsets (Abfrage vom SQLSERVER) ohne Schleife in eine Access-Tabelle zu schreiben. Wer kann mir helfen? Vielen Dank und...
  6. Ado Recordset in anderen kopieren

    in Microsoft Access Hilfe
    Ado Recordset in anderen kopieren: Hi, dim rst, rst1 as Adodb.Recordset ' get rst as recordset ... 'copy filtered rst to rst1 set rst1=rst schien mal zu funktionieren, jedenfalls gibt es das beim Googlen. Bei mir meckert der...
  7. Wahr/Fasch True/False Problem ADO Access

    in Microsoft Excel Hilfe
    Wahr/Fasch True/False Problem ADO Access: Hallo Zusammen, ich habe gerade Stunden mit diesem Problem verschwendet. Meine Systemsprache ist Deutsch. Somit werden True/False-Werte in Access (ADO mit Excel) als Wahr/Falsch gespeichert....
  8. VBA ADO - mehrere Einträge in Recordset mit einmal in DB schreiben

    in Microsoft Excel Hilfe
    VBA ADO - mehrere Einträge in Recordset mit einmal in DB schreiben: Hallo zusammen, (bin Recordset Anfänger) wie im Titel schon steht möchte ich ein gesamtes Recordset mit mehrern Einträgen in eine DB sschreiben, damit man sich das zeilenweise in DB schreiben...
  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