SQL Server-Verbindungen per Backstage verwalten

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Wer in Access mit verknüpften SQL Server-Tabellen arbeitet, kennt das Problem: Die Verbindungszeichenfolge muss korrekt zusammengesetzt sein, Treiber und Authentifizierungsart müssen stimmen – und bei jeder neuen Datenbank fängt man von vorn an. Dieser Artikel zeigt, wie Du einen eigenen Tab im Backstage-Bereich von Access einrichtest, der Dir das Zusammenbauen der Verbindungszeichenfolge abnimmt.

Beispieldatenbank

Die Beispieldatenbank zum Artikel enthält die Tabelle USysRibbons mit dem XML für den Backstage-Tab sowie das Modul mdlBackstage mit allen Callback-Prozeduren. Du kannst die Datenbank direkt öffnen und den Backstage-Tab sofort verwenden – oder den Code als Vorlage für Deine eigene Datenbank nutzen.

Was der Backstage-Tab leistet

Der Tab SQL Server-Verbindung erscheint im Backstage-Bereich von Access – also in dem Bereich, der sich öffnet, wenn Du auf Datei klickst (siehe Bild 1). Er enthält auf der linken Seite alles, was zum manuellen Aufbau einer Verbindungszeichenfolge nötig ist:

Der Backstage-Tab SQL Server-Verbindung in Access

Bild 1: Der Backstage-Tab SQL Server-Verbindung in Access

  • Treiber-Auswahl: Ein Dropdown mit den drei gängigsten ODBC-Treibern für SQL Server – ODBC Driver 17 for SQL Server, ODBC Driver 18 for SQL Server und SQL Server Native Client 11.0.
  • Servername mit History: Eine ComboBox, die sowohl freie Eingabe als auch die Auswahl aus zuvor verwendeten Servernamen erlaubt. Neue Servernamen werden automatisch gespeichert. Ein Löschen-Button entfernt den aktuell eingetragenen Namen aus der History.
  • Datenbanken laden: Ein Button verbindet sich mit dem eingetragenen Server und liest alle verfügbaren Datenbanken aus. Das Ergebnis erscheint als Auswahlliste in der Datenbankname-ComboBox.
  • Authentifizierung: Eine RadioGroup schaltet zwischen Windows-Authentifizierung und SQL Server-Authentifizierung um. Bei SQL Server-Authentifizierung werden die Felder für Benutzername und Kennwort automatisch aktiviert.
  • Verbindungszeichenfolge: Das Ergebnis aller Eingaben wird in Echtzeit als fertige Verbindungszeichenfolge angezeigt. Zwei Buttons ermöglichen das Testen der Verbindung und das Kopieren in die Zwischenablage.

So verwendest Du den Backstage-Tab

