Moin. Ich bin Sönke SchÀfer, der DatenschÀfer. Und wenn Du wie ich tÀglich mit Access, VBA und SQL Server arbeitest, dann kennst Du das Thema: Verbindungen zur Datenbank. Stabil sollen sie sein. Sicher. Und wartungsarm. Nur leider sieht die RealitÀt oft anders aus.
DSNs, die nur lokal funktionieren. Passwörter im Klartext. Benutzer, die ihre Verbindung verlieren. Ich zeig Dir heute, wie Du das besser machst. DSN-less, mit Trusted Connection – und voll per VBA steuerbar.
Warum DSN-less?
Weil’s einfacher ist. Keine ODBC-EintrĂ€ge auf jedem Client. Kein „Funktioniert nur bei mir“. Nur ein sauberer Connect-String, zentral verwaltet. Und: Du hast die volle Kontrolle im Code.
Variante 1: Trusted Connection mit Windows-Login
Ideal fĂŒr interne Anwendungen. Kein Passwort im Code. Berechtigungen laufen ĂŒber das Windows-Konto.
Function GetTrustedConnection() As ADODB.Connection Dim conn As ADODB.Connection Set conn = New ADODB.Connection Dim connStr As String connStr = "Driver={ODBC Driver 17 for SQL Server};" & _ "Server=DEINSERVER\SQLINSTANCE;" & _ "Database=DEINEDATENBANK;" & _ "Trusted_Connection=yes;" & _ "Encrypt=yes;" & _ "TrustServerCertificate=yes;" & _ "Connection Timeout=30;" conn.Open connStr Set GetTrustedConnection = connEnd Function
Voraussetzung: Der angemeldete Benutzer hat Zugriff auf den SQL Server.
Variante 2: SQL-Login (nicht empfohlen, aber manchmal nötig)
Function GetSqlLoginConnection() As ADODB.Connection Dim conn As ADODB.Connection Set conn = New ADODB.Connection Dim connStr As String connStr = "Driver={ODBC Driver 17 for SQL Server};" & _ "Server=DEINSERVER;" & _ "Database=DEINEDATENBANK;" & _ "Uid=appuser;" & _ "Pwd=geheim;" & _ "Encrypt=yes;" & _ "TrustServerCertificate=yes;" & _ "Connection Timeout=30;" conn.Open connStr Set GetSqlLoginConnection = connEnd Function
Hier bitte mitdenken: Das Passwort sollte nie im Code stehen. Lieber verschlĂŒsselt in einer Konfigtabelle oder Registry speichern.
Verbindung testen vor dem Ăffnen
Du willst nicht, dass Deine Anwendung abstĂŒrzt, wenn der Server nicht erreichbar ist? Dann prĂŒf die Verbindung vorher:
Function IstVerbindungMoeglich(connStr As String) As Boolean On Error GoTo Fehler Dim c As ADODB.Connection Set c = New ADODB.Connection c.Open connStr IstVerbindungMoeglich = True c.Close Exit FunctionFehler: IstVerbindungMoeglich = FalseEnd Function
Beispiel: Daten per Recordset holen
Sub ZeigeKundennamen() Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset rs.Open "SELECT Name FROM Kunde", GetTrustedConnection, adOpenForwardOnly, adLockReadOnly Do While Not rs.EOF Debug.Print rs!Name rs.MoveNext Loop rs.Close Set rs = NothingEnd Sub
Pro-Tipp: Mehr Speed mit vorbereiteten Abfragen
Statt direkt SQL zu schreiben, kannst Du auch Prozeduren aufrufen und Parameter ĂŒbergeben:
Dim cmd As ADODB.CommandSet cmd = New ADODB.CommandSet cmd.ActiveConnection = GetTrustedConnectionWith cmd .CommandText = "dbo.GetKundeNachID" .CommandType = adCmdStoredProc .Parameters.Append .CreateParameter("@ID", adInteger, adParamInput, , 123)End WithSet rs = cmd.Execute
Das ist schnell. Sicher. Und ĂŒbersichtlich.
Fazit vom DatenschÀfer
Wenn Du in einem KMU unterwegs bist und mit SQL Server arbeitest, dann ist die Verbindung Dein Nadelöhr. Mit DSN-less-Verbindungen hast Du mehr Kontrolle. Mit Trusted Connection sparst Du Dir die Passwortpflege. Und wenn’s doch mit SQL-Login sein muss, dann bitte mit Bedacht.
Ich helf Dir gern dabei, das in Deiner Umgebung sauber umzusetzen. Norddeutsch. Klar. Ohne Gedöns.
DatenschĂ€fer: Analyse, Auswertung und Automatisierung fĂŒr KMU im Norden đ