Datensätze speichern

Previous  Next

 

 

 

Letzte Änderung 24.02.2010

In Datenbank schreiben

Für dieses Beispiel benötigen Sie das Beispiel-Projekt fahrzeuge.xdev

 

Mit der Anweisung hmtoggle_plus1 XDEV WriteDB | XDEV NLS: XDEV DatenbankSchreiben können Sie die Daten einer Virtuellen Tabelle in eine Datenbank-Tabelle übertragen und somit speichern. Dabei können Sie festlegen, ob die Daten in der Datenbank-Tabelle vorne eingefügt, hinten angehängt oder ob die Daten lediglich aktualisiert werden sollen. Mit  hmtoggle_plus1 XDEV WriteDB | XDEV NLS: XDEV DatenbankSchreiben können Sie die Daten in eine beliebige Datenbank-Tabelle speichern. Tabellen- und Datenfeld-Namen müssen dabei nicht zwingend mit der Virtuellen Quell-Tabelle übereinstimmen. Die Datentypen dagegen müssen gleich sein. Mit Hilfe eines Assistenten können Sie die entsprechenden Datenfelder miteinander verbinden (Mapping).

 

 

clip0515

 

 

 

» Datenquelle und Ziel im Assistenten festlegen «

 

Option

Erklärung

Virtuelle

Quell-Tabelle

 

Virtuelle Tabelle, in der die zu übertragenden Datensätze stehen.

 

Name der

DB-Tabelle (Ziel)

Name der Datenbank-Tabelle, in welche die Datensätze geschrieben werden sollen. Ggf. müssen Sie hier den Namen der Datenbank-Tabelle manuell eingeben.

 

 

Füll-Methode

Die Datensätze können auf 3 Arten in die Datenbank-Tabelle geschrieben werden.

 

Option

Erklärung

Einfügend

(Insert)

Hängt die Datensätze einer Virtuellen Tabelle an bereits existierende Datensätze einer Datenbank-Tabelle. In der Datenbank-Tabelle bereits vorhandene Datensätze werden durch diese Aktion nicht verändert.

 

Aktualisieren

(Update)

Bestimmte Datensätze werden in der Datenbank-Tabelle aktualisiert. Bei Bedingung definieren können Sie festlegen, welche Datensätze in der Datenbank-Tabelle aktualisiert werden sollen.

 

Löschen

(Delete)

Löscht alle Datensätze in der Datenbank-Tabelle. Die Datensätze der Virtuellen Tabelle werden dabei jedoch nicht in die Datenbank-Tabelle geschrieben. Bei Bedingung definieren können Sie die Lösch-Aktion eingrenzen und festlegen, welche Daten in der Datenbank-Tabelle gelöscht werden sollen.

 

Hinweis: Zur besseren Lesbarkeit des Codes sollten Sie zum Löschen jedoch die Anweisung hmtoggle_plus1 XDEV DeleteDB | XDEV NLS: XDEV AusDatenbankLöschen verwenden.

 

 

» Verschiedene Füll-Methoden «

Bei Füll-Methode können Sie festlegen, wie die Datensätze der Virtuellen Tabelle in die Datenbank-Tabelle eingefügt werden sollen, einfügend (Insert) oder aktualisierend (Update). Mit der Option Löschen (Delete) lassen sich Daten sogar in der Datenbank-Tabelle löschen. Bei Bedingung definieren können Sie mit Hilfe einer Bedingung festlegen, welche Datensätze aktualisiert, bzw. gelöscht werden sollen.

 

 

» Datenfelder angleichen «

Beim Schreiben von Datensätzen erhält die Datenbank-Tabelle alle Datensätze von der Virtuellen Quell-Tabelle. Hier verknüpfen Sie die Felder der Virtuellen Quell-Tabelle mit den dazugehörigen Datenfeldern der Datenbank-Tabelle. I.d.R. ist die Virtuelle Tabelle ein exaktes Abbild der Datenbank-Tabelle, sodass die Datenfeld-Namen identisch sind. Wenn Sie die Daten jedoch in eine andere Datenbank-Tabelle übertragen möchten, dann müssen Sie hier die Datenfeld-Namen entsprechend umbenennen. Das ID-Feld bleibt i.d.R. frei, da die ID von der Datenbank vergeben wird.

 

clip0516

 

 

» Konkurrierende Zugriffe - Locking «

