Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
ODBC Anbindung von SQL Server und MySQL Server Tabellen
zurück: Aktueller Bildschirm drucken (PrintScreen) weiter: Export nach Excel mit allem Drum und Dran Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Tutorial Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
MAPWARE
Access Profi(l)neurotiker


Verfasst am:
18. Jun 2009, 17:46
Rufname:
Wohnort: Hannover

ODBC Anbindung von SQL Server und MySQL Server Tabellen - ODBC Anbindung von SQL Server und MySQL Server Tabellen

Nach oben
       Version: Office XP (2002)

Hi,

immer wieder taucht die Frage auf, wie man Tabellen, die in einem MS-SQL oder MySQL Server liegen, in Access per VBA einbindet / verknüpft / neu verknüpft / wieder einbindet usw.
Dafür kann man zwar ODBC Treiber benutzen, eine ODBC-DSN erstellen und dann den Tabellenverknüpfungsmanager von Access heranziehen um das zu verwalten, elegant ist das jedoch nicht. Die grundsätzliche Funktionalität für die Benutzung in VBA habe ich hier in eine einzige Funktion gekapselt, die zumindest mit MS-SQL und MySQL Datenbanken problemlos funktioniert, im Prinzip aber mit allen ODBC abfragbaren Datenbanken funktionieren sollte. Wenn die Treiber für den jeweiligen Server installiert sind, kann man sofort loslegen.

Den Code bitte wie üblich in ein neues Modul (meinetwegen modConnect) einfügen und den Verweis auf die DAO Bibliothek nicht vergessen.

Aufgerufen wird die Funktion mindestens mit dem Namen der Quelltabelle und einem Verbindungsstring. Wer nicht weiss, wie die Verbindungsstrings aussehen müssen, findet diese auf der Webseite: The connection string reference und jeweils unter ODBC Verbindungen.

Ein Beispiel:

MS-SQL
SQL Server 2000

Datenbank: DatenHaufen1
Server: BENDER
Tabelle: Kunden

aus der Seite ConnectionStrings
Code:
Driver={SQL Server};Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;
aufrufen mit:
Code:
    Dim Result As Boolean
   
    Result = ConnectTable("Kunden", "ODBC;Driver={SQL Server};" & _
                          "Database=Datenhaufen1;Server=BENDER")
Das klappt aber nur, wenn die Trusted_Connections eingerichtet sind. Ansonsten poppt der Anmeldedialog auf.
Wenn ich Benutzername und Passwort mit in den Verbindungsstring hineinschreibe, dann klappt das auch ohne Nachfrage. Ganz ähnlich wäre MySQL
Code:
Driver={MySQL ODBC 3.51 Driver};Server=localhost;Database=myDataBase; User=myUsername;Password=myPassword;Option=3;
Wer lieber mit ODBC DSN arbeitet, die ja nichts sind, als kleine Textdateien, die eben diese Info enthalten, kann das aber auch tun.
z.B.
Code:
    Dim result AS Boolean
   
    result = ConnectTable("Kunden","ODBC;DSN=NamederDSN")
Wer die Tabellen im Frontend anders benennen möchte/muss kann auch einen Alias angeben. Die Tabelle taucht dann mit diesem Namen unter den Tabellen auf.
Code:
    Dim result AS Boolean
   
    result = ConnectTable("Kunden","ODBC;DSN=NamederDSN","Kundendaten")
Wer Tabellen verknüpfen muß, die auf dem Server keinen Primärschlüssel haben, kann einen festlegen, dadurch man dann trotzdem auch Daten hinzufügen und die Tabelle bearbeiten.
Code:
    Dim result As Boolean
   
    result = ConnectTable("Kunden", "ODBC;DSN=NamederDSN", "Kundendaten", _
                          "Kundennummer, PLZ")
Es wäre nun recht einfach, zum Beispiel eine Tabelle mit zu verknüpfenden Tabellen zu führen, und diese in einem Recordset einfach abzulaufen.

Hier nun der eigentliche Code, der noch zwei Hilfsfunktionen mitbringt, mit denen ich sicherstelle, das die eventuell vorhandene alte Tabelle geschlossen und gelöscht wird. Das ist notwendig, weil ansonsten Strukturänderungen der verknüpften Tabellen, die auf dem Server stattfinden, zu Fehlern auf dem Frontend führen.
Code:
Option Compare Database
Option Explicit

Public Function ConnectTable(SourceTable As String, _
                             Connection As String, _
                             Optional Alias As Variant, _
                             Optional PrimaryKey As Variant) As Boolean
On Error GoTo ConnectTable_Error
    Dim tdf As DAO.TableDef
    Dim LocalTable As String
    Dim DB As DAO.Database
   
    If IsMissing(Alias) Then
        LocalTable = SourceTable
      Else
        LocalTable = Alias
    End If
    LocalTable = Replace(LocalTable, ".", "_")
    If AccObjectExists(acTable, LocalTable) Then
        If AccObjectIsLoaded(acTable, LocalTable) Then
            DoCmd.Close acTable, LocalTable, acSaveNo
        End If
        DoCmd.DeleteObject acTable, LocalTable
    End If
    Set DB = CurrentDb()
    Set tdf = DB.CreateTableDef(LocalTable, 0, SourceTable, Connection)
    DB.TableDefs.Append tdf
    If Not IsMissing(PrimaryKey) Then
        DB.Execute "CREATE INDEX PK_" & LocalTable & " ON " & LocalTable & _
                   "(" & PrimaryKey & ")"
    End If
    ConnectTable = True
    Set DB = Nothing
ConnectTable_Exit:
    On Error GoTo 0
    Exit Function
