Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 3/2004.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

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.

Warum Daten übernehmen?

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.

Vorgehensweise

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.
  • Abb. 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).

    Beispieldatenbank

    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 (s. Abb. 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...
  • Tabellenverknüpfungen
    erstellen und löschen

    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 (s. Abb. 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

    Abb. 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.

    Import "allein stehender"
    Tabellen

    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.

    Die Funktion ImportTable (s. Quellcode 3) dient zum Import der Daten einer externen Tabelle und hat fünf Parameter:

  • strDatabaseSource: Datenbank, aus der die Daten importiert werden
  • strTableSource: Quelltabelle
  • strTableDestination: Zieltabelle
  • strTableSourceTemp: Name der verknüpften Tabelle in der Zieldatenbank
  • strInsertSQL: Insert-Statement, mit dem die Daten aus der verknüpften Tabelle in die Zieltabelle geschrieben werden
  • Die Funktion verwendet zunächst die bereits beschriebene Funktion LinkTable, um eine Verknüpfung zu der Tabelle herzustellen, aus der die Daten importiert werden sollen. Wenn die Verknüpfung hergestellt ist, wird die angegebene Insert-Abfrage und somit der eigentliche Import ausgeführt und die Verknüpfung zu der Quelltabelle wieder entfernt - natürlich über die oben genannte Funktion UnlinkTable.

    Der Funktionsaufruf für den Import der Tabelle Personal ist wegen der vielen Felder der Tabelle relativ umfangreich:

    Call ImportTable("<Pfad>\Nordwind.mdb", 
    "Personal", "Personal", "PersonalTemp", 
    "INSERT INTO Personal(Nachname, Vorname, 
    Position, Anrede, Geburtsdatum, 
    Einstellung, Straße, Ort, Region, PLZ, 
    Land, [Telefon privat], [Durchwahl Büro], 
    Foto, Bemerkungen, [Vorgesetzte(r)]) 
    SELECT Nachname, Vorname, Position, 
    Anrede, Geburtsdatum, Einstellung, 
    Straße, Ort, Region, PLZ, Land, 
    [Telefon privat], [Durchwahl Büro], Foto, 
    Bemerkungen, [Vorgesetzte(r)] ‚
    FROM PersonalTemp")

    Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

    Sind Sie Abonnent?Jetzt einloggen ...
     

    Kompletten Artikel lesen?

    Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

    E-Mail:

    Verwandte Beiträge:

    Outlook und Access - Import und Export von Access-Daten

    © 2003-2015 André Minhorst Alle Rechte vorbehalten.