Beim Speichern von Datensätzen kann es theoretisch zu konkurrierenden Zugriffen kommen, vor allem in großen Datenbank-Anwendungen. Dies ist dann der Fall, wenn mehrere Anwender denselben Datensatz zur gleichen Zeit bearbeiten oder speichern möchten. Datenbanken können bei "gleichzeitigem" Speichern Zeitunterschiede im Mikrosekunden-Bereich festzustellen, sodass das System immer in der Lage sein wird, eine Reihenfolge für die eingehenden Schreibfunkionen festzulegen. Die Problematik besteht vielmehr darin, dass nur die Änderung des Anwenders erhalten bleibt, dessen Speichervorgang als letztes ausgeführt wird. Alle anderen Änderungen werden überschrieben und gehen verloren. Dazu kommt, dass die betroffenen Anwender gar nicht bemerken, dass ihre Änderungen fast zeitgleich wieder überschrieben wurden. Dadurch kann die Qualität der Anwendung erheblich beeinträchtigt werden und erfordert einen unnötig hohen Aufwand für Kontrollen und ggf. Nachbearbeitungen.

 

Für diese Problematik gibt es grundsätzlich 2 verschiedene Lösungsansätze. Beim sog. optimistischen Verfahren wird ein zur Bearbeitung anstehender Datensatz markiert, z.B. mit einer Versionsnummer, die jeweils um den Wert 1 erhöht wird, oder mit Hilfe eines eindeutigen Zeitstempels (Timestamp). Vor dem Speichern kann dann nochmals überprüft werden, ob sich die Versionsnummer oder der Timestamp während der Bearbeitung geändert hat. Evt. Veränderungen können ggf. angezeigt und berücksichtigt werden. Ansonsten kann der editierte Datensatz sorglos gespeichert werden. Für eine Markierung müssen Sie die entsprechenden Daten lediglich mit einem Datenfeld erweitern.

 

Beim sog. pessimistischen Verfahren wird der zur Bearbeitung anstehende Datensatz für alle anderen, zumindest für schreibenden Zugriffe gesperrt. Dies kann mit Hilfe eines Flags (z.B. 0 = frei, 1 = gesperrt) oder mit Boolischen Werten erfolgen. Auch die Speicherung der Anwender-ID ist denkbar. Durch die entsprechende Information können andere Anwender sogar darüber informiert werden, dass der jeweilige Datensatz im Moment gerade bearbeitet wird und ggf. sogar von wem. Das große Problem bei diesem Verfahren ist jedoch, dass es dabei zu sog. Dead-Locks kommen kann, z.B. wenn ein Anwender vergisst, den bearbeiteten Datensatz wieder frei zu geben oder wenn es zu einem Absturz des Anwender-Rechners kommt, o.Ä. Eine mögliche Lösung kann u.A. ein Timeout-Szenario sein.

 

XDEV 2 stellt für die Lösung von konkurrierenden Zugriffen keine fertige Pauschallösung zur Verfügung.

 

 

» Alternative: Virtuelle- mit Datenbank-Tabelle synchronisieren «

Daten in einer Virtuellen Tabelle lassen sich alternativ auch mit der Methode hmtoggle_plus1 synchronizeChangedRows( ) | XDEV NLS: synchronisiereGeänderteZeilen( ) abspeichern, die Ihnen die Virtuelle Tabelle bietet. Hierbei muss jedoch die Datenbank-Tabelle exakt der Virtuellen Tabelle entsprechen, u.a. Tabellen-Name sowie Anzahl und Namen der Datenfelder. Die Synchronisierung findet jedoch nur in 1 Richtung statt, und zwar von der Virtuellen Tabelle zur Datenbank-Tabelle. Die Methode schreibt dabei nur die Daten in die Datenbank-Tabelle, die sich in der Virtuellen Tabelle geändert haben oder neu hinzu gekommen sind. Die Virtuelle Tabelle bleibt dagegen unverändert.

 

 

Hinweis: Speicher-Aktionen sollten Sie möglichst immer als Transaktion durchführen, denn wenn es während der Transaktion zu einem unvorhergesehenen Fehler kommt, führt die Datenbank automatisch einen sog. Rollback durch und stellt den  Ausgangszustand wieder her. Ansonsten können bei einem Fehler inkonsistente Daten entstehen.

 

Tipp: Die Anweisung hmtoggle_plus1 XDEV WriteDB | XDEV NLS: XDEV DatenbankSchreiben sollten Sie immer in eine hmtoggle_plus0 try-catch Anweisung setzen.

 

 

Basiswissen: Virtuelle Tabellen, Transaktionen