Freigeben über


Verarbeiten mehrerer Resultsets

Ihre Anwendung ruft mehrere Resultsets ab, wenn Sie mit einer SQLEXEC( )-Funktion mehrere SQL-Anweisungen SELECT ausgeben oder eine gespeicherte Prozedur ausführen, die mehrere SELECT-Anweisungen ausgibt. Für jede SQL-Anweisung SELECT wird das zugehörige Resultset in einem eigenen Visual FoxPro-Cursor zurückgegeben.

Für den jeweils ersten Cursor wird der Standardname SQLRESULT verwendet; jeder weitere Cursor erhält seinen eindeutigen Namen dadurch, dass der Standardname mit einem Index versehen wird. So lauten z. B. die Standardnamen für Cursor, die von einer SQLEXEC( )-Anweisung zurückgegeben werden, welche drei Resultsets abruft, "Sqlresult", "Sqlresult1" und "Sqlresult2".

Wenn eine Funktion im Batchmodus mehrere Resultsets zurückgibt, erhalten die Cursornamen in Visual FoxPro jeweils einen eindeutigen Suffix und können aus maximal 255 Zeichen bestehen. Im folgenden Beispiel wird für die BatchMode-Eigenschaft der Batchmodus festgelegt. Anschließend wird eine SQLEXEC( )-Funktion aufgerufen, die 4 SQL-Anweisungen SELECT enthält, so dass 4 Resultsets erstellt werden:

? SQLSETPROP(nConnectionHandle,'BatchMode', .T.) 
? SQLEXEC(nConnectionHandle,'select * from authors ; 
                     select * from titles ; 
                     select * from roysched ; 
                     select * from titleauthor','ITEM')

Sobald die Verarbeitung dieser Funktion abgeschlossen ist, gibt Visual FoxPro die 4 Resultsets als die Visual FoxPro-Cursor Item, Item1, Item2 und Item3 zurück.

Sie können den Standardnamen ändern, indem Sie bei einer der Funktionen SQLEXEC( ) oder SQLMORERESULTS( ) den cCursorname-Parameter mit einem entsprechenden Wert belegen. Wurde der Name, den Sie für ein Resultset angeben, bereits verwendet, wird der bestehende Cursor mit dem neuen Resultset überschrieben.

Wenn Ihre Anwendung mehrere Resultsets abruft, haben Sie die Wahl zwischen asynchroner oder synchroner Verarbeitung sowie zwischen Batch- oder Nicht-Batchmodus.

Verarbeiten im Batchmodus

Mit der BatchMode-Eigenschaft (wird mit SQLSETPROP( ) festgelegt) wird gesteuert, wie eine SQLEXEC( )-Funktion mehrere Resultsets zurückgibt. Die Standardeinstellung lautet .T. (Batch-Modus). Verarbeiten im Batchmodus bedeutet, dass Visual FoxPro so lange keines der Ergebnisse einer SQLEXEC( )-Funktion zurückgibt, die noch ausgeführt wird, bis alle Resultsets vollständig abgerufen sind.

Verarbeiten im Nicht-Batchmodus

Wenn Sie die BatchMode-Eigenschaft mit Hilfe von SQLSETPROP( ) auf Falsch (.F.) festgelegt haben (Nicht-Batchmodus), wird jedes Resultset einzeln zurückgegeben. Das erste Resultset wird von dem SQLEXEC( )-Funktionsaufruf zurückgegeben. Danach muss Ihre Anwendung so lange wiederholt die SQLMORERESULTS( )-Funktion aufrufen, bis durch Rückgabe des Wertes 2 mitgeteilt wird, dass keine weiteren Resultsets verfügbar sind.

Im Nicht-Batchmodus kann jede weitere SQLMORERESULTS( )-Funktion mit einem anderen Cursornamen aufgerufen werden. Ist im vorangegangenen Beispiel in der SQLEXEC( )-Funktion als Cursorname "Item" angegeben und wird der cCursorname-Parameter beim zweiten Aufruf der SQLMORERESULTS( )-Funktion in "Otheritem" geändert, erhalten die sich ergebenden Cursor die Namen "Item", "Item1", "Otheritem" und "Otheritem1".

Im nächsten Abschnitt sind die möglichen Verarbeitungsmodi beschrieben, die sich aus den Kombinationen von Batchmodus oder Nicht-Batchmodus und Synchronmodus oder Asynchronmodus ergeben. Die folgende Abbildung verdeutlicht die 4 möglichen Verarbeitungskombinationen. Die Zahlen 0, 1 und 2 entsprechen den Werten, die von den jeweils aufgerufenen Funktionen zurückgegeben werden.

Die Visual FoxPro-Modi Synchrone und Asynchrone Verarbeitung

Nachstehend ist beschrieben, wie sich die unterschiedlich kombinierten Modi auf die Verarbeitung auswirken: die Buchstaben A, B, C und D verweisen auf die obige Abbildung. Für alle Beschreibungen gilt als Voraussetzung, dass eine Anweisung ausgeführt wird, die drei Resultsets zurückgibt, die in der Abbildung durch die drei horizontal angeordneten Bereiche gekennzeichnet sind.

Verarbeiten im Synchronmodus

Im Synchronmodus erhält Ihre Anwendung die Kontrolle erst zurück, nachdem eine Funktion vollständig ausgeführt ist.

A: Die Kombination Synchronmodus/Batchmodus

Wenn Sie eine SQL Pass-Through-Anweisung synchron im Batchmodus ausführen, erhält Ihre Anwendung die Kontrolle erst zurück, nachdem alle Resultsets abgerufen sind. Den Namen des ersten Cursors geben Sie in der Ausgangsfunktion im cCursorname-Parameter an. Existiert bereits ein Cursor unter dem von Ihnen angegebenen Namen, wird dieser Cursor mit dem neuen Resultset überschrieben. Wenn Sie bei der Kombination Synchronmodus/Batchmodus mehrere Resultsets anfordern, bildet Visual FoxPro die Namen der weiteren Cursor, indem es den Namen des ersten Cursors mit eindeutigen Indizes versieht.

B: Die Kombination Synchronmodus/Nicht-Batchmodus

Wenn Sie eine SQL Pass-Through-Anweisung synchron im Nicht-Batchmodus ausführen, ruft die erste Anweisung das erste Resultset ab und gibt eine 1 zurück. Danach müssen Sie wiederholt die SQLMORERESULTS( )-Funktion aufrufen sowie gegebenenfalls einen anderen Namen für den Cursor angeben. Wenn Sie keinen anderen Namen für den Cursor angeben, erhält jedes mit SQLMORERESULTS( ) abgerufene Resultset einen eindeutigen Namen, der aus dem Basisnamen und einem fortlaufenden Index besteht. Sobald SQLMORERESULTS( ) den Wert 2 zurückgibt, sind keine weiteren Resultsets mehr verfügbar.

Verarbeiten im Asynchronmodus

Im Asynchronmodus muss Ihre Anwendung eine SQL Pass-Through-Funktion so lange wiederholt aufrufen, bis die Funktion einen Wert ungleich 0 (wird noch ausgeführt) zurückgibt. Der Standardname für Resultsets (Sqlresult) kann geändert werden, indem Sie beim ersten Aufruf der Funktion im cCursorname-Parameter den gewünschten Namen angeben. Wurde der Name, den Sie für ein Resultset angeben, bereits verwendet, werden die im vorhandenen Cursor stehenden Informationen mit dem neuen Resultset überschrieben.

C: Die Kombination Asynchronmodus/Batchmodus

Wenn Sie eine SQL Pass-Through-Funktion asynchron im Batchmodus ausführen, gibt die Funktion nach jedem Aufruf so lange eine 0 (wird noch ausgeführt) zurück, bis alle Resultsets in die angegebenen Cursor abgerufen sind. Sobald alle Resultsets abgerufen sind, gibt die Funktion entweder die Anzahl der Cursor oder eine negative Zahl zurück, wobei letztere anzeigt, dass ein Fehler aufgetreten ist.

D: Die Kombination Asynchronmodus/Nicht-Batchmodus

Erfolgt die Verarbeitung asynchron im Nicht-Batchmodus, gibt eine SQLEXEC( )-Funktion den Wert 1 zurück, sobald sie ein Resultset vollständig abgerufen hat. Danach muss Ihre Anwendung so lange wiederholt die SQLMORERESULTS( )-Funktion aufrufen, bis durch Rückgabe des Wertes 2 mitgeteilt wird, dass keine weiteren Resultsets verfügbar sind.

Tipp   Ein Remoteresultset wird in zwei Schritten abgerufen. Zunächst wird das Resultset auf dem Server vorbereitet, anschließend wird es in einen lokalen Visual FoxPro-Server abgerufen. Im Asynchronmodus können Sie die USED( )-Funktion aufrufen, um zu überprüfen, ob Visual FoxPro bereits mit dem Lesen des angeforderten Cursors begonnen hat.

Siehe auch

Verwenden von SQL Pass-Through-Funktionen im Asynchronmodus | Steuern der Datentypkonvertierung | Funktionsweise von Remotedaten bei Einsatz von SQL Pass-Through | Implementieren einer Client/Server-Anwendung | Entwurf von Client/Server-Anwendungen | Upsizing von Visual FoxPro-Datenbanken | Erstellen von Ansichten