{"id":55000505,"date":"2026-06-01T00:00:00","date_gmt":"2026-07-28T15:01:21","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=505"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\/","title":{"rendered":"ADODB: Access-Wrapper f&uuml;r gespeicherte Prozeduren"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/1bc6898d1c5040a5a263c88a3fa8ff70\" width=\"1\" height=\"1\" alt=\"\"><b>Wer Daten zwischen einer Access-Anwendung und einem SQL Server austauscht, landet fr&uuml;her oder sp&auml;ter bei gespeicherten Prozeduren. Sie kapseln die Datenbanklogik serverseitig, liefern bessere Performance als dynamisch zusammengebautes SQL und lassen sich sauber rechtebasiert absichern. Der Aufruf per ADODB erfordert allerdings jedes Mal eine ganze Reihe gleicher Schritte: Verbindung &ouml;ffnen, <b>Command<\/b>-Objekt erzeugen, <b>CommandType<\/b> setzen, Parameter definieren, Werte zuweisen, Prozedur ausf&uuml;hren, Ergebnis auslesen. Schreibt man das f&uuml;r jede Prozedur neu, w&auml;chst der Code schnell zu un&uuml;bersichtlichen Ausma&szlig;en an. In diesem Artikel bauen wir ein kleines Wrapper-Modul, das diese Arbeit einmalig erledigt. Anschlie&szlig;end kannst Du jede gespeicherte Prozedur mit einer einzigen Zeile Code aufrufen &#8211; inklusive Parameter&uuml;bergabe und R&uuml;ckgabewert. Als praktisches Beispiel binden wir den Wrapper an ein vollst&auml;ndiges Mitarbeiter-Formular mit allen vier CRUD-Operationen an.<\/b><\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Die Beispiele dieses Artikels findest Du in der Beispieldatenbank <b>ADODB_GespeicherteProzeduren.accdb<\/b>. Die zugeh&ouml;rige SQL Server-Datenbank hei&szlig;t <b>Test_GespeicherteProzeduren<\/b> und enth&auml;lt die beiden Tabellen <b>tblAbteilung<\/b> und <b>tblMitarbeiter<\/b>. Das Skript zum Anlegen der Tabellen, der Testdaten und der gespeicherten Prozeduren findest Du im Modul <b>mdlSQLServerDB<\/b> als auskommentierten T-SQL-Code, den Du direkt in ein Abfragefenster des SQL Server Management Studio kopieren kannst.<\/p>\n<h2>Die vier gespeicherten Prozeduren<\/h2>\n<p>F&uuml;r die Tabelle <b>tblMitarbeiter<\/b> stehen vier gespeicherte Prozeduren bereit, die sich an den vier klassischen CRUD-Operationen orientieren: <b>SELECT<\/b>, <b>INSERT<\/b>, <b>UPDATE <\/b>und <b>DELETE<\/b>. Schauen wir uns diese kurz der Reihe nach an, damit wir wissen, welche Parameter unser Wrapper sp&auml;ter bedienen muss.<\/p>\n<p>Die Prozedur <b>spMitarbeiterSelectNachMitarbeiterID<\/b> liefert entweder alle Mitarbeiter zur&uuml;ck oder nur den Mitarbeiter mit einer bestimmten ID, abh&auml;ngig davon, ob der optionale Parameter <b>@MitarbeiterID<\/b> &uuml;bergeben wird (siehe Listing 1).<\/p>\n<pre>CREATE PROCEDURE [dbo].[spMitarbeiterSelectNachMitarbeiterID]\r\n    @MitarbeiterID INT = NULL\r\nAS\r\nSET NOCOUNT ON\r\nSELECT  MitarbeiterID, AbteilungID, Vorname, Nachname, Email, Eintrittsdatum, Gehalt, ErstelltVon, ErstelltAm\r\nFROM tblMitarbeiter\r\nWHERE   (@MitarbeiterID IS NULL\r\n         OR MitarbeiterID = @MitarbeiterID)\r\nORDER BY Nachname, Vorname<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Gespeicherte Prozedur zum Auslesen der Mitarbeiter<\/span><\/b><\/p>\n<p>Die Prozedur <b>spMitarbeiterInsert<\/b> legt einen neuen Mitarbeiter an und liefert die neu vergebene <b>MitarbeiterID<\/b> &uuml;ber den Output-Parameter <b>@IDNEW<\/b> zur&uuml;ck. Wir verwenden daf&uuml;r die Funktion <b>SCOPE_IDENTITY<\/b>, die den zuletzt in der aktuellen Sitzung und im aktuellen G&uuml;ltigkeitsbereich erzeugten Autowert liefert (siehe Listing 2).<\/p>\n<pre>CREATE PROCEDURE [dbo].[spMitarbeiterInsert]\r\n    @AbteilungID    INT,\r\n    @Vorname        NVARCHAR(100),\r\n    @Nachname       NVARCHAR(100),\r\n    @Email          NVARCHAR(255) = NULL,\r\n    @Eintrittsdatum DATE          = NULL,\r\n    @Gehalt         DECIMAL(10,2) = NULL,\r\n    @IDNEW          INT          = -1 OUTPUT\r\nAS\r\nSET NOCOUNT ON\r\nINSERT INTO tblMitarbeiter (AbteilungID,\r\n    Vorname, Nachname, Email,\r\n    Eintrittsdatum, Gehalt)\r\nVALUES (@AbteilungID, @Vorname, @Nachname,\r\n    @Email, @Eintrittsdatum, @Gehalt)\r\nSET @IDNEW = SCOPE_IDENTITY()<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Gespeicherte Prozedur zum Anlegen eines Mitarbeiters<\/span><\/b><\/p>\n<p>Die Prozedur <b>spMitarbeiterUpdate<\/b> aktualisiert einen bestehenden Datensatz und liefert &uuml;ber <b>@RowsAffected<\/b> zur&uuml;ck, wie viele Datens&auml;tze betroffen waren (siehe Listing 3).<\/p>\n<pre>CREATE PROCEDURE [dbo].[spMitarbeiterUpdate]\r\n    @MitarbeiterID  INT,\r\n    @AbteilungID    INT,\r\n    @Vorname        NVARCHAR(100),\r\n    @Nachname       NVARCHAR(100),\r\n    @Email          NVARCHAR(255)   = NULL,\r\n    @Eintrittsdatum DATE            = NULL,\r\n    @Gehalt         DECIMAL(10,2)   = NULL,\r\n    @RowsAffected   INT             = 0 OUTPUT\r\nAS\r\nSET NOCOUNT ON\r\nUpdate tblMitarbeiter\r\nSET    AbteilungID    = @AbteilungID,\r\n       Vorname        = @Vorname,\r\n       Nachname       = @Nachname,\r\n       Email          = @Email,\r\n       Eintrittsdatum = @Eintrittsdatum,\r\n       Gehalt         = @Gehalt\r\nWHERE  MitarbeiterID  = @MitarbeiterID\r\nSET @RowsAffected = @@ROWCOUNT<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Gespeicherte Prozedur zum Aktualsiieren eines Mitarbeiters<\/span><\/b><\/p>\n<p>Die Prozedur <b>spMitarbeiterDelete<\/b> schlie&szlig;lich l&ouml;scht einen Datensatz und liefert ebenfalls <b>@RowsAffected<\/b> zur&uuml;ck. Den Wert f&uuml;r <b>@@ROWCOUNT<\/b> greifen wir in beiden F&auml;llen direkt im Anschluss an die <b>UPDATE<\/b>&#8211; beziehungsweise <b>DELETE<\/b>-Anweisung ab, bevor eine andere Anweisung diesen Wert &uuml;berschreibt (siehe Listing 4).<\/p>\n<pre>CREATE PROCEDURE [dbo].[spMitarbeiterDelete]\r\n    @MitarbeiterID  INT,\r\n    @RowsAffected   INT = 0 OUTPUT\r\nAS\r\nSET NOCOUNT ON\r\nDELETE FROM tblMitarbeiter\r\nWHERE MitarbeiterID = @MitarbeiterID\r\nSET @RowsAffected = @@ROWCOUNT<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Gespeicherte Prozedur zum L&ouml;schen eines Mitarbeiters<\/span><\/b><\/p>\n<h2>Warum ein Wrapper?<\/h2>\n<p>Der direkte Aufruf einer gespeicherten Prozedur per ADODB sieht &uuml;blicherweise so aus: Du erzeugst ein <b>Connection<\/b>-Objekt, &ouml;ffnest es mit einer Verbindungszeichenfolge, erzeugst ein <b>Command<\/b>-Objekt, weist diesem die Verbindung zu, setzt den Namen der Prozedur als <b>CommandText<\/b> und den <b>CommandType<\/b> auf <b>adCmdStoredProc<\/b>. Danach legst Du per <b>CreateParameter<\/b> jeden einzelnen Parameter an, weist ihm einen Wert zu und h&auml;ngst ihn an die <b>Parameters<\/b>-Auflistung des <b>Command<\/b>-Objekts an. Erst dann kannst Du <b>Execute<\/b> aufrufen.<\/p>\n<p>Wie das im Einzelnen aussieht, haben wir bereits im Artikel <b>ADODB: Gespeicherte Prozeduren ausf&uuml;hren<\/b>(<b>www.vbentwickler.de\/ 503<\/b>) beschrieben.<\/p>\n<p>Macht man das f&uuml;r vier Prozeduren, vervierfacht sich dieser Code. Macht man es f&uuml;r 40 Prozeduren, hat man sehr viel Schreibarbeit und sehr viele Stellen, an denen Tippfehler passieren k&ouml;nnen. Ein Wrapper-Modul erledigt diese immer gleiche Arbeit genau einmal und stellt den Aufruf als kurze Funktion zur Verf&uuml;gung. Der Aufruf einer Prozedur sieht damit so aus:<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> rst = ADODB_GetRecordset( _\r\n    \"spMitarbeiterSelectNachMitarbeiterID\", 5)<\/pre>\n<p>Eine Zeile &#8211; und Du erh&auml;ltst das Recordset f&uuml;r den Mitarbeiter mit der ID <b>5<\/b>. Das ist das Ziel.<\/p>\n<h2>Die Verbindungsfunktion<\/h2>\n<p>Den ganzen Code unseres Wrappers packen wir in das Modul <b>mdlADODB_Parameter<\/b>. Als Erstes definieren wir oben im Modul einige Konstanten mit den Verbindungsdaten. Diese legen wir als <b>Private Const<\/b> an, damit sie nur innerhalb des Moduls sichtbar sind. In einer produktiven Anwendung w&uuml;rdest Du diese Werte vermutlich aus einer Konfigurationstabelle oder aus der Registry lesen, aber f&uuml;r unser Beispiel reicht die L&ouml;sung als Konstanten.<\/p>\n<pre><span style=\"color:blue;\">Option Compare Database<\/span>\r\n<span style=\"color:blue;\">Option Explicit<\/span>\r\n<span style=\"color:blue;\">Private <\/span>Const strServer<span style=\"color:blue;\"> As String<\/span> = \"Dein Server\"\r\n<span style=\"color:blue;\">Private <\/span>Const strDatabase<span style=\"color:blue;\"> As String<\/span> = \"Deine Datenbank\"\r\n<span style=\"color:blue;\">Private <\/span>Const blnUseSSPI<span style=\"color:blue;\"> As Boolean<\/span> = <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">Private <\/span>Const strUsr<span style=\"color:blue;\"> As String<\/span> = \"\"\r\n<span style=\"color:blue;\">Private <\/span>Const strPwd<span style=\"color:blue;\"> As String<\/span> = \"\"<\/pre>\n<p>Die Funktion <b>ADODB_GetConnection<\/b> baut aus diesen Konstanten eine Verbindungszeichenfolge zusammen und &ouml;ffnet eine neue <b>ADODB.Connection<\/b> (siehe Listing 5).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>ADODB_GetConnection()<span style=\"color:blue;\"> As <\/span>ADODB.Connection\r\n    <span style=\"color:blue;\">Dim <\/span>strConnection<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>cnn<span style=\"color:blue;\"> As <\/span>ADODB.Connection\r\n    <span style=\"color:blue;\">On Error GoTo<\/span> ErrHandler\r\n    <span style=\"color:blue;\">Set<\/span> cnn = <span style=\"color:blue;\">New<\/span> ADODB.Connection\r\n    <span style=\"color:blue;\">If <\/span>blnUseSSPI<span style=\"color:blue;\"> Then<\/span>\r\n        strConnection = \"Provider=MSOLEDBSQL;Data Source=\" & strServer & \";Initial Catalog=\" _\r\n            & strDatabase & \";Integrated Security=SSPI;\"\r\n    <span style=\"color:blue;\">Else<\/span>\r\n        strConnection = \"Provider=MSOLEDBSQL;Data Source=\" & strServer & \";Initial Catalog=\" _\r\n            & strDatabase & \";User ID=\" & strUsr & \";Password=\" & strPwd & \";\"\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    cnn.Open strConnection\r\n    <span style=\"color:blue;\">Set<\/span> ADODB_GetConnection = cnn\r\n    <span style=\"color:blue;\">Exit Function<\/span>\r\nErrHandler:\r\n    <span style=\"color:blue;\">MsgBox<\/span> \"Fehler in ADODB_Connection:\" & <span style=\"color:blue;\">vbCrLf<\/span> & Err.Description, <span style=\"color:blue;\">vbCr<\/span>itical, \"DB Connection\"\r\n    <span style=\"color:blue;\">Set<\/span> ADODB_GetConnection = Nothing\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Verbindung zum SQL Server herstellen<\/span><\/b><\/p>\n<p>&Uuml;ber die Konstante <b>blnUseSSPI<\/b> steuern wir, ob die Verbindung per Windows-Authentifizierung (<b>Integrated Security=SSPI<\/b>) oder per SQL Server-Authentifizierung mit Benutzername und Kennwort aufgebaut wird:<\/p>\n<p>Als Provider verwenden wir <b>MSOLEDBSQL<\/b>, den aktuellen OLE DB-Treiber f&uuml;r den SQL Server. Im Fehlerfall zeigen wir eine Meldung an und liefern <b>Nothing<\/b> zur&uuml;ck, damit der aufrufende Code pr&uuml;fen kann, ob die Verbindung erfolgreich war.<\/p>\n<h2>Die Helferfunktion ADODB_BuildCommand<\/h2>\n<p>Der Kern des Wrappers steckt in der Funktion <b>ADODB_BuildCommand<\/b> (siehe Listing 6). Sie ist als <b>Private<\/b> deklariert, weil sie nur intern von den &ouml;ffentlichen Funktionen aufgerufen wird. Ihre Aufgabe ist es, ein <b>Command<\/b>-Objekt zu erzeugen, ihm die Verbindung und den Prozedurnamen zuzuweisen und anschlie&szlig;end die Werte aus einem Parameter-Array automatisch in die Parameter der gespeicherten Prozedur zu kopieren.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>ADODB_BuildCommand(ByVal strProcedure<span style=\"color:blue;\"> As String<\/span>, ByRef varParameters<span style=\"color:blue;\"> As Variant<\/span>)<span style=\"color:blue;\"> As <\/span>ADODB.Command\r\n    <span style=\"color:blue;\">Dim <\/span>cmd<span style=\"color:blue;\"> As <\/span>ADODB.Command\r\n    <span style=\"color:blue;\">Dim <\/span>intParameter<span style=\"color:blue;\"> As Integer<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngCurrentParameter<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngMaxIndex<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Set<\/span> cmd = <span style=\"color:blue;\">New<\/span> ADODB.Command\r\n    cmd.ActiveConnection = ADODB_GetConnection\r\n    cmd.CommandText = strProcedure\r\n    cmd.CommandType = adCmdStoredProc\r\n    cmd.Parameters.Refresh\r\n    On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n    lngMaxIndex = <span style=\"color:blue;\">UBound<\/span>(varParameters)\r\n    <span style=\"color:blue;\">If <\/span>Err.Number &lt;&gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n        lngMaxIndex = -1\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n    lngCurrentParameter = 0\r\n    For intParameter = 1 To cmd.Parameters.Count - 1\r\n        If cmd.Parameters(intParameter).Direction = adParamInput _\r\n                Or cmd.Parameters(intParameter).Direction = adParamInputOutput Then\r\n            <span style=\"color:blue;\">If <\/span>lngCurrentParameter &lt;= lngMaxIndex<span style=\"color:blue;\"> Then<\/span>\r\n                <span style=\"color:blue;\">If <\/span>IsNull(varParameters(lngCurrentParameter))<span style=\"color:blue;\"> Then<\/span>\r\n                    cmd.Parameters(intParameter).Value = Null\r\n                <span style=\"color:blue;\">Else<\/span>\r\n                    cmd.Parameters(intParameter).Value = varParameters(lngCurrentParameter)\r\n                <span style=\"color:blue;\">End If<\/span>\r\n                lngCurrentParameter = lngCurrentParameter + 1\r\n            <span style=\"color:blue;\">End If<\/span>\r\n        <span style=\"color:blue;\">End If<\/span>\r\n    <span style=\"color:blue;\">Next<\/span> intParameter\r\n    <span style=\"color:blue;\">Set<\/span> ADODB_BuildCommand = cmd\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Command-Objekt bauen und Parameter f&uuml;llen<\/span><\/b><\/p>\n<p>Damit das funktioniert, m&uuml;ssen wir die Parameter-Definitionen der Prozedur kennen. Statt sie m&uuml;hsam per Hand anzulegen, lassen wir ADODB diese Arbeit &uuml;bernehmen. Die Methode <b>Parameters.Refresh<\/b> fragt die Parameter-Informationen direkt vom SQL Server ab. Danach sind alle Parameter mit dem richtigen Datentyp, der richtigen L&auml;nge und der richtigen Richtung (Input, Output oder beides) bereits angelegt &#8211; wir m&uuml;ssen nur noch die Werte zuweisen.<\/p>\n<p>Schauen wir uns die Logik der Funktion im Detail an. Nach dem Anlegen des <b>Command<\/b>-Objekts weisen wir die Verbindung zu, setzen den Prozedurnamen und legen <b>CommandType<\/b> auf <b>adCmdStoredProc<\/b> fest. Der Aufruf von <b>Parameters.Refresh<\/b> fragt die Parameterdefinitionen beim SQL Server ab und f&uuml;llt die <b>Parameters<\/b>-Auflistung des <b>Command<\/b>-Objekts.<\/p>\n<p>Danach ermitteln wir mit <b>UBound<\/b> den h&ouml;chsten Index des Parameter-Arrays. Das kann fehlschlagen, wenn das Array leer ist &#8211; deshalb kapseln wir die Zuweisung mit <b>On Error Resume Next<\/b> und setzen <b>lngMaxIndex<\/b> im Fehlerfall auf <b>-1<\/b>. So stellen wir sicher, dass die nachfolgende Schleife auch bei leeren Parameter-Arrays sauber durchl&auml;uft.<\/p>\n<p>In der <b>For<\/b>-Schleife beginnen wir mit Index <b>1<\/b>, nicht mit <b>0<\/b>. Das liegt daran, dass ADODB beim Refresh an Position <b>0<\/b> immer einen impliziten Parameter mit dem Namen <b>@RETURN_VALUE<\/b> f&uuml;r den R&uuml;ckgabewert der Prozedur anlegt. Den brauchen wir hier nicht und &uuml;berspringen ihn daher.<\/p>\n<p>Innerhalb der Schleife pr&uuml;fen wir die Richtung jedes Parameters. Nur Input- und Input-Output-Parameter erhalten einen Wert aus unserem Array &#8211; reine Output-Parameter werden vom SQL Server selbst gef&uuml;llt und d&uuml;rfen nicht &uuml;berschrieben werden. Die Variable <b>lngCurrentParameter<\/b> z&auml;hlt dabei, der wievielte Input-Parameter gerade verarbeitet wird. So kannst Du beim Aufruf einfach die Werte in der Reihenfolge der Eingabe-Parameter &uuml;bergeben, ohne Output-Parameter mitz&auml;hlen zu m&uuml;ssen.<\/p>\n<p>F&uuml;r den Fall, dass ein Wert im Array <b>Null<\/b> ist, weisen wir explizit <b>Null<\/b> zu. Das ist wichtig, weil <b>Null<\/b>-Werte in VBA auf dem Weg durch Parameter-Arrays schon einmal zu <b>Empty<\/b> umgedeutet werden und der SQL Server mit <b>Empty<\/b> nichts anfangen kann.<\/p>\n<h2>SELECT: Recordset abrufen<\/h2>\n<p>Mit der Helferfunktion als Werkzeug werden die eigentlichen CRUD-Funktionen zu kurzen, &uuml;bersichtlichen Routinen. Die Funktion <b>ADODB_GetRecordset<\/b> ist f&uuml;r <b>SELECT<\/b>-Prozeduren zust&auml;ndig. Sie nimmt den Prozedurnamen sowie eine beliebige Anzahl von Parametern entgegen, l&auml;sst die Helferfunktion das <b>Command<\/b>-Objekt bauen und &ouml;ffnet darauf ein Recordset (siehe Listing 7).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>ADODB_GetRecordset(ByVal strProcedure<span style=\"color:blue;\"> As String<\/span>, ParamArray arrParameters()<span style=\"color:blue;\"> As Variant<\/span>) _\r\n       <span style=\"color:blue;\"> As <\/span>ADODB.Recordset\r\n    <span style=\"color:blue;\">Dim <\/span>cmd<span style=\"color:blue;\"> As <\/span>ADODB.Command\r\n    <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>ADODB.Recordset\r\n    <span style=\"color:blue;\">Dim <\/span>varParameters<span style=\"color:blue;\"> As Variant<\/span>\r\n    <span style=\"color:blue;\">On Error GoTo<\/span> ErrHandler\r\n    varParameters = arrParameters\r\n    <span style=\"color:blue;\">Set<\/span> cmd = ADODB_BuildCommand(strProcedure, varParameters)\r\n    <span style=\"color:blue;\">Set<\/span> rst = <span style=\"color:blue;\">New<\/span> ADODB.Recordset\r\n    rst.CursorLocation = adUseClient\r\n    rst.Open cmd, , adOpenStatic, adLockOptimistic\r\n    rst.ActiveConnection = Nothing\r\n    <span style=\"color:blue;\">Set<\/span> ADODB_GetRecordset = rst\r\n    <span style=\"color:blue;\">Exit Function<\/span>\r\nErrHandler:\r\n    <span style=\"color:blue;\">MsgBox<\/span> \"Fehler in ADODB_GetRecordset [\" & strProcedure & \"]:\" & <span style=\"color:blue;\">vbCrLf<\/span> & Err.Description, <span style=\"color:blue;\">vbCr<\/span>itical, _\r\n        \"Fehler in ADODB_GetRecordset\"\r\n    <span style=\"color:blue;\">Set<\/span> ADODB_GetRecordset = Nothing\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Recordset per gespeicherter Prozedur abrufen<\/span><\/b><\/p>\n<p>Drei Details sind an dieser Funktion erw&auml;hnenswert. Erstens verwenden wir <b>ParamArray<\/b>, damit der Aufrufer eine beliebige Anzahl Parameter &uuml;bergeben kann. Das Array <b>arrParameters<\/b> weisen wir einer <b>Variant<\/b>-Variablen zu &#8211; das macht die Weitergabe an die Helferfunktion deutlich einfacher. Zweitens setzen wir <b>CursorLocation<\/b> auf <b>adUseClient<\/b>. Das sorgt daf&uuml;r, dass das Recordset lokal im Arbeitsspeicher gehalten wird &#8211; Voraussetzung f&uuml;r die dritte Besonderheit.<\/p>\n<p>Drittens setzen wir <b>ActiveConnection<\/b> nach dem &Ouml;ffnen auf <b>Nothing<\/b>. Damit trennen wir das Recordset von der Verbindung und k&ouml;nnen es als eigenst&auml;ndiges, bearbeitbares Recordset einem Formular oder einem Kombinationsfeld als Datenquelle zuweisen. Die Verbindung zum SQL Server ist also nur so lange offen, wie das Recordset gef&uuml;llt wird.<\/p>\n<h2>INSERT: Neuen Datensatz anlegen<\/h2>\n<p>Die Funktion <b>ADODB_ExecInsert<\/b> ruft eine <b>INSERT<\/b>-Prozedur auf und liefert die neu vergebene ID zur&uuml;ck. Sie setzt voraus, dass die aufgerufene Prozedur einen Output-Parameter mit dem Namen <b>@IDNEW<\/b> besitzt &#8211; was bei unserer <b>spMitarbeiterInsert<\/b> genau so ist (siehe Listing 8).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>ADODB_ExecInsert(ByVal strProcedure<span style=\"color:blue;\"> As String<\/span>, ParamArray arrParameters()<span style=\"color:blue;\"> As Variant<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>cmd<span style=\"color:blue;\"> As <\/span>ADODB.Command\r\n    <span style=\"color:blue;\">Dim <\/span>varParameters<span style=\"color:blue;\"> As Variant<\/span>\r\n    <span style=\"color:blue;\">On Error GoTo<\/span> ErrHandler\r\n    varParameters = arrParameters\r\n    <span style=\"color:blue;\">Set<\/span> cmd = ADODB_BuildCommand(strProcedure, varParameters)\r\n    cmd.Execute\r\n    ADODB_ExecInsert = CLng(Nz(cmd.Parameters(\"@IDNEW\").Value, -1))\r\n    <span style=\"color:blue;\">Exit Function<\/span>\r\nErrHandler:\r\n    <span style=\"color:blue;\">MsgBox<\/span> \"Fehler in ADODB_ExecInsert [\" & strProcedure & \"]:\" & <span style=\"color:blue;\">vbCrLf<\/span> & Err.Description, <span style=\"color:blue;\">vbCr<\/span>itical, _\r\n        \"Fehler in ADODB_ExecInsert\"\r\n    ADODB_ExecInsert = -1\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: INSERT-Prozedur ausf&uuml;hren<\/span><\/b><\/p>\n<p>Nach dem <b>Execute<\/b>-Aufruf greifen wir auf den Output-Parameter <b>@IDNEW<\/b> zu und liefern dessen Wert als <b>Long<\/b> zur&uuml;ck. Die <b>Nz<\/b>-Funktion ersetzt einen eventuellen <b>Null<\/b>-Wert durch <b>-1<\/b> &#8211; so signalisiert die Funktion im Fehlerfall eindeutig, dass kein Datensatz angelegt wurde.<\/p>\n<h2>UPDATE und DELETE<\/h2>\n<p>Die Funktionen <b>ADODB_ExecUpdate<\/b> und <b>ADODB_ExecDelete<\/b> sind nahezu identisch aufgebaut. Beide erwarten, dass die aufgerufene Prozedur einen Output-Parameter <b>@RowsAffected<\/b> zur&uuml;ckliefert, und geben dessen Wert als <b>Long<\/b> zur&uuml;ck. So wei&szlig; der aufrufende Code, wie viele Datens&auml;tze tats&auml;chlich ge&auml;ndert oder gel&ouml;scht wurden (siehe Listing 9).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>ADODB_ExecUpdate(ByVal strProcedure<span style=\"color:blue;\"> As String<\/span>, ParamArray arrParameters()<span style=\"color:blue;\"> As Variant<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>cmd<span style=\"color:blue;\"> As <\/span>ADODB.Command\r\n    <span style=\"color:blue;\">Dim <\/span>varParameters<span style=\"color:blue;\"> As Variant<\/span>\r\n    <span style=\"color:blue;\">On Error GoTo<\/span> ErrHandler\r\n    varParameters = arrParameters\r\n    <span style=\"color:blue;\">Set<\/span> cmd = ADODB_BuildCommand(strProcedure, varParameters)\r\n    cmd.Execute\r\n    ADODB_ExecUpdate = CLng(Nz(cmd.Parameters(\"@RowsAffected\").Value, 0))\r\n    <span style=\"color:blue;\">Exit Function<\/span>\r\nErrHandler:\r\n    <span style=\"color:blue;\">MsgBox<\/span> \"Fehler in ADODB_ExecUpdate [\" & strProcedure & \"]:\" & <span style=\"color:blue;\">vbCrLf<\/span> & Err.Description, <span style=\"color:blue;\">vbCr<\/span>itical, _\r\n        \"Fehler in ADODB_ExecUpdate\"\r\n    ADODB_ExecUpdate = -1\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: UPDATE-Prozedur ausf&uuml;hren<\/span><\/b><\/p>\n<p>Die Funktion <b>ADODB_ExecDelete<\/b> unterscheidet sich von <b>ADODB_ExecUpdate<\/b> nur in den Bezeichnern innerhalb der Fehlermeldungen, die Logik ist identisch (siehe Listing 10).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>ADODB_ExecDelete(ByVal strProcedure<span style=\"color:blue;\"> As String<\/span>, ParamArray arrParameters()<span style=\"color:blue;\"> As Variant<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>cmd<span style=\"color:blue;\"> As <\/span>ADODB.Command\r\n    <span style=\"color:blue;\">Dim <\/span>varParameters  <span style=\"color:blue;\"> As Variant<\/span>\r\n    <span style=\"color:blue;\">On Error GoTo<\/span> ErrHandler\r\n    varParameters = arrParameters\r\n    <span style=\"color:blue;\">Set<\/span> cmd = ADODB_BuildCommand(strProcedure, varParameters)\r\n    cmd.Execute\r\n    ADODB_ExecDelete = CLng(Nz(cmd.Parameters(\"@RowsAffected\").Value, 0))\r\n    <span style=\"color:blue;\">Exit Function<\/span>\r\nErrHandler:\r\n    <span style=\"color:blue;\">MsgBox<\/span> \"Fehler in ADODB_ExecDelete [\" & strProcedure & \"]:\" & <span style=\"color:blue;\">vbCrLf<\/span> & Err.Description, <span style=\"color:blue;\">vbCr<\/span>itical, _\r\n        \"Fehler in ADODB_ExecDelete\"\r\n    ADODB_ExecDelete = -1\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 10: DELETE-Prozedur ausf&uuml;hren<\/span><\/b><\/p>\n<h2>Generische Ausf&uuml;hrung mit ADODB_ExecProc<\/h2>\n<p>Nicht jede Prozedur gibt genau einen Output-Parameter mit dem Namen <b>@IDNEW<\/b> oder <b>@RowsAffected<\/b> zur&uuml;ck. Manche Prozeduren liefern mehrere Output-Werte, manche geben vielleicht auch einen <b>@ReturnValue<\/b> zur&uuml;ck. F&uuml;r solche F&auml;lle gibt es die Funktion <b>ADODB_ExecProc<\/b>, die das komplette <b>Command<\/b>-Objekt nach der Ausf&uuml;hrung zur&uuml;ckliefert (siehe Listing 11).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>ADODB_ExecProc(ByVal strProcedure<span style=\"color:blue;\"> As String<\/span>, ParamArray arrParameters()<span style=\"color:blue;\"> As Variant<\/span>)<span style=\"color:blue;\"> As <\/span>ADODB.Command\r\n    <span style=\"color:blue;\">Dim <\/span>cmd<span style=\"color:blue;\"> As <\/span>ADODB.Command\r\n    <span style=\"color:blue;\">Dim <\/span>varParameters<span style=\"color:blue;\"> As Variant<\/span>\r\n    <span style=\"color:blue;\">On Error GoTo<\/span> ErrHandler\r\n    varParameters = arrParameters\r\n    <span style=\"color:blue;\">Set<\/span> cmd = ADODB_BuildCommand(strProcedure, varParameters)\r\n    cmd.Execute\r\n    <span style=\"color:blue;\">Set<\/span> ADODB_ExecProc = cmd\r\n    <span style=\"color:blue;\">Exit Function<\/span>\r\nErrHandler:\r\n    <span style=\"color:blue;\">MsgBox<\/span> \"Fehler in ADODB_ExecProc [\" & strProcedure & \"]:\" & <span style=\"color:blue;\">vbCrLf<\/span> & Err.Description, <span style=\"color:blue;\">vbCr<\/span>itical, _\r\n        \"Fehler in ADODB_ExecProc\"\r\n    <span style=\"color:blue;\">Set<\/span> ADODB_ExecProc = Nothing\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 11: Generische Ausf&uuml;hrung einer Prozedur<\/span><\/b><\/p>\n<p>Mit dem zur&uuml;ckgegebenen <b>Command<\/b>-Objekt kannst Du auf beliebige Output-Parameter zugreifen, etwa so:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>cmd<span style=\"color:blue;\"> As <\/span>ADODB.Command\r\n<span style=\"color:blue;\">Set<\/span> cmd = ADODB_ExecProc( _\r\n    \"spIrgendeineProzedur\", 42)\r\n<span style=\"color:blue;\">Debug.Print<\/span> cmd.Parameters(\"@Ergebnis\").Value<\/pre>\n<h2>Tests im Direktbereich<\/h2>\n<p>F&uuml;r den schnellen Funktionscheck legen wir im Modul noch vier kleine Testprozeduren an. Die folgende zeigt die Verwendung von <b>ADODB_GetRecordset<\/b> mit einem Parameter:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_ADODB_GetRecordset()\r\n    <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>ADODB.Recordset\r\n    <span style=\"color:blue;\">Set<\/span> rst = ADODB_GetRecordset( _\r\n        \"spMitarbeiterSelectNachMitarbeiterID\", 1)\r\n    <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n        <span style=\"color:blue;\">Debug.Print<\/span> rst!MitarbeiterID, rst!Vorname, _\r\n            rst!Nachname\r\n        rst.Move<span style=\"color:blue;\">Next<\/span>\r\n    <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Der Aufruf liefert nur den Mitarbeiter mit der ID <b>1<\/b>. L&auml;sst Du den Parameter weg, also <b>ADODB_GetRecordset(&#8220;spMitarbeiterSelectNachMitarbeiterID&#8221;)<\/b>, bekommst Du alle Mitarbeiter &#8211; weil die gespeicherte Prozedur den Parameter <b>@MitarbeiterID<\/b> mit einem Standardwert von <b>NULL<\/b> definiert und in diesem Fall die Bedingung <b>@MitarbeiterID IS NULL<\/b> greift.<\/p>\n<p>Die restlichen drei Testprozeduren zeigen analog die Verwendung der anderen Funktionen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_ADODB_ExecInsert()\r\n    <span style=\"color:blue;\">Debug.Print<\/span> ADODB_ExecInsert( _\r\n        \"spAbteilungInsert\", \"Neue Abteilung\")\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Public Sub <\/span>Test_ADODB_ExecUpdate()\r\n    <span style=\"color:blue;\">Debug.Print<\/span> ADODB_ExecUpdate(\"spAbteilungUpdate\", 7, _\r\n        \"Neue Abteilung 2\")\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Public Sub <\/span>Test_ADODB_ExecDelete()\r\n    <span style=\"color:blue;\">Debug.Print<\/span> ADODB_ExecDelete(\"spAbteilungDelete\", 7)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Artikel zeigt einfache Aufrufe von gespeicherten Prozeduren per VBA f&uuml;r die g&auml;ngigen CRUD-Zugriffe.<\/p>\n<p>In einem weiteren Artikel namens <b>ADODB: Formulare mit gespeicherten Prozeduren <\/b>(<b>www.vbentwickler.de\/506<\/b>) zeigen wir, wie man diese Funktionen f&uuml;r die Anzeige und Verarbeitung in Formularen nutzen kann.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>ADODB_GespeicherteProzedurenEinfachAufrufen.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/230E31F5-DA8C-45CA-9785-F2747DCC26C4\/vbe_505.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wer Daten zwischen einer Access-Anwendung und einem SQL Server austauscht, landet fr&uuml;her oder sp&auml;ter bei gespeicherten Prozeduren. Sie kapseln die Datenbanklogik serverseitig, liefern bessere Performance als dynamisch zusammengebautes SQL und lassen sich sauber rechtebasiert absichern. Der Aufruf per ADODB erfordert allerdings jedes Mal eine ganze Reihe gleicher Schritte: Verbindung &ouml;ffnen, Command-Objekt erzeugen, CommandType setzen, Parameter definieren, Werte zuweisen, Prozedur ausf&uuml;hren, Ergebnis auslesen. Schreibt man das f&uuml;r jede Prozedur neu, w&auml;chst der Code schnell zu un&uuml;bersichtlichen Ausma&szlig;en an. In diesem Artikel bauen wir ein kleines Wrapper-Modul, das diese Arbeit einmalig erledigt. Anschlie&szlig;end kannst Du jede gespeicherte Prozedur mit einer einzigen Zeile Code aufrufen &#8211; inklusive Parameter&uuml;bergabe und R&uuml;ckgabewert. Als praktisches Beispiel binden wir den Wrapper an ein vollst&auml;ndiges Mitarbeiter-Formular mit allen vier CRUD-Operationen an.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662026,66032026,44000008],"tags":[],"yst_prominent_words":[],"class_list":["post-55000505","post","type-post","status-publish","format-standard","hentry","category-662026","category-66032026","category-Datenzugriffstechnik"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"Wer Daten zwischen einer Access-Anwendung und einem SQL Server austauscht, landet fr\u00fcher oder sp\u00e4ter bei gespeicherten Prozeduren. Sie kapseln die Datenbanklogik serverseitig, liefern bessere Performance als dynamisch zusammengebautes SQL und lassen sich sauber rechtebasiert absichern. Der Aufruf per ADODB erfordert allerdings jedes Mal eine ganze Reihe gleicher Schritte: Verbindung \u00f6ffnen, Command-Objekt erzeugen, CommandType setzen, Parameter definieren, Werte zuweisen, Prozedur ausf\u00fchren, Ergebnis auslesen. Schreibt man das f\u00fcr jede Prozedur neu, w\u00e4chst der Code schnell zu un\u00fcbersichtlichen Ausma\u00dfen an. In diesem Artikel bauen wir ein kleines Wrapper-Modul, das diese Arbeit einmalig erledigt. Anschlie\u00dfend kannst Du jede gespeicherte Prozedur mit einer einzigen Zeile Code aufrufen - inklusive Parameter\u00fcbergabe und R\u00fcckgabewert. Als praktisches Beispiel binden wir den Wrapper an ein vollst\u00e4ndiges Mitarbeiter-Formular mit allen vier CRUD-Operationen an.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Andr\u00e9 Minhorst\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/vbentwickler.de\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Visual Basic Entwickler - Das Magazin f\u00fcr Datenbankentwickler auf Basis von Visual Studio und Co.\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"ADODB: Access-Wrapper f\u00fcr gespeicherte Prozeduren - Visual Basic Entwickler\" \/>\n\t\t<meta property=\"og:description\" content=\"Wer Daten zwischen einer Access-Anwendung und einem SQL Server austauscht, landet fr\u00fcher oder sp\u00e4ter bei gespeicherten Prozeduren. Sie kapseln die Datenbanklogik serverseitig, liefern bessere Performance als dynamisch zusammengebautes SQL und lassen sich sauber rechtebasiert absichern. Der Aufruf per ADODB erfordert allerdings jedes Mal eine ganze Reihe gleicher Schritte: Verbindung \u00f6ffnen, Command-Objekt erzeugen, CommandType setzen, Parameter definieren, Werte zuweisen, Prozedur ausf\u00fchren, Ergebnis auslesen. Schreibt man das f\u00fcr jede Prozedur neu, w\u00e4chst der Code schnell zu un\u00fcbersichtlichen Ausma\u00dfen an. In diesem Artikel bauen wir ein kleines Wrapper-Modul, das diese Arbeit einmalig erledigt. Anschlie\u00dfend kannst Du jede gespeicherte Prozedur mit einer einzigen Zeile Code aufrufen - inklusive Parameter\u00fcbergabe und R\u00fcckgabewert. Als praktisches Beispiel binden wir den Wrapper an ein vollst\u00e4ndiges Mitarbeiter-Formular mit allen vier CRUD-Operationen an.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/vbentwickler.de\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/datenbankentwickler.net\/wp-content\/uploads\/2022\/08\/cropped-header_vbe-1.png\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/datenbankentwickler.net\/wp-content\/uploads\/2022\/08\/cropped-header_vbe-1.png\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-07-28T15:01:21+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"-001-11-30T00:00:00+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"ADODB: Access-Wrapper f\u00fcr gespeicherte Prozeduren - Visual Basic Entwickler\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Wer Daten zwischen einer Access-Anwendung und einem SQL Server austauscht, landet fr\u00fcher oder sp\u00e4ter bei gespeicherten Prozeduren. Sie kapseln die Datenbanklogik serverseitig, liefern bessere Performance als dynamisch zusammengebautes SQL und lassen sich sauber rechtebasiert absichern. Der Aufruf per ADODB erfordert allerdings jedes Mal eine ganze Reihe gleicher Schritte: Verbindung \u00f6ffnen, Command-Objekt erzeugen, CommandType setzen, Parameter definieren, Werte zuweisen, Prozedur ausf\u00fchren, Ergebnis auslesen. Schreibt man das f\u00fcr jede Prozedur neu, w\u00e4chst der Code schnell zu un\u00fcbersichtlichen Ausma\u00dfen an. In diesem Artikel bauen wir ein kleines Wrapper-Modul, das diese Arbeit einmalig erledigt. Anschlie\u00dfend kannst Du jede gespeicherte Prozedur mit einer einzigen Zeile Code aufrufen - inklusive Parameter\u00fcbergabe und R\u00fcckgabewert. Als praktisches Beispiel binden wir den Wrapper an ein vollst\u00e4ndiges Mitarbeiter-Formular mit allen vier CRUD-Operationen an.\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/datenbankentwickler.net\/wp-content\/uploads\/2022\/08\/cropped-header_vbe-1.png\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\\\/#blogposting\",\"name\":\"ADODB: Access-Wrapper f\\u00fcr gespeicherte Prozeduren - Visual Basic Entwickler\",\"headline\":\"ADODB: Access-Wrapper f&uuml;r gespeicherte Prozeduren\",\"author\":{\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/author\\\/andreminhorst-com\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/1bc6898d1c5040a5a263c88a3fa8ff70\",\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\\\/#articleImage\"},\"datePublished\":\"2026-06-01T00:00:00+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\",\"inLanguage\":\"de-DE\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\\\/#webpage\"},\"articleSection\":\"2026, 3\\\/2026, Datenzugriffstechnik\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/vbentwickler.de#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vbentwickler.de\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/category\\\/2026\\\/#listItem\",\"name\":\"2026\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/category\\\/2026\\\/#listItem\",\"position\":2,\"name\":\"2026\",\"item\":\"https:\\\/\\\/vbentwickler.de\\\/category\\\/2026\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/category\\\/2026\\\/3\\\/2026\\\/#listItem\",\"name\":\"3\\\/2026\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/vbentwickler.de#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/category\\\/2026\\\/3\\\/2026\\\/#listItem\",\"position\":3,\"name\":\"3\\\/2026\",\"item\":\"https:\\\/\\\/vbentwickler.de\\\/category\\\/2026\\\/3\\\/2026\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\\\/#listItem\",\"name\":\"ADODB: Access-Wrapper f&uuml;r gespeicherte Prozeduren\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/category\\\/2026\\\/#listItem\",\"name\":\"2026\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\\\/#listItem\",\"position\":4,\"name\":\"ADODB: Access-Wrapper f&uuml;r gespeicherte Prozeduren\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/category\\\/2026\\\/3\\\/2026\\\/#listItem\",\"name\":\"3\\\/2026\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/#organization\",\"name\":\"Datenbankentwickler\",\"description\":\"Das Magazin f\\u00fcr Datenbankentwickler auf Basis von Visual Studio und Co.\",\"url\":\"https:\\\/\\\/vbentwickler.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/vbentwickler.de\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/cropped-header_vbe-1.png\",\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\\\/#organizationLogo\",\"width\":664,\"height\":225},\"image\":{\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\\\/#organizationLogo\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/author\\\/andreminhorst-com\\\/#author\",\"url\":\"https:\\\/\\\/vbentwickler.de\\\/author\\\/andreminhorst-com\\\/\",\"name\":\"Andr\\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Andr\\u00e9 Minhorst\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\\\/#webpage\",\"url\":\"https:\\\/\\\/vbentwickler.de\\\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\\\/\",\"name\":\"ADODB: Access-Wrapper f\\u00fcr gespeicherte Prozeduren - Visual Basic Entwickler\",\"description\":\"Wer Daten zwischen einer Access-Anwendung und einem SQL Server austauscht, landet fr\\u00fcher oder sp\\u00e4ter bei gespeicherten Prozeduren. Sie kapseln die Datenbanklogik serverseitig, liefern bessere Performance als dynamisch zusammengebautes SQL und lassen sich sauber rechtebasiert absichern. Der Aufruf per ADODB erfordert allerdings jedes Mal eine ganze Reihe gleicher Schritte: Verbindung \\u00f6ffnen, Command-Objekt erzeugen, CommandType setzen, Parameter definieren, Werte zuweisen, Prozedur ausf\\u00fchren, Ergebnis auslesen. Schreibt man das f\\u00fcr jede Prozedur neu, w\\u00e4chst der Code schnell zu un\\u00fcbersichtlichen Ausma\\u00dfen an. In diesem Artikel bauen wir ein kleines Wrapper-Modul, das diese Arbeit einmalig erledigt. Anschlie\\u00dfend kannst Du jede gespeicherte Prozedur mit einer einzigen Zeile Code aufrufen - inklusive Parameter\\u00fcbergabe und R\\u00fcckgabewert. Als praktisches Beispiel binden wir den Wrapper an ein vollst\\u00e4ndiges Mitarbeiter-Formular mit allen vier CRUD-Operationen an.\",\"inLanguage\":\"de-DE\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/author\\\/andreminhorst-com\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/author\\\/andreminhorst-com\\\/#author\"},\"datePublished\":\"2026-06-01T00:00:00+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/#website\",\"url\":\"https:\\\/\\\/vbentwickler.de\\\/\",\"name\":\"Datenbankentwickler\",\"description\":\"Das Magazin f\\u00fcr Datenbankentwickler auf Basis von Visual Studio und Co.\",\"inLanguage\":\"de-DE\",\"publisher\":{\"@id\":\"https:\\\/\\\/vbentwickler.de\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"ADODB: Access-Wrapper f\u00fcr gespeicherte Prozeduren - Visual Basic Entwickler","description":"Wer Daten zwischen einer Access-Anwendung und einem SQL Server austauscht, landet fr\u00fcher oder sp\u00e4ter bei gespeicherten Prozeduren. Sie kapseln die Datenbanklogik serverseitig, liefern bessere Performance als dynamisch zusammengebautes SQL und lassen sich sauber rechtebasiert absichern. Der Aufruf per ADODB erfordert allerdings jedes Mal eine ganze Reihe gleicher Schritte: Verbindung \u00f6ffnen, Command-Objekt erzeugen, CommandType setzen, Parameter definieren, Werte zuweisen, Prozedur ausf\u00fchren, Ergebnis auslesen. Schreibt man das f\u00fcr jede Prozedur neu, w\u00e4chst der Code schnell zu un\u00fcbersichtlichen Ausma\u00dfen an. In diesem Artikel bauen wir ein kleines Wrapper-Modul, das diese Arbeit einmalig erledigt. Anschlie\u00dfend kannst Du jede gespeicherte Prozedur mit einer einzigen Zeile Code aufrufen - inklusive Parameter\u00fcbergabe und R\u00fcckgabewert. Als praktisches Beispiel binden wir den Wrapper an ein vollst\u00e4ndiges Mitarbeiter-Formular mit allen vier CRUD-Operationen an.","canonical_url":"https:\/\/vbentwickler.de\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/vbentwickler.de\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\/#blogposting","name":"ADODB: Access-Wrapper f\u00fcr gespeicherte Prozeduren - Visual Basic Entwickler","headline":"ADODB: Access-Wrapper f&uuml;r gespeicherte Prozeduren","author":{"@id":"https:\/\/vbentwickler.de\/author\/andreminhorst-com\/#author"},"publisher":{"@id":"https:\/\/vbentwickler.de\/#organization"},"image":{"@type":"ImageObject","url":"http:\/\/vg08.met.vgwort.de\/na\/1bc6898d1c5040a5a263c88a3fa8ff70","@id":"https:\/\/vbentwickler.de\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\/#articleImage"},"datePublished":"2026-06-01T00:00:00+00:00","dateModified":"-0001-11-30T00:00:00+00:00","inLanguage":"de-DE","mainEntityOfPage":{"@id":"https:\/\/vbentwickler.de\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\/#webpage"},"isPartOf":{"@id":"https:\/\/vbentwickler.de\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\/#webpage"},"articleSection":"2026, 3\/2026, Datenzugriffstechnik"},{"@type":"BreadcrumbList","@id":"https:\/\/vbentwickler.de\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/vbentwickler.de#listItem","position":1,"name":"Home","item":"https:\/\/vbentwickler.de","nextItem":{"@type":"ListItem","@id":"https:\/\/vbentwickler.de\/category\/2026\/#listItem","name":"2026"}},{"@type":"ListItem","@id":"https:\/\/vbentwickler.de\/category\/2026\/#listItem","position":2,"name":"2026","item":"https:\/\/vbentwickler.de\/category\/2026\/","nextItem":{"@type":"ListItem","@id":"https:\/\/vbentwickler.de\/category\/2026\/3\/2026\/#listItem","name":"3\/2026"},"previousItem":{"@type":"ListItem","@id":"https:\/\/vbentwickler.de#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/vbentwickler.de\/category\/2026\/3\/2026\/#listItem","position":3,"name":"3\/2026","item":"https:\/\/vbentwickler.de\/category\/2026\/3\/2026\/","nextItem":{"@type":"ListItem","@id":"https:\/\/vbentwickler.de\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\/#listItem","name":"ADODB: Access-Wrapper f&uuml;r gespeicherte Prozeduren"},"previousItem":{"@type":"ListItem","@id":"https:\/\/vbentwickler.de\/category\/2026\/#listItem","name":"2026"}},{"@type":"ListItem","@id":"https:\/\/vbentwickler.de\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\/#listItem","position":4,"name":"ADODB: Access-Wrapper f&uuml;r gespeicherte Prozeduren","previousItem":{"@type":"ListItem","@id":"https:\/\/vbentwickler.de\/category\/2026\/3\/2026\/#listItem","name":"3\/2026"}}]},{"@type":"Organization","@id":"https:\/\/vbentwickler.de\/#organization","name":"Datenbankentwickler","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Visual Studio und Co.","url":"https:\/\/vbentwickler.de\/","logo":{"@type":"ImageObject","url":"https:\/\/vbentwickler.de\/wp-content\/uploads\/2022\/08\/cropped-header_vbe-1.png","@id":"https:\/\/vbentwickler.de\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\/#organizationLogo","width":664,"height":225},"image":{"@id":"https:\/\/vbentwickler.de\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\/#organizationLogo"}},{"@type":"Person","@id":"https:\/\/vbentwickler.de\/author\/andreminhorst-com\/#author","url":"https:\/\/vbentwickler.de\/author\/andreminhorst-com\/","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","@id":"https:\/\/vbentwickler.de\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","width":96,"height":96,"caption":"Andr\u00e9 Minhorst"}},{"@type":"WebPage","@id":"https:\/\/vbentwickler.de\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\/#webpage","url":"https:\/\/vbentwickler.de\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\/","name":"ADODB: Access-Wrapper f\u00fcr gespeicherte Prozeduren - Visual Basic Entwickler","description":"Wer Daten zwischen einer Access-Anwendung und einem SQL Server austauscht, landet fr\u00fcher oder sp\u00e4ter bei gespeicherten Prozeduren. Sie kapseln die Datenbanklogik serverseitig, liefern bessere Performance als dynamisch zusammengebautes SQL und lassen sich sauber rechtebasiert absichern. Der Aufruf per ADODB erfordert allerdings jedes Mal eine ganze Reihe gleicher Schritte: Verbindung \u00f6ffnen, Command-Objekt erzeugen, CommandType setzen, Parameter definieren, Werte zuweisen, Prozedur ausf\u00fchren, Ergebnis auslesen. Schreibt man das f\u00fcr jede Prozedur neu, w\u00e4chst der Code schnell zu un\u00fcbersichtlichen Ausma\u00dfen an. In diesem Artikel bauen wir ein kleines Wrapper-Modul, das diese Arbeit einmalig erledigt. Anschlie\u00dfend kannst Du jede gespeicherte Prozedur mit einer einzigen Zeile Code aufrufen - inklusive Parameter\u00fcbergabe und R\u00fcckgabewert. Als praktisches Beispiel binden wir den Wrapper an ein vollst\u00e4ndiges Mitarbeiter-Formular mit allen vier CRUD-Operationen an.","inLanguage":"de-DE","isPartOf":{"@id":"https:\/\/vbentwickler.de\/#website"},"breadcrumb":{"@id":"https:\/\/vbentwickler.de\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\/#breadcrumblist"},"author":{"@id":"https:\/\/vbentwickler.de\/author\/andreminhorst-com\/#author"},"creator":{"@id":"https:\/\/vbentwickler.de\/author\/andreminhorst-com\/#author"},"datePublished":"2026-06-01T00:00:00+00:00","dateModified":"-0001-11-30T00:00:00+00:00"},{"@type":"WebSite","@id":"https:\/\/vbentwickler.de\/#website","url":"https:\/\/vbentwickler.de\/","name":"Datenbankentwickler","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Visual Studio und Co.","inLanguage":"de-DE","publisher":{"@id":"https:\/\/vbentwickler.de\/#organization"}}]},"og:locale":"de_DE","og:site_name":"Visual Basic Entwickler - Das Magazin f\u00fcr Datenbankentwickler auf Basis von Visual Studio und Co.","og:type":"article","og:title":"ADODB: Access-Wrapper f\u00fcr gespeicherte Prozeduren - Visual Basic Entwickler","og:description":"Wer Daten zwischen einer Access-Anwendung und einem SQL Server austauscht, landet fr\u00fcher oder sp\u00e4ter bei gespeicherten Prozeduren. Sie kapseln die Datenbanklogik serverseitig, liefern bessere Performance als dynamisch zusammengebautes SQL und lassen sich sauber rechtebasiert absichern. Der Aufruf per ADODB erfordert allerdings jedes Mal eine ganze Reihe gleicher Schritte: Verbindung \u00f6ffnen, Command-Objekt erzeugen, CommandType setzen, Parameter definieren, Werte zuweisen, Prozedur ausf\u00fchren, Ergebnis auslesen. Schreibt man das f\u00fcr jede Prozedur neu, w\u00e4chst der Code schnell zu un\u00fcbersichtlichen Ausma\u00dfen an. In diesem Artikel bauen wir ein kleines Wrapper-Modul, das diese Arbeit einmalig erledigt. Anschlie\u00dfend kannst Du jede gespeicherte Prozedur mit einer einzigen Zeile Code aufrufen - inklusive Parameter\u00fcbergabe und R\u00fcckgabewert. Als praktisches Beispiel binden wir den Wrapper an ein vollst\u00e4ndiges Mitarbeiter-Formular mit allen vier CRUD-Operationen an.","og:url":"https:\/\/vbentwickler.de\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\/","og:image":"https:\/\/datenbankentwickler.net\/wp-content\/uploads\/2022\/08\/cropped-header_vbe-1.png","og:image:secure_url":"https:\/\/datenbankentwickler.net\/wp-content\/uploads\/2022\/08\/cropped-header_vbe-1.png","article:published_time":"2026-07-28T15:01:21+00:00","article:modified_time":"-001-11-30T00:00:00+00:00","twitter:card":"summary_large_image","twitter:title":"ADODB: Access-Wrapper f\u00fcr gespeicherte Prozeduren - Visual Basic Entwickler","twitter:description":"Wer Daten zwischen einer Access-Anwendung und einem SQL Server austauscht, landet fr\u00fcher oder sp\u00e4ter bei gespeicherten Prozeduren. Sie kapseln die Datenbanklogik serverseitig, liefern bessere Performance als dynamisch zusammengebautes SQL und lassen sich sauber rechtebasiert absichern. Der Aufruf per ADODB erfordert allerdings jedes Mal eine ganze Reihe gleicher Schritte: Verbindung \u00f6ffnen, Command-Objekt erzeugen, CommandType setzen, Parameter definieren, Werte zuweisen, Prozedur ausf\u00fchren, Ergebnis auslesen. Schreibt man das f\u00fcr jede Prozedur neu, w\u00e4chst der Code schnell zu un\u00fcbersichtlichen Ausma\u00dfen an. In diesem Artikel bauen wir ein kleines Wrapper-Modul, das diese Arbeit einmalig erledigt. Anschlie\u00dfend kannst Du jede gespeicherte Prozedur mit einer einzigen Zeile Code aufrufen - inklusive Parameter\u00fcbergabe und R\u00fcckgabewert. Als praktisches Beispiel binden wir den Wrapper an ein vollst\u00e4ndiges Mitarbeiter-Formular mit allen vier CRUD-Operationen an.","twitter:image":"https:\/\/datenbankentwickler.net\/wp-content\/uploads\/2022\/08\/cropped-header_vbe-1.png"},"aioseo_meta_data":{"post_id":"55000505","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"limit_modified_date":false,"created":"2026-07-28 14:01:47","updated":"2026-07-28 14:01:47","ai":null,"breadcrumb_settings":null,"seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/vbentwickler.de\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/vbentwickler.de\/category\/2026\/\" title=\"2026\">2026<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/vbentwickler.de\/category\/2026\/3\/2026\/\" title=\"3\/2026\">3\/2026<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tADODB: Access-Wrapper f\u00fcr gespeicherte Prozeduren\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/vbentwickler.de"},{"label":"2026","link":"https:\/\/vbentwickler.de\/category\/2026\/"},{"label":"3\/2026","link":"https:\/\/vbentwickler.de\/category\/2026\/3\/2026\/"},{"label":"ADODB: Access-Wrapper f&uuml;r gespeicherte Prozeduren","link":"https:\/\/vbentwickler.de\/ADODB_AccessWrapper_fuer_gespeicherte_Prozeduren\/"}],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000505","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000505"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000505\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000505"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000505"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000505"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000505"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}