16 SQL Server-Zugriff per VBA

Ähnliche Dokumente
Access [basics] Aktionsabfragen per VBA ausführen. Beispieldatenbank. Aktionsabfragen. Die Execute-Methode. Datenzugriff per VBA

Access [basics] Programmieren mit Arrays. Beispieldatenbank. Arrays. Eindimensionale Arrays. VBA-Grundlagen Programmieren mit Arrays

Professionelle Seminare im Bereich MS-Office

Bilderverwaltung mit Access

Access [basics] Rechnen in Berichten. Beispieldatenbank. Datensatzweise berechnen. Berechnung im Textfeld. Reporting in Berichten Rechnen in Berichten

Excel Funktionen durch eigene Funktionen erweitern.

SEMINAR Modifikation für die Nutzung des Community Builders

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

8 Access-Abfragen migrieren

Verteilte Datenbanken

mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank

Access Grundlagen für Anwender. Susanne Weber. 1. Ausgabe, 1. Aktualisierung, Juni 2013

15 Bilder und Dateien im SQL Server

Second Steps in eport 2.0 So ordern Sie Credits und Berichte

Einrichten eines Postfachs mit Outlook Express / Outlook bis Version 2000

Folgeanleitung für Fachlehrer

Programmieren für mobile Endgeräte SS 2013/2014. Dozenten: Patrick Förster, Michael Hasseler

Wiederherstellen der Beispieldatenbanken zum Buch Microsoft Project 2010

KURZANLEITUNG CLOUD OBJECT STORAGE

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

Microsoft Access 2013 Navigationsformular (Musterlösung)

VERWALTUNG. Postfächer, Autoresponder, Weiterleitungen, Aliases. Bachstraße 47, 3580 Mödring

Excel Auswertungen in XAuftrag / XFibu

Whitepaper. Produkt: combit Relationship Manager / address manager. Integration der Ansicht "Adressen" in eigene Solution

Novell Client. Anleitung. zur Verfügung gestellt durch: ZID Dezentrale Systeme. Februar ZID Dezentrale Systeme

Anleitung zum erfassen von Last Minute Angeboten und Stellenangebote

Artikel Schnittstelle über CSV

News & RSS. Einleitung: Nachrichten er-(veröffentlichen) und bereitstellen Nachrichten erstellen und bereitstellen

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Installationsanleitung für CashPro im Mehrbenutzerzugriff/Netzwerkbetrieb

GEORG.NET Anbindung an Ihr ACTIVE-DIRECTORY

Eine völlig andere Form Abfragen zu erstellen ist, sie mit Hilfe der Datenbankabfragesprache SQL zu gestalten.

Universal Dashboard auf ewon Alarmübersicht auf ewon eigener HTML Seite.

OUTLOOK (EXPRESS) KONFIGURATION POP3

INTERNET UND MMS MIT DEM QTEK2020 MARCO 28. MÄRZ 04

Benutzeranleitung Superadmin Tool

Anleitung für das Content Management System

Anleitung für die Registrierung und das Einstellen von Angeboten

Qt-Projekte mit Visual Studio 2005

Durchführung der Datenübernahme nach Reisekosten 2011

QR-FUNKTION. Informationen über zu erledigende Aufgaben an das Reinigungspersonal senden.

OP-LOG

Beschaffung mit. Auszug aus dem Schulungshandbuch: Erste Schritte im UniKat-System

ODBC-Treiber Programmübersicht

Erstellen einer digitalen Signatur für Adobe-Formulare

desk.modul : Intercompany

1 Einleitung. Lernziele. Symbolleiste für den Schnellzugriff anpassen. Notizenseiten drucken. eine Präsentation abwärtskompatibel speichern

Anleitung OpenCms 8 Webformular Auswertung

HANDBUCH ÜBERNAHME BANKLEITZAHLEN

SharePoint Demonstration

Berechnungen in Access Teil I

(im Rahmen der Exchange-Server-Umstellung am )

Anleitung zur Einrichtung einer ODBC Verbindung zu den Übungsdatenbanken

Zur drittletzten Zeile scrollen