ConnectTable_Error:
    ConnectTable = False
    MsgBox Err.Description, vbExclamation, _
           "Tabellenverbindung meldet Fehler " & Err.Number
    Resume ConnectTable_Exit
End Function

Public Function AccObjectIsLoaded(objType As AcObjectType, _
                                  objName As String) As Boolean
    Dim obj As AccessObject
    Dim coll As Object
       
    Select Case objType
      Case acTable
        Set coll = CurrentData.AllTables
      Case acQuery
        Set coll = CurrentData.AllQueries
      Case acForm
        Set coll = CurrentProject.AllForms
      Case acReport
        Set coll = CurrentProject.AllReports
      Case acModule
        Set coll = CurrentProject.AllModules
      Case acMacro
        Set coll = CurrentProject.AllMacros
      Case acDataAccessPage
        Set coll = CurrentProject.AllDataAccessPages
      Case acFunction
        Set coll = CurrentData.AllFunctions
      Case Else
        Exit Function
    End Select
    For Each obj In coll
        If obj.Name = objName Then
            AccObjectIsLoaded = (obj.IsLoaded = True)
            Exit Function
        End If
    Next obj
    Set coll = Nothing
End Function

Public Function AccObjectExists(objType As AcObjectType, _
                                objName As String) As Boolean
    Dim obj As AccessObject
    Dim coll As Object
   
    Select Case objType
      Case acTable
        Set coll = CurrentData.AllTables
      Case acQuery
        Set coll = CurrentData.AllQueries
      Case acForm
        Set coll = CurrentProject.AllForms
      Case acReport
        Set coll = CurrentProject.AllReports
      Case acModule
        Set coll = CurrentProject.AllModules
      Case acMacro
        Set coll = CurrentProject.AllMacros
      Case acDataAccessPage
        Set coll = CurrentProject.AllDataAccessPages
      Case acFunction
        Set coll = CurrentData.AllFunctions
      Case Else
        Exit Function
    End Select
    For Each obj In coll
        If obj.Name = objName Then
            AccObjectExists = True
            Set coll = Nothing
            Exit Function
        End If
    Next obj
    AccObjectExists = False
    Set coll = Nothing
End Function

_________________
Grüße
Marcus

Wer Controls nicht sinnvoll benennt, wird es später bereuen.
Willi Wipp
Moderator


Verfasst am:
01. Jul 2009, 13:44
Rufname:
Wohnort: Raum Wiesbaden


Re: ODBC Anbindung von SQL Server und MySQL Server Tabellen - Re: ODBC Anbindung von SQL Server und MySQL Server Tabellen

Nach oben
       Version: Office XP (2002)

Hi MAPWARE,

Danke fuer die ausfuehrliche Beschreibung.

{Dieser Beitrag nimmt das Thema aus den unbeantworteten Themen heraus}
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Diese Seite Freunden empfehlen

Seite 1 von 1
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

Verwandte Themen
Forum / Themen   Antworten   Autor   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Access Tabellen & Abfragen: Daten aus mehreren Tabellen in einer Gesamttabelle richtig e 5 hoschi 1573 04. Jun 2004, 13:01
stpimi Daten aus mehreren Tabellen in einer Gesamttabelle richtig e
Keine neuen Beiträge Access Tabellen & Abfragen: 2 tabellen vergleichen 4 Lordoo88 1555 03. Jun 2004, 16:43
Lordoo88 2 tabellen vergleichen
Keine neuen Beiträge Access Tabellen & Abfragen: Zwei Tabellen zusammenfügen und Nullwerte überschreiben 1 m.hataj 1304 13. Mai 2004, 18:10
faßnacht(IT); Zwei Tabellen zusammenfügen und Nullwerte überschreiben
Keine neuen Beiträge Access Tabellen & Abfragen: kriterium - datensatz nur in einer von zwei tabellen 3 budking82 1000 11. Mai 2004, 12:59
budking82 kriterium - datensatz nur in einer von zwei tabellen
Keine neuen Beiträge Access Tabellen & Abfragen: Case (SQL) auch in Access möglich?? 4 Doro 14281 07. Mai 2004, 07:53
Gast Case (SQL) auch in Access möglich??
Keine neuen Beiträge Access Tabellen & Abfragen: SQL - Union oder join Abfrage 4 Franzi 1495 05. Mai 2004, 15:18
Franzi SQL - Union oder join Abfrage
Keine neuen Beiträge Access Tabellen & Abfragen: Abfrage erstelen, die zwei tabellen vergleicht 2 pucky 802 27. Apr 2004, 10:53
ProLogistik Abfrage erstelen, die zwei tabellen vergleicht
Keine neuen Beiträge Access Tabellen & Abfragen: Abgleich von 2 tabellen in access 2003 4 Fierce 1719 16. Apr 2004, 08:27
el_gomero Abgleich von 2 tabellen in access 2003
Keine neuen Beiträge Access Tabellen & Abfragen: datensatz aus mehreren Tabellen im formular anzeigen 1 SixPack 1197 29. März 2004, 10:53
Willi Wipp datensatz aus mehreren Tabellen im formular anzeigen
Keine neuen Beiträge Access Tabellen & Abfragen: neue Tabellen erzeugen; kopieren 7 DiplomandSPS 1323 25. März 2004, 10:01
fridgenep neue Tabellen erzeugen; kopieren
Keine neuen Beiträge Access Tabellen & Abfragen: Tabellen verknüpfen 1 darkblue82 802 05. März 2004, 12:00
lothi Tabellen verknüpfen
Keine neuen Beiträge Access Tabellen & Abfragen: Doppelte Datensätze MySQL 8 computerbabalulu 1696 12. Feb 2004, 17:11
Willi Wipp Doppelte Datensätze MySQL
 

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: PHP JavaScript