Announcement

Collapse
No announcement yet.

SQL View automatisiert in Access als Datenquelle bereitstellen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQL View automatisiert in Access als Datenquelle bereitstellen

    Hallo!

    Ich habe hier ein ODBC-Problem welches gelöst werden muss.
    Ein neuer SQL Server löst nach mehreren Jahren die alten Access Datenbanken ab.

    Als Übergangsvariante sollen weiterhin die alten Access 2003 Formulare auf den neuen SQL-Server zugreifen.
    Dafür wurden mit Microsoft SQL Server Management Studio 2008 ein SQL-View erstellt welcher die ehemaligen Access-Hauptdaten nachstellt. Für einen einzelnen Arbeitsplatz kann ich dann manuell den SQL-View über die ODBC-Schnittstelle einbinden. Das funktioniert auch alles wunderbar aber das Problem ist die manuelle View-Einbindung für jeden Arbeitsplatz.
    Ich suche also eine Möglichkeit das jeder PC im Netzwerk auf die alte *.mde-Datei zugreifen kann und das sich beim Öffnen automatisch eine Verbindung zum SQL-View einrichtet.

    Kann mir jemand helfen?

    Viele Grüße,
    Micha

  • #2
    Ich nehme an, die *.mde - Datei soll neu vertreilt werden? Dann muss sie ja 'nur' die ODBC - Datenquelle einrichten; die Datenbankverknüpfung ist dann von überall die gleiche (sofern man die ODBC - DSN überall gleich benennt).

    Dann wäre das hier ein Lösungsansatz:
    [highlight=vb]

    Global Const HKEY_CLASSES_ROOT = &H80000000
    Global Const HKEY_CURRENT_USER = &H80000001
    Global Const HKEY_LOCAL_MACHINE = &H80000002
    Global Const HKEY_USERS = &H80000003


    Declare Function RegCloseKey Lib "advapi32.dll" _
    (ByVal hKey As Long) As Long

    Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias _
    "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, _
    ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As _
    Long) As Long

    Declare Function RegQueryValueExString Lib "advapi32.dll" Alias _
    "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
    String, ByVal lpReserved As Long, lpType As Long, ByVal lpData _
    As String, lpcbData As Long) As Long

    Public Declare Function SQLConfigDataSource Lib "ODBCCP32.DLL" ( _
    ByVal hwndParent As Long, _
    ByVal fRequest As Long, _
    ByVal lpszDriver As String, _
    ByVal lpszAttributes As String _
    ) As Long

    Function QueryValue(StartDirectory, sKeyName As String, sValueName As String) As String
    '*****************************
    ' Diese Function gibt den Wert eines Keys zurück, der in der Registry steht.
    '
    ' Beispiel: QueryValue(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Shared Tools\MSInfo", "Path")
    '
    ' Gibt den korrekten Dateinamen incl. Pfad für MSINFO32 zurück oder einen Leerstring, wenn nicht installiert
    ' StartDirectory muß eine der folgenden Variablen sein:
    '
    ' HKEY_CLASSES_ROOT
    ' HKEY_CURRENT_USER
    ' HKEY_LOCAL_MACHINE
    ' HKEY_USERS
    '
    ' Den Wert, den man sucht, ermittelt man am besten zuerst manuell aus der Registry,
    ' in dem man direkt in der Registry sucht ...
    '
    ' Näheres siehe unter: HOWTO - Use the Registry API to Save and Retrieve Setting.htm
    ' und: Controlling Entries in the Operating System Registry
    '*******************************

    Dim lRetVal As Long 'result of the API functions
    Dim hKey As Long 'handle of opened key
    Dim vValue As Variant 'setting of queried value

    lRetVal = RegOpenKeyEx(StartDirectory, sKeyName, 0, KEY_ALL_ACCESS, hKey)
    lRetVal = QueryValueExString(hKey, sValueName, vValue)

    QueryValue = vValue & ""
    RegCloseKey (hKey)
    End Function

    Public Function CreateDSN(ByVal strDriver As String, ByVal strConnectionString As String) As Boolean
    Dim lngRetVal As Long

    lngRetVal = SQLConfigDataSource(0, ODBC_ADD_DSN, strDriver, strConnectionString)
    CreateDSN = CBool(lngRetVal)

    End Function


    Public Function ODBC_Test(Optional anlegen As Boolean = True) As String
    Dim odbc As String
    Dim sSQL As String
    Dim result As String

    On Error Resume Next

    ' gibt's die DSN schon?
    odbc = QueryValue(HKEY_LOCAL_MACHINE, "SOFTWARE\ODBC\ODBC.INI\" + [ODBC-DSN-Name], "Server")


    If NZ(odbc,"") = "" Then

    result = "ODBC FEHLT!"
    ' neue User ODBC Verbindung anlegen für SA:
    If anlegen Then
    If CreateDSN("SQL Server", "DSN=" + [ODBC-DSN-NAME] & vbNullChar & "Server=" & [IP oder SERVERNAME] & vbNullChar & "Database=" + [SQL DB - NAME]) Then result = "ODBC angelegt"
    End If
    DoEvents


    Else
    result = "ODBC Vorhanden"
    End If
    End Function


    ' ...
    'Aufruf irgendwo aus dem Startformular
    ..
    msg=ODBC_Test
    ...

    [/highlight]

    Ist alles etwas gekürzt, bitte google ggf. nach den einzelnen Funktionen
    Prinzip sollte aber klar werden:
    In der Registry suchen, ob die DSN existiert, wenn nicht, dann anlegen.

    Viel Erfolg.

    P.S. Testet eure umgestellte Anwendung auch hinsichtlich der Performance, da kann man bei solchem Projekt BÖSE Überraschungen erleben.

    Tino
    Zuletzt editiert von tinof; 20.09.2010, 13:03.
    Ich habs gleich!
    ... sagte der Programmierer.

    Comment


    • #3
      Ich gaube das würde mein Problem lösen aber ich habe nun eine Lösung gefunden die akzeptabel und schnell umsetzbar ist. Ich habe ein *.reg-File welches auf jeden PC der das Access File nutzt einmal ausgeführt werden muss. Das *.reg-File legt die notwendige ODBC-Systemdatenquelle an. Ist zwar nicht absolut automatisch aber aktzeptabel. Das einarbeiten in die komplette Automatisierung der Verbindung würde mir ungerechtfertigt viel Zeit nehmen. Habe ich mal die Zeit dann nehme ich mir den Quelltext nochmal zur Hand.

      Danke für die gute Hilfe!

      Viele grüße,
      Micha

      Comment


      • #4
        Das geht natürlich bei einer überschaubaren, räumlich beieinanderliegenden Anzahl von Clients und den entsprechenden Rechten auch!

        Viel Erfolg
        Tino
        Ich habs gleich!
        ... sagte der Programmierer.

        Comment

        Working...
        X