5.2 Neue Projekte erstellen

Anleitungen zum KMG- -Konto

Summenbildung in Bauteiltabellen mit If Then Abfrage

Anleitung zur Einrichtung von Windows Mail V 6.0 an das neue und Groupware-System Communigate Pro

Dokumentation. Novaline Datenbankassistent. Version

2. Einrichtung der ODBC-Schnittstelle aus orgamax (für 32-bit-Anwendungen)

Ablaufbeschreibung für das neu Aufsetzen von Firebird und Interbase Datenbanken mit der IBOConsole

Ihre Internetadresse beim Versenden und Empfangen Ihrer s verwenden.

Fotogalerie mit PWGallery in Joomla (3.4.0) erstellen

Registrierung am Elterninformationssysytem: ClaXss Infoline

.htaccess HOWTO. zum Schutz von Dateien und Verzeichnissen mittels Passwortabfrage

Die Erstellung eigener Strukturprofile

Version NotarNet Bürokommunikation. Bedienungsanleitung für den ZCS-Import-Assistenten für Outlook

MailUtilities: Remote Deployment - Einführung

Lieber SPAMRobin -Kunde!

Einrichtung eines VPN-Zugangs

Übersicht... 2 Dateiupload... 3 Administratorfunktionen... 4

8 Performance analysieren

Folgeanleitung für Klassenlehrer

Drägerware.ZMS/FLORIX Hessen

SMARTtill Server mit Manager

Aufrufen des Konfigurators über eine ISDN- Verbindung zur T-Eumex 628. Eine neue ISDN-Verbindung unter Windows XP einrichten

2.1 Erstellung einer Gutschrift über den vollen Rechnungsbetrag

ecaros2 - Accountmanager

Access [basics] Gruppierungen in Abfragen. Beispieldatenbank. Abfragen gruppieren. Artikel pro Kategorie zählen

Mit jedem Client, der das Exchange Protokoll beherrscht (z.b. Mozilla Thunderbird mit Plug- In ExQulla, Apple Mail, Evolution,...)

In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access. Die Grundlagen der Datenbanken.

Microsoft Dynamics NAV 2013 R/2 Installationsanleitung. Inhalt: Begleitmaterial des ERP Übungsbuchs:

S TAND N OVEMBE R 2012 HANDBUCH DUDLE.ELK-WUE.DE T E R M I N A B S P R A C H E N I N D E R L A N D E S K I R C H E

Handbuch ECDL 2003 Basic Modul 5: Datenbank Grundlagen von relationalen Datenbanken

Anleitung Grundsetup C3 Mail & SMS Gateway V

Anleitung: WLAN-Zugang unter Windows 8 - eduroam. Schritt 1

Installation KVV SQL

Upgrade auf die Standalone Editionen von Acronis Backup & Recovery 10. Technische Informationen (White Paper)

INDEX. Öffentliche Ordner erstellen Seite 2. Offline verfügbar einrichten Seite 3. Berechtigungen setzen Seite 7. Öffentliche Ordner Offline

Ordner Berechtigung vergeben Zugriffsrechte unter Windows einrichten

Internationales Altkatholisches Laienforum

Mediumwechsel - VR-NetWorld Software

Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank

Dokumentation IBIS Monitor

Übungen Programmieren 1 Felix Rohrer. Übungen

Das Festkomitee hat die Abi-Seite neu konzipiert, die nun auf einem (gemieteten) Share Point Server

Im folgenden wird die Outlookanbindung an organice/pi beschrieben.

Benutzerhandbuch MedHQ-App

Einstellungen im Internet-Explorer (IE) (Stand 11/2013) für die Arbeit mit IOS2000 und DIALOG

Transkript:

Leseprobe aus Access und SQL Server http://www.acciu.de/asqllesen 16 SQL Server-Zugriff per VBA Sie werden an verschiedenen Stellen per VBA auf die Tabellen der SQL Server-Datenbank zugreifen müssen sei es, um eine ODBC-Verknüpfung herzustellen oder zu aktualisieren, das Ergebnis einer gespeicherten Abfrage abzurufen oder eine solche auszuführen oder auch um ein Recordset auf Basis einer gespeicherten Abfrage einem Formular, Bericht oder einem Steuerelement zuzuweisen. Die dazu notwendigen Techniken lernen Sie in diesem Kapitel kennen. Die Beispiele zu diesem Kapitel finden Sie in der Datenbank AEMA_SQL.accdb im Modul mdlbeispiele_vbadao****. 16.1 Verbindungszeichenfolgen Als erstes benötigen Sie natürlich Zugriff auf die SQL Server-Datenbank. Voraussetzung dafür ist eine geeignete Verbindungszeichenfolge. Bei den Verbindungszeichenfolgen gibt es verschiedene Ansätze. Sie sind relativ flexibel, wenn Sie die notwendigen Informationen in einer Tabelle im Datenbank-Frontend speichern und von Access aus per VBA darauf zugreifen, um Verbindungszeichenfolgen daraus zu erstellen. Alternativ können Sie Verbindungszeichenfolgen in einer DSN-Datei oder als System-DSN in der Registry speichern wir gehen an dieser Stelle jedoch auf die Variante der tabellenbasierten Verbindungszeichenfolge ein. Die notwendigen Daten speichern wir in den Beispieldatenbanken in einer Tabelle namens tbl- Verbindungszeichenfolgen (siehe Abbildung 16.1). Abbildung 16.1: Die Tabelle speichert die Informationen zu den Verbindungszeichenfolgen In der Beispielanwendung verwenden wir die folgende Prozedur, um eine Verbindungszeichenfolge aus den Daten der Tabelle tblverbindungszeichenfolgen zu ermitteln: Private Function Verbindungszeichenfolge(strDatenbank As String) As String Dim strtemp As String strtemp = "ODBC;DRIVER={" & Me!cboTreiberID.Column(1) & "};" & "SERVER=" _ & Me!txtSQLServer & ";" & "DATABASE=" & strdatenbank & ";" If Me!ogrTrustedConnection = True Then

Kapitel 16 SQL Server-Zugriff per VBA Else End If strtemp = strtemp & "Trusted_Connection=Yes" strtemp = strtemp & "UID=" & Nz(Me!txtBenutzername, "[Benutzername]") _ & ";PWD=" & Nz(Me!txtKennwort, "[Kennwort]") Verbindungszeichenfolge = strtemp End Function Die Prozedur liest den Datensatz der Tabelle tblverbindungszeichenfolgen ein, dessen Primärschlüs selwert dem per Parameter übergebenen Wert entspricht. Dann setzt sie die einzelnen Elemente zusammen. Die einzige Variante ist die Authentifizierungsart: Bei der Windows- Authentifizierung enthält die Verbindungszeichenfolge das Name-Wert-Paar Trusted_ Connection=Yes, sonst die Benutzerdaten in der Form UID=<Benutzername>;PWD=<Kenn wort>. An dieser Stelle weisen wir nochmals darauf hin, dass Sie nach Möglichkeit die Windows-Authen tifizierung nutzen sollten das Speichern von Benutzernamen und Kennwörtern ist nicht zu empfehlen. 16.2 Aktionsabfrage ausführen Aktionsabfragen sind Abfragen, die Daten ändern also Lösch-, Aktualisierungs- und An füge abfra gen. Diese können Sie auf verschiedene Arten ausführen: Erstellen einer Aktionsabfrage in Access, die sich auf die Daten einer per ODBC verknüpften Tabelle bezieht Erstellen einer Pass-Through-Abfrage, welche die Aktionsabfrage enthält und diese direkt an den SQL Server übermittelt Erstellen einer gespeicherten Prozedur, welche die Aktionsabfrage enthält und die notwendigen Parameter entgegen nimmt also beispielsweise die ID eines zu löschenden Datensatzes, und die über eine Pass-Through-Abfrage aufgerufen wird. In den folgenden Absätzen schauen wir uns die zweite und die dritte Variante an. 16.2.1 Datensatz löschen per SQL Bei der ersten Variante legen Sie eine Pass-Through-Abfrage mit der auszuführenden DELETE- Anweisung an (siehe Abbildung 16.2). Dazu sind drei Schritte nötig: Erstellen einer neuen, leeren Abfrage und Schließen des Dialogs Tabelle anzeigen Wechseln des Abfragetyps auf Pass-Through Einstellen der Eigenschaft ODBC-Verbindung auf die gewünschte Verbindungszeichenfolge 322

Aktionsabfrage ausführen Einstellen der Eigenschaft Liefert Datensätze auf Nein Eintragen der DELETE-Anweisung Abbildung 16.2: Statisches Löschen eines Datensatzes per Pass-Through-Abfrage Die Abfrage können Sie dann per VBA mit einer einzigen Anweisung ausführen: CurrentDb.QueryDefs("qryBankLoeschen").Execute Damit haben Sie allerdings noch nicht viel gewonnen: Die Anweisung löscht ja nur genau den Datensatz, dessen ID Sie als Kriterium angegeben haben. Immerhin haben wir aber bereits eine Abfrage erstellt, die den richtigen Typ aufweist, die Verbindungszeichenfolge enthält und deren Eigenschaft Liefert Datensätze auf Nein eingestellt ist. Diese nutzen wir nun, um gezielt einen bestimmten Datensatz zu löschen. Die folgende Prozedur erwartet den Primärschlüsselwert des zu löschenden Datensatzes als Parameter: Public Sub BankLoeschenSQLPassthrough(lngBankID As Long) End Sub Dim db As DAO.Database Dim qdf As DAO.QueryDef Set db = CurrentDb Set qdf = db.querydefs("qrybankloeschen") qdf.sql = "DELETE FROM tblbanken WHERE BankID = " & lngbankid qdf.execute Set qdf = Nothing Set db = Nothing Sie referenziert die soeben erstellte Abfrage und ändert die enthaltene SQL-Anweisung so, dass diese als Kriterium den per Parameter übergebenen Primärschlüsselwert enthält und führt die geänderte Abfrage mit der Execute-Anweisung aus. Der Aufruf dieser Prozedur sieht etwa so aus: 323

Kapitel 16 SQL Server-Zugriff per VBA BankLoeschenSQLPassthrough 12345 Diese Variante hat noch zwei Nachteile: Die an den SQL Server übergebene SQL-Anweisung wird dynamisch zusammengesetzt. Der Ausführungsplan für diese Anweisung muss somit jedesmal neu ermittelt werden. Die Verbindungszeichenfolge ist in der Abfrage gespeichert. Wenn sich diese ändert, muss sie an jeder Stelle angepasst werden. Wir erfahren nicht, ob die Aktion erfolgreich war und wieviele Datensätze gelöscht wurden. In den folgenden beiden Abschnitten kümmern wir uns um diese Nachteile. 16.2.2 Datensatz löschen per gespeicherter Prozedur Als Erstes sorgen wir dafür, dass der SQL Server den Ausführungsplan für die Abfrage speichern kann und erstellen eine gespeicherte Prozedur. Dies erledigen wir mit folgendem SQL-Skript: CREATE PROCEDURE [dbo].[spbankloeschen] (@BankID int) AS DELETE FROM tblbanken WHERE BankID = @BankID; Die dadurch erzeugte gespeicherte Prozedur erwartet den Primärschlüsselwert des zu löschenden Datensatzes als Parameter. Wenn Sie die gespeicherte Prozedur direkt vom Abfragefenster des SQL Servers aus ausführen wollten, würden Sie dies mit folgender Anweisung erledigen: EXEC spbankloeschen 123456 Wir wollen dies allerdings von Access aus erledigen. Also erstellen Sie zunächst eine neue Abfrage, wandeln diese in eine Pass-Through-Abfrage um und legen den SQL-Ausdruck aus Abbildung 22.3 fest. Abbildung 16.3: Aufruf der gespeicherten Prozedur von einer Access-Abfrage aus In dieser Abfrage müssen Sie nun natürlich ebenfalls den Primärschlüsselwert des zu löschenden Datensatzes als Parameter angeben. Dies erledigen Sie ähnlich wie oben: Public Sub BankLoeschenSPPassthrough(lngBankID As Long) Dim db As DAO.Database Dim qdf As DAO.QueryDef Set db = CurrentDb Set qdf = db.querydefs("spbankloeschen") 324

Aktionsabfrage ausführen End Sub qdf.sql = "EXEC spbankloeschen " & lngbankid qdf.execute Set qdf = Nothing Set db = Nothing Der Aufruf sieht beispielsweise wie folgt aus: BankLoeschenSPPassthrough 123456 Dies ändert zunächst den SQL-Ausdruck der Abfrage spbankloeschen wie folgt: EXEC spbankloeschen 123456 Dieser Aufruf wird direkt an den SQL Server gesendet, der dann die gespeicherte Prozedur spbankloeschen mit dem angegebenen Parameter ausführt und den entsprechenden Datensatz löscht. 16.2.3 Pass-Through-Abfrage mit dynamischer Verbindungszeichenfolge Nun soll noch die Verbindungszeichenfolge direkt aus der Tabelle tblverbindungszeichenfolgen bezogen werden. Dazu übergeben Sie der Prozedur noch die ID der Verbindungszeichenfolge als weiteren Parameter. Dieser Parameter wird an die weiter oben erläuterte Funktion VerbindungszeichenfolgeNachID übergeben, die dann die Verbindungszeichenfolge zurückliefert. Das Ergebnis landet direkt in der Eigenschaft Connect des QueryDef-Objekts, was dem Zuweisen der Verbindungszeichenfolge zur Eigenschaft ODBC-Verbindung entspricht. Hier ein Auszug der Prozedur (die übrigen Zeilen entsprechen dem vorherigen Beispiel): Public Sub BankLoeschenSPPassthroughMitVerbindungszeichenfolge(lngBankID As Long, _... lngverbindungszeichenfolgeid As Long) qdf.connect = VerbindungszeichenfolgeNachID(1)... End Sub Auch hier noch ein Beispielaufruf: BankLoeschenSPPassthroughMitVerbindungszeichenfolge 210028, 1 Dies löscht den Datensatz mit dem Wert 210028 im Feld BankID und verwendet die Ver bin dungszeichenfolge mit dem Wert 1 im Feld VerbindungszeichenfolgeID der Tabelle tblverbindungszeichenfolgen. 325

Kapitel 16 SQL Server-Zugriff per VBA 16.2.4 Löschen mit Bestätigung Schließlich möchten Sie vielleicht noch wissen, ob der Löschvorgang überhaupt erfolgreich war beziehungsweise wieviele Datensätze von der Aktionsabfrage betroffen waren. T-SQL bietet mit der Funktion @@ROWCOUNT ein Mittel, um die Anzahl der von der zuletzt ausgeführten Abfrage betroffenen Datensätze zu ermitteln. Dies bezieht sich auf die Aktionsabfragen der aktuellen Verbindung. Die folgende gespeicherte Prozedur löscht wie in den obigen Beispielen einen Datensatz mit dem übergebenen Wert für das Feld BankID, gibt aber als Ergebnis die Anzahl der betroffenen Datensätze zurück: CREATE PROCEDURE [dbo].[spbankloeschenmitergebnis] @BankID INT AS DELETE FROM tblbanken WHERE BankID = @BankID SELECT @@ROWCOUNT AS RecordsAffected; Wenn Sie diese gespeicherte Prozedur im Abfragefenster im SQL Server Management Studio aufrufen, sieht das Ergebnis wie in Abbildung 16.4 aus. Abbildung 16.4: Ausgabe der Anzahl der gelöschten Datensätze Um dieses Ergebnis von Access aus zu nutzen, ist eine kleine Änderung am Entwurf der ODBC- Abfrage nötig. Wir haben die Abfrage von oben unter dem Namen spbankloeschenmitergebnis kopiert und die Eigenschaft Liefert Datensätze auf den Wert Ja eingestellt (siehe Abbildung 16.5). Anderenfalls liefert die Abfrage das Ergebnis der SELECT-Abfrage mit der Anzahl der betroffenen Datensätze nicht zurück! 326

Aktionsabfrage ausführen Abbildung 16.5: Einstellungen für eine Aktionsabfrage mit Rückgabewert Führen Sie diese Abfrage direkt aus, liefert sie das Ergebnis aus Abbildung 16.6. Abbildung 16.6: Ergebnis der gespeicherten Prozedur zum Löschen eines Datensatzes Dies ist ein Ergebnis, mit dem wir auch unter VBA arbeiten können. Die folgende Prozedur verwendet wieder die BankID und die ID der Verbindungszeichenfolge als Parameter: Public Sub BankLoeschenSPPassthroughMitErgebnis(lngBankID As Long, _ End Sub lngverbindungszeichenfolgeid As Long) Dim db As DAO.Database Dim qdf As DAO.QueryDef Dim rst As DAO.Recordset Dim lnganzahl As Long Set db = CurrentDb Set qdf = db.querydefs("spbankloeschenmitergebnis") qdf.connect = VerbindungszeichenfolgeNachID(1) qdf.sql = "EXEC spbankloeschenmitergebnis " & lngbankid Set rst = qdf.openrecordset(dbopensnapshot) lnganzahl = rst!recordsaffected MsgBox "Es wurden " & lnganzahl & " Datensätze gelöscht." Set rst = Nothing Set qdf = Nothing Set db = Nothing 327

Kapitel 16 SQL Server-Zugriff per VBA Sie erzeugt wie gewohnt ein QueryDef-Objekt auf Basis der gespeicherten Abfrage spbankloeschenmitergebnis und ermittelt die gewünschte Verbindungszeichenfolge. Dann weist sie wie zuvor den neuen SQL-Ausdruck zu, führt die Abfrage aber diesmal nicht mit Execute aus. Stattdessen erstellt sie ein neues Recordset-Objekt und füllt es über die OpenRecordset-Methode mit dem Ergebnis der gespeicherten Prozedur. Dies erzeugt ein herkömmliches Recordset-Objekt, dass nur einen Datensatz mit einem Feld enthält und dieses wird mit rst!recordsetaffected ausgelesen und in einem Meldungsfenster ausgegeben. 16.2.5 Dynamische Aktionsabfrage ohne Rückgabewert Die bisherigen Ansätze gingen davon aus, dass die Access-Datenbank eine gespeicherte Abfrage mit den wichtigsten Eigenschaften zum Ausführen der gespeicherten Prozedur per Pass-Through- Abfrage enthält. Je mehr solcher Abfragen Sie verwenden, desto unübersichtlicher wird es im Navigationsbereich. Und davon abgesehen ändern wir ohnehin zumindest den SQL-Code jeder Pass-Through-Abfrage, die eine gespeicherte Prozedur mit Paramtern ausführt. Dann können wir diese auch gleich neu anlegen der Performance-Unterschied dürfte sich in Grenzen halten. Was benötigen wir also im Vergleich zur vorherigen Variante? Eigentlich müssen wir nur den Namen der zu verwendenden gespeicherten Prozedur zusätzlich übergeben, die Verbindungszeichenfolge und die Parameter werden ja bereits verarbeitet. Die erweiterte Prozedur sieht nun so aus: Public Sub TemporaereSPMitParameterAusfuehren(strStoredProcedure As String, _ lngverbindungszeichenfolgeid As Long, _ ParamArray varparameter() As Variant) Dim db As DAO.Database Dim qdf As DAO.QueryDef Dim strsql As String Dim strparameter As String Dim var As Variant Set db = CurrentDb On Error Resume Next db.querydefs.delete strstoredprocedure On Error GoTo 0 Set qdf = db.createquerydef(strstoredprocedure) For Each var In varparameter strparameter = strparameter & ", " & var Next var If Len(strParameter) > 0 Then End If strparameter = Mid(strParameter, 3) With qdf 328

Aktionsabfrage ausführen End Sub.Connect = VerbindungszeichenfolgeNachID(lngVerbindungszeichenfolgeID).ReturnsRecords = False.SQL = "EXEC " & strstoredprocedure & " " & strparameter.execute End With Set db = Nothing Die Prozedur löscht zunächst wieder eine eventuell bereits vorhandene Abfrage mit dem Namen der zu verwendenden und per Parameter übergebenen gespeicherten Prozedur. Diese wird dann mit der CreateQueryDef-Methode neu erstellt. Die folgenden Zeilen stellen die Verbin dungszeichenfolge ein, legen für ReturnRecords den Wert False fest und fügen das Schlüsselwort EXEC, den Namen der gespeicherten Prozedur und die Parameterliste zusammen. Die Execute-Methode führt die Abfrage schließlich durch. 16.2.6 Dynamische Aktionsabfrage mit Rückgabewert Weiter oben haben wir gesehen, dass es sinnvoll sein kann, die Anzahl der von einer Aktionsabfrage betroffenen Datensätze zu ermitteln. Im Beispiel oben haben wir mit der folgenden Zeile beim Erstellen der gespeicherten Prozedur dafür gesorgt, dass diese ein Recordset mit der Anzahl der von der Aktionsabfrage betroffenen Datensätze zurückliefert: SELECT @@ROWCOUNT AS RecordsAffected; Wir können jedoch nicht voraussetzen, dass jede Aktionsabfrage, die in einer gespeicherten Prozedur steckt, das Ergebnis auf diese Weise liefert. Kein Problem: In der folgenden Funktion können Sie angeben, ob diese Zeile in der gespeicherten Prozedur enthalten ist oder nicht. Ist dies nicht der Fall, fügt die Funktion diese Zeile noch hinzu. Die Funktion erwartet dementsprechend vier Parameter: strstoredprocedure: Name der zu verwendenden gespeicherten Prozedur lngverbindungszeichenfolgeid: ID der Verbindungszeichenfolge aus der Tabelle tblverbindungszeichenfolgen bolrueckgabeimplementiert: Wert, der angibt, ob die Rückgabe der Anzahl der von der Aktionsabfrage betroffenen Datensätze in der gespeicherten Prozedur implementiert ist varparameter: Parameter-Array mit den zu übergebenden Parametern Die Funktion sieht wie folgt aus: Public Function SPAktionsabfrageMitErgebnis(strStoredProcedure As String, _ lngverbindungszeichenfolgeid As Long, _ bolrueckgabeimplementiert As Boolean, _ 329

Kapitel 16 SQL Server-Zugriff per VBA ParamArray varparameter() As Variant) As Long Dim db As DAO.Database Dim qdf As DAO.QueryDef Dim rst As DAO.Recordset Dim strsql As String Dim strparameter As String Dim var As Variant Set db = CurrentDb On Error Resume Next db.querydefs.delete strstoredprocedure On Error GoTo 0 Set qdf = db.createquerydef(strstoredprocedure) For Each var In varparameter strparameter = strparameter & ", " & var Next var If Len(strParameter) > 0 Then End If strparameter = Mid(strParameter, 3) With qdf.connect = VerbindungszeichenfolgeNachID(lngVerbindungszeichenfolgeID).ReturnsRecords = True.SQL = "EXEC " & strstoredprocedure & " " & strparameter If Not bolrueckgabeimplementiert Then End If.SQL =.SQL & vbcrlf & "SELECT @@ROWCOUNT AS RecordsAffected;" Set rst =.OpenRecordset End With SPAktionsabfrageMitErgebnis = rst!recordsaffected Set db = Nothing End Function Die Funktion arbeitet zunächst wie die zuvor beschriebene Prozedur. Sie ist jedoch als Function deklariert und liefert einen Long-Wert als Ergebnis. Außerdem verarbeitet Sie beim Definieren der Pass-Through-Abfrage den Parameter bolrueckgabeimplementiert. Hat dieser den Wert False, geht die Funktion davon aus, dass die gespeicherte Prozedur kein Recordset mit der Anzahl der von der Aktionsabfrage betroffenen Datensätze zurückliefert. In diesem Fall ergänzt sie den SQL-Ausdruck selbstständig um die entsprechende Zeile. Der SQL-Ausdruck sieht dann beispielsweise wie folgt aus: EXEC spbankloeschen 123456 SELECT @@ROWCOUNT AS RecordsAffected 330