Nach dem Einrichten des Tabs – wie das geht, beschreibt der nächste Abschnitt – öffnest Du ihn über Datei|SQL Server-Verbindung. Beim ersten Aufruf sind alle Felder leer.

  • Schritt 1 – Treiber wählen: Wähle im Dropdown ODBC-Treiber den auf Deinem System installierten Treiber aus. Meist ist das ODBC Driver 17 for SQL Server. Der ODBC Driver 18 erfordert zusätzliche Parameter für die verschlüsselte Verbindung, die automatisch ergänzt werden. Falls Du noch den älteren Native Client im Einsatz hast, steht auch SQL Server Native Client 11.0 zur Verfügung (siehe Bild 2).
  • Treiber-Auswahl im Dropdown

    Bild 2: Treiber-Auswahl im Dropdown

  • Schritt 2 – Servername eingeben: Trage den Servernamen in die ComboBox Servername ein. Das kann ein Rechnername, eine IP-Adresse oder ein benannter Instanzname im Format Rechnername\Instanzname sein. Sobald Du den Namen bestätigst, wird er automatisch in der History gespeichert und beim nächsten Mal in der Auswahlliste angeboten (siehe Bild 3). Nicht mehr benötigte Einträge entfernst Du über den Löschen-Button rechts neben der ComboBox – nach einer Rückfrage wird der aktuell angezeigte Name aus der Liste entfernt.
  • Servername-ComboBox mit History-Einträgen

    Bild 3: Servername-ComboBox mit History-Einträgen

  • Schritt 3 – Authentifizierung festlegen: Wähle zwischen Windows-Authentifizierung und SQL Server-Authentifizierung. Bei Windows-Authentifizierung werden die Felder für Benutzername und Kennwort deaktiviert – die Anmeldedaten des aktuellen Windows-Benutzers werden automatisch verwendet. Bei SQL Server-Authentifizierung werden beide Felder aktiv und müssen ausgefüllt werden (siehe Bild 4).
  • Authentifizierungsoptionen

    Bild 4: Authentifizierungsoptionen

  • Schritt 4 – Datenbanken laden: Klicke auf Datenbanken mit aktuellen Zugangsdaten laden. Das Add-In baut eine Verbindung zum Server auf – ohne Datenbankangabe – und liest alle verfügbaren Datenbanken aus. Das kann je nach Netzwerk und Server einige Sekunden dauern. Die gefundenen Datenbanken erscheinen anschließend in der ComboBox Datenbankname (siehe Bild 5). Du kannst den Datenbanknamen alternativ auch direkt eingeben, falls Du ihn kennst.
  • Datenbankname-ComboBox nach dem Laden der verfügbaren Datenbanken

    Bild 5: Datenbankname-ComboBox nach dem Laden der verfügbaren Datenbanken

  • Schritt 5 – Verbindungszeichenfolge prüfen und testen: Die fertig zusammengesetzte Verbindungszeichenfolge erscheint im unteren Bereich der linken Spalte. Sie wird nach jeder Änderung automatisch aktualisiert und zeilenweise dargestellt, damit sie gut lesbar ist (siehe Bild 6). Über Verbindung testen prüfst Du, ob die Verbindung tatsächlich aufgebaut werden kann. Bei Erfolg erscheint eine kurze Bestätigungsmeldung, bei einem Fehler die Fehlerbeschreibung von ADODB – das hilft beim schnellen Eingrenzen von Problemen wie falschem Kennwort, nicht erreichbarem Server oder fehlendem Treiber.
  • Fertige Verbindungszeichenfolge mit zeilenweiser Darstellung

    Bild 6: Fertige Verbindungszeichenfolge mit zeilenweiser Darstellung

Mit In Zwischenablage kopieren übernimmst Du die Zeichenfolge in einem Schritt – ohne die Darstellung im Label manuell markieren zu müssen. Von dort aus kannst Du sie zum Beispiel direkt in den VBA-Editor einfügen oder in eine andere Anwendung übertragen.

Einrichtung in der Datenbank

Der Backstage-Tab wird über die Systemtabelle USysRibbons in der jeweiligen Access-Datenbank eingerichtet. Die Tabelle muss einmalig angelegt werden – die Beispieldatenbank zum Artikel enthält sie bereits. Sie besteht aus drei Feldern: ID (Primärschlüsselfeld mit Autowert), Ribbon RibbonName (Text) und RibbonXml (Memo). In RibbonXml steht das vollständige XML, das den Tab beschreibt. In den Access-Optionen unter Aktuelle Datenbank trägst Du im Feld Name des Menübands den Wert aus RibbonName ein. Nach dem nächsten Öffnen der Datenbank ist der Tab aktiv.

Die Callback-Prozeduren befinden sich im Modul mdlBackstage. Die Verbindungseinstellungen werden in der Windows-Registry unter dem Schlüssel HKCU\Software\VB and VBA Program Settings\amvSQLServerConnection\SQLServer gespeichert. Das hat den Vorteil, dass die Einstellungen datenbankübergreifend gelten – Du musst Servernamen und Zugangsdaten nicht in jeder Datenbank neu eingeben.

Die Servernamen-History wird unter dem Registry-Wert Servernamen als pipe-separierte Liste gespeichert, zum Beispiel:

194.163.171.28|SQLSERVER01|LAPTOP\SQLEXPRESS

