Aktualisieren von Remotedaten mit Hilfe von SQL Pass-Through
Wenn Sie SQL Pass-Through-Funktionen einsetzen, um Daten auf einem Remoteserver zu aktualisieren, stellen Sie Eigenschaften des Cursors des Resultsets ein, um sowohl festzulegen, ob Daten aktualisiert werden, als auch bestimmte Einzelheiten vorzugeben, wie die Aktualisierungen erfolgen sollen. Wenn eine Aktualisierungsabfrage angefordert wird, prüft Visual FoxPro zunächst diese Eigenschaften, bevor es die Aktualisierungsabfrage übergibt.
Damit Remotedaten aktualisiert werden können, müssen Sie 5 Eigenschaften festlegen: Tables, KeyFieldList, UpdateNameList, UpdatableFieldList und SendUpdates. Um den Anforderungen Ihrer Anwendung optimal gerecht zu werden, können Sie weitere Eigenschaften festlegen, so z. B. Buffering, UpdateType und WhereType.
So ermöglichen Sie Aktualisierungen über den Cursor einer aktiven Ansicht
Legen Sie mit der CURSORSETPROP( )-Funktion die Aktualisierungseigenschaften des Cursors der Ansicht fest: Tables, KeyFieldList, UpdateNameList, UpdatableFieldList und SendUpdates.
Tipp Der SQL Pass-Through-Cursor einer Ansicht wird erst aktualisierbar, nachdem Sie Aktualisierungseigenschaften für den Cursor festgelegt haben. Wenn Sie die Einstellungen von Aktualisierungseigenschaften dauerhaft speichern möchten, müssen Sie eine Ansichtsdefinition erstellen. Visual FoxPro stellt Standardwerte bereit, die eine Ansicht in dem Moment, in dem sie mit dem Ansichts-Designer oder mit der Visual FoxPro-Syntax erstellt wird, so initialisieren, dass sie aktualisierbar ist. Mit der CURSORSETPROP( )-Funktion können Sie weitere Informationen hinzufügen, um die Standardwerte zu ergänzen oder anzupassen.
Die Aktualisierungseigenschaften, die Sie für den Cursor der aktiven Ansicht festlegen, haben etwas andere Namen als ihre DBSETPROP( )-Gegenstücke. In der folgenden Tabelle sind die Eigenschaftennamen gegenübergestellt, die für Ansichtsdefinitionen bzw. aktive Cursor zu verwenden sind.
Aktualisierungseigenschaften für Ansichten und Cursor
Zweck | Eigenschaften für Ansichtsdefinitionen1 | Eigenschaften für aktive Cursor2 |
---|---|---|
Zulassen einer Remotetabelle zum Aktualisieren | Tables | Tables |
Angeben der Remotenamen der Felder einer Ansicht | UpdateName (Eigenschaft auf Feldebene) | UpdateNameList |
Angeben der Felder einer Ansicht, die Sie als Schlüssel verwenden möchten | KeyField (Eigenschaft auf Feldebene) | KeyFieldList |
Angeben der aktualisierbaren Felder einer Ansicht | Updatable (Eigenschaft auf Feldebene) | UpdatableFieldList |
Aktivieren von Aktualisierungen | SendUpdates | SendUpdates |
1 Wird mit DBSETPROP( ) festgelegt.
2 Wird mit CURSORSETPROP( ) festgelegt.
Weitere Informationen zum Festlegen von Aktualisierungseigenschaften finden Sie unter Erstellen von Ansichten oder unter DBSETPROP( ) oder CURSORSETPROP( ).
Puffern von Aktualisierungen der Remotedaten
Über die Buffering-Eigenschaft eines Cursors legen Sie fest, wie Aktualisierungen der jeweiligen Remotedaten gepuffert werden. Von den 5 Werten, die eine Buffering-Eigenschaft annehmen kann, sind nur 2 für Remoteansichten zulässig:
- 3 oder DB_BUFOPTROW (Standardeinstellung); die jeweilige Zeile wird optimistisch gesperrt.
- 5 oder DB_BUFOPTTABLE; die jeweilige Tabelle wird optimistisch gesperrt.
Visual FoxPro unterstützt für Remotecursor nur optimistisches Sperren.
Anmerkung Die Einstellungen für pessimistische Zeilen- und Tabellenpufferung, 2 und 4, gelten nicht für Remoteansichten, da Visual FoxPro die Serverdaten nicht sperrt. Die Einstellung 1 der Buffering-Eigenschaft gilt nicht für Remoteansichten, da Ansichten immer gepuffert werden.
Arbeiten mit optimistischer Zeilenpufferung
Ist Buffering auf den Standardwert (DB_BUFOPTROW) festgelegt, werden Remotedaten zeilenweise optimistisch gesperrt. Zum Beispiel müssten Sie die Buffering-Eigenschaft auf 3 festlegen, wenn Änderungen der Tabelle Titel
zeilenweise übergeben werden sollen, wie dies der Fall ist, wenn mit dem SKIP-Befehl gearbeitet wird:
CURSORSETPROP('buffering', 3, 'titles')
Wenn die Buffering-Eigenschaft so festgelegt wurde, dass die zeilenweise Zwischenspeicherung erfolgt, stehen Ihnen zwei Methoden zur Verfügung, um Aktualisierungen an den Remoteserver zu senden. Dabei haben Sie folgende Möglichkeiten:
- Durch Aufrufen der TABLEUPDATE( )-Funktion.
- Durch Einsetzen eines Befehls, der den Datensatzzeiger auf einen anderen Datensatz verschiebt, wie z. B. SKIP oder GO BOTTOM.
Die TABLEUPDATE( )-Funktion aktualisiert die auf einem Server befindlichen Daten, ohne den Datensatzzeiger zu verschieben. Befehle, die den Datensatzzeiger verschieben, senden Aktualisierungsabfragen automatisch in dem Moment an den Remoteserver, in dem sie den Datensatzzeiger verschieben.
Wenn Sie mit Zeilenpufferung arbeiten und in der Lage sein möchten, an Zeilen vorgenommene Änderungen rückgängig zu machen, müssen Sie die Änderungen mit entsprechenden SQL Pass-Through-Funktionen in manuelle Transaktionen einbetten.
Arbeiten mit optimistischer Tabellenpufferung
Sollen Änderungen einer Tabelle nicht zeilenweise, sondern als ein Block (Batch) übergeben werden, wie dies z. B. der Fall ist, wenn ein Benutzer auf die Schaltflächen Speichern oder OK eines Formulars geklickt hat, müssen Sie die Buffering-Eigenschaft auf 5 bzw. DB_BUFOPTTABLE festlegen. Damit die Aktualisierungsabfrage an den Server gesendet wird, müssen Sie die TABLEUPDATE( )-Funktion aufrufen.
Im folgenden Beispiel wird die Buffering-Eigenschaft im Initialisierungscode des Formulars festgelegt, und die Änderungen werden dann im Speicherungscode vorgenommen.
Code | Kommentar |
---|---|
|
Festlegen im Initialisierungscode |
|
|
|
Festlegen im Savecode |
Wenn Sie für eine Tabelle deren ursprüngliche Werte wiederherstellen sowie verhindern möchten, dass Aktualisierungsabfragen an den Remoteserver gesendet werden, müssen Sie die TABLEREVERT( )-Funktion aufrufen. Durch Kombinieren der Buffering-Eigenschaft des jeweiligen Cursors mit der TABLEREVERT( )-Funktion können Sie festlegen, ob nur eine Zeile oder ob alle Zeilen in den alten Zustand zurückversetzt werden. Im folgenden Beispiel wird nur die aktuelle Zeile in den alten Zustand zurückversetzt. Eine solche Programmzeile kann beispielsweise ausgeführt werden, wenn ein Benutzer auf die Schaltfläche Abbrechen eines Formulars klickt:
= TABLEREVERT(.F., 'titles') && Revert current row
Wenn Sie alle Zeilen in den alten Zustand zurücksetzen möchten, wie dies der Fall ist, wenn Sie zum Verlassen eines Formulars ESC drücken, können Sie das gleiche Beispiel, jedoch mit geänderten Einstellungen der Buffering-Eigenschaft und des TABLEREVERT( )-Befehls, verwenden, um alle Zeilen zurückzusetzen, wobei die gesamte Tabelle gepuffert wird:
= TABLEREVERT(.T., 'titles') && Revert all rows
Weitere Informationen zum Zwischenspeichern finden Sie unter Programmieren für freigegebenen Zugriff.
Entdecken von Änderungen anderer Benutzer
In Mehrbenutzeranwendungen werden Konflikte, die sich infolge von Änderungen anderer Benutzer ergeben, von der SQL-Aktualisierungsabfrage entdeckt, die erstellt wird, wenn lokal ein Schreibvorgang ausgelöst wird. Bis zu welchem Umfang Konflikte entdeckt werden, hängt davon ab, auf welchen Wert die WhereType-Eigenschaft festgelegt wurde. Weitere Informationen zum Festlegen der WhereType-Eigenschaft finden Sie unter Erstellen von Ansichten.
Erzwingen von Aktualisierungen
Sie können in der TABLEUPDATE( )-Funktion festlegen, ob Änderungen, die ein anderer Benutzer des Netzwerkes an einer Tabelle oder an einem Cursor vorgenommen hat, überschrieben werden, wenn Sie Ihre Aktualisierungen senden. Unter der Voraussetzung, dass Sie den Force-Parameter der TABLEUPDATE( )-Funktion auf den Wert Wahr (.T.) festgelegt haben und die CURSORSETPROP( )-Eigenschaft UpdateType auf den Wert 1 (Standardwert) festgelegt ist, werden die momentan vorhandenen Daten durch die von Ihnen gesendeten neuen Daten aktualisiert, sofern sich in der Remotetabelle der Wert des Schlüsselfeldes des jeweiligen Datensatzes nicht geändert hat. Ist Letzteres der Fall oder ist die UpdateType-Eigenschaft auf 2 festgelegt, sendet Visual FoxPro zunächst eine DELETE- und dann eine INSERT-Anweisung an die Remotetabelle.
Fehlerbehebung Aktualisierungsbezogener Fehlermeldungen
In der folgenden Tabelle sind Visual FoxPro- und ODBC-Fehlermeldungen aufgeführt, die sich insbesondere auf Remoteaktualisierungen beziehen. Die Spalte Maßnahme gibt an, wie Sie die Fehlerbedingung auflösen können.
Fehlermeldung | Bedeutung | Maßnahme |
---|---|---|
Es wurde(n) keine Quelltabelle(n) angegeben. Verwenden Sie die Tables-Cursoreigenschaft. | Die Tables-Cursoreigenschaft enthält keine Namen von Remotetabellen. Mindestens eine Tabelle ist erforderlich, um Aktualisierungen auf dem Remoteserver durchzuführen. | Geben Sie mit Hilfe der Tables-Eigenschaft mindestens eine Tabelle für den Cursor an. |
Es wurde(n) keine Spalte(n) für die Quelltabelle table_name angegeben. Verwenden Sie die KeyFieldList-Cursoreigenschaft. | Der Primärschlüssel für die Remotetabelle, auf die in der Fehlermeldung verwiesen wird, ist nicht für die KeyFieldList-Eigenschaft des Cursors angegeben worden; für jede zu aktualisierende Tabelle ist ein Primärschlüssel erforderlich. | Geben Sie den Primärschlüssel für die Remotetabelle mit Hilfe der KeyFieldList-Eigenschaft an. |
Es wurde keine gültige Quelltabelle für die Spalte column_name angegeben. Verwenden Sie die Cursoreigenschaften UpdateNameList und Tables. | Die UpdateName-Eigenschaft der Spalte column_name enthält eine ungültige Tabellenangabe. | Geben Sie die entsprechende Tabelle als Einstellung der UpdateNameList-Eigenschaft und/oder der Tables-Eigenschaft an. |
Die KeyFieldList-Cursoreigenschaft definiert keinen eindeutigen Schlüssel. | Es gibt mehrere Remotedatensätze mit demselben Schlüssel. | Definieren Sie mit Hilfe der KeyFieldList-Eigenschaft einen eindeutigen Schlüssel für die Remotetabelle. |
Von ODBC: Ungültiges ODBC-Objekt | ODBC kann die Remotetabelle oder -Spalte nicht unter dem angegebenen Namen finden. Visual FoxPro-Namen werden von Visual FoxPro auf ihre Gültigkeit überprüft, Remotetabellen und -Spalten nur vom Remoteserver. | Überprüfen Sie den Objektnamen. |
Weitere Informationen zur Fehlerbehandlung finden Sie unter Umgehen mit SQL Pass-Through-Fehlern.
Siehe auch
Funktionsweise von Remotedaten bei Einsatz von SQL Pass-Through | Auswahl eines effizienten SQL Pass-Through-Verarbeitungsmodus | Implementieren einer Client/Server-Anwendung | Entwurf von Client/Server-Anwendungen | Upsizing von Visual FoxPro-Datenbanken | Erstellen von Ansichten