Datenübernahme von Datenbank zu Datenbank

André Minhorst, Duisburg

Neue Versionen von Datenbankanwendungen müssen eine Möglichkeit bieten, die Daten der Vorgängerversion zu importieren. Optimalerweise erfolgt dieser Import weitgehend automatisch, was aber einiges an Vorarbeit bei der Entwicklung der neuen Version erfordert. Damit Sie den Benutzern Ihrer Datenbank größtmöglichen Komfort beim Versionswechsel ermöglichen können, lernen Sie im vorliegenden Beitrag einige Varianten für den Import bestehender Daten in eine neue Datenbank kennen.

Es gibt prinzipiell zwei Arten von änderungen an Datenbankanwendungen: Die erste betrifft die Benutzeroberfläche, worunter unter Access Abfragen, Formulare und Berichte sowie die in den Klassen- und Standardmodulen versteckte Programmlogik fallen. Die zweite Art von änderungen zielt auf das Datenmodell und damit auf die in einer Datenbank enthaltenen Tabellen.

Der wichtigste Unterschied der beiden Arten ist, dass die erste durch den Austausch der Benutzeroberfläche, die theoretisch in einem Datenbankfrontend gekapselt sein könnte, erledigt werden kann. Und selbst, wenn die Benutzeroberfläche und die Daten in derselben Datenbank untergebracht sind, können Sie immer noch eine neue Datenbank mit angepasster Benutzeroberfläche, aber ohne Tabellen als neues Datenbankfrontend verwenden. In dem Fall würden Sie die bestehende Datenbank, die ja gleichzeitig Frontend und Backend ist, in ein Backend umfunktionieren, auf das die neue Frontenddatenbank zugreift.

Wenn Sie aber das Datenmodell ändern, reicht es nicht aus, einfach das neue Datenbankbackend als Backend zu verwenden und die vormals komplette Datenbankanwendung in eine Frontenddatenbank umzufunktionieren, indem Sie die Datenbank einfach mit den Tabellen der neuen Backendtabelle verknüpfen. Sie müssen ja immer noch die Daten aus der alten Datenbank in das neue Datenmodell übertragen.

Und wenn Sie das ohnehin erledigen müssen, können Sie auch direkt eine komplett neue Datenbank liefern, die vielleicht auch noch überarbeitungen an der Benutzeroberfläche beinhaltet, und die bestehenden Daten in die neue Datenbank übernehmen.

Und hier sitzt der Hase im Pfeffer: Der für die Datenübernahme erforderliche Algorithmus ist nämlich erstens keineswegs trivial und zweitens sicher von Datenbank zu Datenbank unterschiedlich.

Eine der wichtigsten Aufgaben vor der Entwicklung einer Routine für den Import bestehender Daten in eine neue Datenbank ist die Analyse der Datenmodelle der alten und der neuen Datenbank. Einige grobe Hindernisse bei der einfachen übernahme der Daten sind folgende:

  • Das neue Datenmodell enthält Primärschlüsselfelder mit dem Felddatentyp Autowert. Die Werte dieser Felder können nicht ohne größeren Aufwand in die neue Datenbank übernommen werden.
  • Bild 1: Import der Tabellenstruktur der Nordwinddatenbank

  • Das Datenmodell der neuen Datenbank unterscheidet sich grob vom Vorgänger. Das kann zum Beispiel darin begründet sein, dass das bestehende Datenmodell nicht sauber normalisiert ist oder die Felddatentypen nicht den Ansprüchen genügen, weil beispielsweise ein Textfeld doch mehr Zeichen als eingeplant benötigt.
  • Abhängig von diesen und weiteren Faktoren gibt es unterschiedliche Möglichkeiten, Daten aus fremden Datenbanken zu importieren. Dabei fällt zumindest der Import mit dem entsprechenden Assistenten weg, da der Vorgang optimalerweise komplett automatisiert wird.

    Je unterschiedlicher die Strukturen der Quell- und der Zieldatenbank sind, desto aufwändiger wird der Import der Daten; in den meisten Fällen sollte die Verknüpfung der Quelltabellen mit der Zieldatenbank und die Verwendung einiger Aktionsabfragen aber ausreichend sein. In manchen Fällen kann aber auch die Verwendung von DAO beziehungsweise ADO erforderlich sein, um die alten Daten in das neue Format zu pressen.

    Für beide Vorgehensweisen kann das Verknüpfen der Zieldatenbank mit den Tabellen der Quelldatenbank hilfreich sein – das ist sogar Voraussetzung, wenn die Daten per Aktionsabfragen von einer zur anderen Datenbank geschaufelt werden sollen (s. Kapitel 4).

    Wenn die Quelldatenbank relational verknüpfte Tabellen enthält, deren Primärschlüsselwerte über Autowertfelder erzeugt werden, ist auch noch eine Anpassung der Zieltabellen erforderlich – mehr dazu in Kapitel 5.

    Sind die Zieltabellen auf den Import von verknüpften Tabellen mit oder ohne Autowertfelder vorbereitet, steht dem Import per Aktionsabfragen nichts mehr im Wege (s. Kapitel 7).

    Für die nachfolgenden Beispiele benötigen Sie zwei Beispieldatenbanken: eine mit den Originaldaten und eine mit der überarbeiteten Tabellenstruktur, die die Originaldaten aufnehmen soll.

    Als Originaltabelle dient die Nordwind-Datenbank und die zu füllende Datenbank können Sie mit Hilfe der folgenden Anleitung selbst erstellen:

  • Legen Sie eine neue, leere Datenbank an.
  • Führen Sie den Menübefehl Datei ( Externe Daten ( Importieren… aus.
  • Wählen Sie im nun erscheinenden Importieren-Dialog die Nordwind-Datenbank aus.
  • Wählen Sie alle Tabellen der Nordwind-Datenbank aus.
  • Erweitern Sie das Dialogfenster durch einen Klick auf die Schaltfläche Optionen.
  • Wählen Sie hier im Bereich Tabellen importieren die Option Nur Definitionen aus (siehe Bild 1). (
  • Public Sub DatenLoeschen()
        Dim db As DAO.Database
        Set db = CurrentDb
        On Error GoTo DatenLoeschen_Err
        db.Execute "DELETE FROM Bestelldetails", dbFailOnError
        db.Execute "DELETE FROM Artikel", dbFailOnError
        db.Execute "DELETE FROM Lieferanten", dbFailOnError
        db.Execute "DELETE FROM Kategorien", dbFailOnError
        db.Execute "DELETE FROM Bestellungen", dbFailOnError
        db.Execute "DELETE FROM Personal", dbFailOnError
        db.Execute "DELETE FROM Versandfirmen", dbFailOnError
        db.Execute "DELETE FROM Kunden", dbFailOnError
        Exit Sub
    DatenLoeschen_Err:
        MsgBox "Fehlernummer: " & Err.Number & vbCrLf & "Fehlerbeschreibung: " _        & Err.Description
    End Sub

    Quellcode 1

    Wenn Sie die Tabellen auf die genannte Weise importiert haben, müssen Sie nicht zuerst die Daten aus jeder einzelnen Tabelle löschen.

    Wenn Sie später den Urzustand der Tabellen reproduzieren, also die Daten löschen und die Autowertzähler wiederherstellen möchten, können Sie das auf zwei Arten durchführen:

  • öffnen Sie die Tabellen jeweils einzeln, markieren Sie alle Datensätze und löschen Sie diese oder erstellen Sie sich eine kleine Routine zum Löschen der Tabellen, die Sie per Aufruf im Testfenster starten (s. Quellcode 1). Dabei müssen Sie darauf achten, dass Sie immer erst die Daten aus den Tabellen löschen, auf die kein Fremdschlüsselfeld einer oder mehrerer anderer Tabellen verweist. Im Anschluss an das Löschen der Daten komprimieren Sie die Datenbank über den folgenden Menübefehl, wobei der Hauptzweck im Initialisieren der Autowertfelder liegt: Extras ( Datenbank-Dienstprogramme ( Datenbank komprimieren und reparieren…
  • Der einfachste Fall für den Import bestehender Daten ergibt sich, wenn die zu importierenden Daten aus Tabellen stammen, die nicht mit anderen Tabellen verknüpft sind. In dem Fall können die Daten einfach von der einen Tabelle in die andere importiert werden – gegebenenfalls sogar mit dem Import-Assistenten von Access. Da Sie hier allerdings automatisierte Möglichkeiten zum Import von Daten kennen lernen sollen, fällt diese Möglichkeit im Rahmen des vorliegenden Beitrags weg.

    Tabelle verknüpfen

    Die Funktion LinkTable dient der Erstellung einer Verknüpfung der aktuellen Datenbank mit einer Tabelle einer fremden Datenbank. Die Anwendung dieser Funktion sieht beispielsweise folgendermaßen aus:

    Call LinkTable("<Pfad>\Nordwind.mdb", _    "Artikel", "ArtikelTemp")

    Mit diesem Aufruf erstellen Sie eine Verknüpfung zu der Tabelle Artikel der Nordwind-Datenbank unter dem Namen ArtikelTemp (siehe Bild 2). Die Fehlerbehandlung der Funktion fängt einen Fehler gezielt ab. Dieser tritt auf, wenn bereits eine Tabelle mit dem Namen der zu erstellenden Verknüpfung vorhanden ist. In dem Fall wird die vorhandene Verknüpfung mit der weiter unten beschriebenen Funktion Unlink zunächst entfernt.

    Public Function LinkTable(strDatabaseSource As String, strTableSource As String, _    strTableDestination As String)
        Dim dbSource As DAO.Database
        Dim dbTarget As DAO.Database
        Dim tdf As DAO.TableDef
        On Error GoTo LinkTable_Err
        Set dbSource = DBEngine.Workspaces(0).OpenDatabase(strDatabaseSource)
        Set dbDestination = CurrentDb
        Set tdf = dbDestination.CreateTableDef(strTableDestination)
        tdf.Connect = ";DATABASE=" & strDatabaseSource
        tdf.SourceTableName = strTableSource
        dbDestination.TableDefs.Append tdf
        LinkTable = True
    LinkTable_Exit:
        dbSource.Close
        Set dbSource = Nothing
        Set dbDestination = Nothing
        Set tdf = Nothing
        Exit Function
    LinkTable_Err:
        If Err.Number = 3012 Then
            If UnlinkTable(strTableDestination) = True Then
                Resume
            Else
                LinkTable = False
            End If
        Else
            LinkTable = False
        End If
        Resume LinkTable_Exit
    End Function

    Quellcode 2

    Public Function UnlinkTable(strTable As String)
        Dim db As Database
        Set db = CurrentDb
        On Error GoTo UnlinkTable_Err
        db.TableDefs.Delete (strTable)
        UnlinkTable = True
    UnlinkTable_Exit:
        Set db = Nothing
        Exit Function
    UnlinkTable_Err:
        UnlinkTable = False
        GoTo UnlinkTable_Exit
    End Function

    Quellcode 3

    Bild 2: Eine frisch verknüpfte Tabelle im Datenbankfenster

    Verknüpfung löschen

    Public Function ImportTable(strDatabaseSource As String, strTableSource As String, _    strTableDestination As String, strTableSourceTemp As String, _    strInsertSQL As String)
        Dim db As Database
        Set db = CurrentDb
        On Error GoTo ImportTable_Err
        If LinkTable(strDatabaseSource, strTableSource, strTableSourceTemp) = True Then
            db.Execute (strInsertSQL), dbFailOnError
            UnlinkTable (strTableSource)
            ImportTable = True
        Else
            ImportTable = False
        End If
    ImportTable_Exit:
        Set db = Nothing
        Exit Function
    ImportTable_Err:
        ImportTable = False
        GoTo ImportTable_Exit
    End Function

    Quellcode 3

    Das Löschen der Verknüpfung per VBA erledigt die Funktion UnlinkTable (s. Quellcode 2). Sie verwendet die Delete-Methode der TableDefs-Auflistung des Database-Objekts mit dem Tabellennamen als einzigem Argument.

    Wenn Sie sich vorstellen, dass die Tabelle Personal der Nordwind-Datenbank nicht mit anderen Tabellen verknüpft ist, kann sie gut als Beispiel für den Import einer allein stehenden Tabelle dienen.

    Voraussetzung für die nachfolgend vorgestellte Vorgehensweise ist das Vorhandensein einer gefüllten Personaltabelle in der Nordwind-Datenbank und einer leeren Personaltabelle in der Beispieldatenbank.

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

    den kompletten Artikel im PDF-Format mit Beispieldatenbank

    diesen und alle anderen Artikel mit dem Jahresabo

    Schreibe einen Kommentar