XML-Definition für den Backstage-Bereich

Das XML beginnt mit dem üblichen customUI-Wurzelelement, gefolgt von und einem -Element mit einer eigenen ID. Das Attribut insertAfterMso=”TabInfo” sorgt dafür, dass der Tab hinter dem Informationen-Tab erscheint. Das Attribut title legt die Überschrift fest, die im Backstage über dem Inhalt angezeigt wird:

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"
    onLoad="customUI_OnLoad">
  <backstage>
    <tab id="tabSQLServer"
         label="SQL Server-Verbindung"
         insertAfterMso="TabInfo"
         title="SQL Server-Verbindungszeichenfolgen">
      <firstColumn>
        ...
      </firstColumn>
    </tab>
  </backstage>
</customUI>

Das Attribut onLoad verweist auf eine Callback-Funktion, die beim Laden des Ribbons aufgerufen wird und eine Referenz auf das IRibbonUI-Objekt liefert. Diese Referenz wird in einer Modulvariablen gespeichert und später benötigt, um das Backstage nach Änderungen neu zu zeichnen:

Private m_ribbon As IRibbonUI
Public Function customUI_OnLoad(ribbon As IRibbonUI) _
        As IRibbonUI
    Set m_ribbon = ribbon
    Call ServernamenLaden
    Call DatenbanknamenLeeren
End Function

Alle Callback-Prozeduren kommen in ein Standardmodul namens mdlBackstage. Für die Registry-Speicherung verwendet die Lösung zwei Konstanten:

Public Const cStrAppName As String = _
    "amvSQLServerConnection"
Public Const cStrSection As String = _
    "SQLServer"

Die Registry eignet sich hier gut als Speicherort, weil die Verbindungsdaten datenbankübergreifend verfügbar sein sollen – einmal konfiguriert, stehen sie in jeder Datenbank zur Verfügung, die diesen Backstage-Tab verwendet.

Klassen wie IRibbonUI sind in der Bibliothek Microsoft Office 16.0 Object Library definiert, daher müssen wir noch einen Verweis auf diese Bibliothek zu den Verweisen des VBA-Projekts hinzufügen.

Steuerelemente im Backstage-Tab

Der Tab verwendet eine einzelne Spalte (firstColumn), die in mehrere Gruppen unterteilt ist. Jede Gruppe enthält ein topItems-Element, das die eigentlichen Steuerelemente aufnimmt. Im Backstage stehen nicht alle Steuerelemente des Ribbons zur Verfügung – die wichtigsten für diese Lösung sind dropDown, comboBox, editBox, radioGroup, labelControl, button und layoutContainer.

Ein wesentlicher Unterschied zum Ribbon: Backstage-Callbacks, die einen Wert zurückliefern, verwenden in VBA ByRef-Parameter statt Funktionsrückgabewerten. Die Signatur für einen Text-Callback sieht zum Beispiel so aus:

Public Sub ebServername_GetText(control As IRibbonControl, _
        ByRef text)
    text = GetSetting(cStrAppName, _
        cStrSection, "Servername", "")
End Sub

Falsche Signaturen führen zu stillen Fehlern – das Steuerelement zeigt einfach nichts an, ohne eine Fehlermeldung zu erzeugen.

Treiber-Auswahl

Die erste Gruppe enthält ein dropDown-Element für die Auswahl des ODBC-Treibers. Die drei verfügbaren Treiber sind im Code fest hinterlegt: ODBC Driver 17 for SQL Server, ODBC Driver 18 for SQL Server und SQL Server Native Client 11.0. Das XML für das Dropdown sieht so aus:

<group id="grpTreiber" label="Treiber">
  <topItems>
    <dropDown id="ddTreiber" label="ODBC-Treiber"
              getItemCount="ddTreiber_GetItemCount"
              getItemLabel="ddTreiber_GetItemLabel"
              getItemID="ddTreiber_GetItemID"
              getSelectedItemIndex=_
                  "ddTreiber_GetSelectedItemIndex"
              onAction="ddTreiber_OnAction"/>
  </topItems>
</group>

Die Callbacks für ein dropDown im Backstage folgen einem einheitlichen Muster. GetItemCount liefert die Anzahl der Einträge, GetItemLabel den anzuzeigenden Text für jeden Index, GetItemID eine eindeutige Zeichenkette je Eintrag und GetSelectedItemIndex den aktuell gewählten Index. OnAction wird aufgerufen, wenn der Benutzer einen Eintrag auswählt (siehe Listing 1).

Public Sub ddTreiber_GetItemCount(control As IRibbonControl, ByRef count)
    count = 3
End Sub
Public Sub ddTreiber_GetItemLabel(control As IRibbonControl, index As Integer, ByRef label)
    label = GetTreiberName(index)
End Sub
Public Sub ddTreiber_GetItemID(control As IRibbonControl, index As Integer, ByRef id)
    id = "treiber" & index
End Sub
Public Sub ddTreiber_GetSelectedItemIndex(control As IRibbonControl, ByRef selectedIndex)
    selectedIndex = Val(GetSetting(cStrAppName, cStrSection, "TreiberIndex", "0"))
End Sub
Public Sub ddTreiber_OnAction(control As IRibbonControl, selectedID As String, selectedIndex As Integer)
    SaveSetting cStrAppName, cStrSection, "TreiberIndex", selectedIndex
    Call VerbindungszeichenfolgeAktualisieren
    m_ribbon.Invalidate
End Sub

Listing 1: Callbacks für das Treiber-Dropdown

Die Hilfsfunktion GetTreiberName liefert den Treibernamen für einen gegebenen Index und wird später auch beim Zusammenbauen der Verbindungszeichenfolge verwendet:

Private Function GetTreiberName(index As Integer) As String
    Select Case index
        Case 0
            GetTreiberName = "ODBC Driver 17 for SQL Server"
        Case 1
            GetTreiberName = "ODBC Driver 18 for SQL Server"
        Case 2
            GetTreiberName = "SQL Server Native Client 11.0"
        Case Else
            GetTreiberName = "ODBC Driver 17 for SQL Server"
    End Select
End Function

Um die Funktion VerbindungszeichenfolgeAktualisieren kümmern wir uns weiter unten.

Servername mit History

Für den Servernamen kommt eine comboBox zum Einsatz – sie erlaubt sowohl freie Eingabe als auch die Auswahl aus einer Liste zuvor verwendeter Servernamen. Die verwendeten Namen werden pipe-separiert in der Registry gespeichert. Daneben gibt es einen Löschen-Button, mit dem ein Servername aus der History entfernt werden kann. Beide Steuerelemente werden in einem layoutContainer nebeneinander angeordnet:

<group id="grpServer" label="Verbindung">
  <topItems>
    <layoutContainer id="lcServername"
                    layoutChildren="horizontal">
      <comboBox id="cbServername"
                label="Servername"
                sizeString="WWWWWWWWWWWWWWWWWWWW"
                getText="cbServername_GetText"
                onChange="cbServername_OnChange"
                getItemCount="cbServername_GetItemCount"
                getItemLabel="cbServername_GetItemLabel"
                getItemID="cbServername_GetItemID"/>
      <button id="btnServernameLoeschen"
              label="Löschen"
              imageMso="DeleteTable"
              onAction=_
                  "btnServernameLoeschen_OnAction"/>
    </layoutContainer>
    ...
  </topItems>
</group>

Die comboBox kennt dieselben Item-Callbacks wie das dropDown, zusätzlich aber getText und onChange für den frei eingebbaren Text. onChange wird sowohl bei freier Eingabe als auch bei Auswahl aus der Liste aufgerufen. Der neue Servername wird dabei automatisch in der History gespeichert, sofern er noch nicht vorhanden ist.

Bevor wir uns die Callbacks anschauen, werfen wir einen Blick auf die Prozeduren, mit denen wir die Servernamen laden und einen neu eingegebenen Servernamen speichern. Diese finden wir in Listing 2.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar