Teilen über


SQLMoreResults-Funktion

Konformitäts-
Version eingeführt: ODBC 1.0-Standardscompliance: ODBC

Zusammenfassung
SQLMoreResults bestimmt, ob mehr Ergebnisse für eine Anweisung verfügbar sind, die SELECT-, UPDATE-, INSERT- oder DELETE-Anweisungen enthält, und wenn ja, die Verarbeitung für diese Ergebnisse initialisiert.

Syntax

  
SQLRETURN SQLMoreResults(  
     SQLHSTMT     StatementHandle);  

Argumente

StatementHandle-
[Eingabe] Anweisungshandle.

Rückkehr

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_NO_DATA, SQL_ERROR, SQL_INVALID_HANDLE oder SQL_PARAM_DATA_AVAILABLE.

Diagnostik

Wenn SQLMoreResults SQL_ERROR oder SQL_SUCCESS_WITH_INFO zurückgibt, kann ein zugeordneter SQLSTATE-Wert durch Aufrufen von SQLGetDiagRec mit einem HandleType von SQL_HANDLE_STMT und einem Handle of StatementHandle abgerufen werden. In der folgenden Tabelle sind die SQLSTATE-Werte aufgeführt, die häufig von SQLMoreResults zurückgegeben werden, und jede wird im Kontext dieser Funktion erläutert. die Notation "(DM)" steht vor den Beschreibungen von SQLSTATEs, die vom Treiber-Manager zurückgegeben werden. Der rückgabecode, der jedem SQLSTATE-Wert zugeordnet ist, ist SQL_ERROR, sofern nicht anders angegeben.

SQLSTATE Fehler BESCHREIBUNG
01000 Allgemeine Warnung Treiberspezifische Informationsmeldung. (Funktion gibt SQL_SUCCESS_WITH_INFO zurück.)
01S02 Der Optionswert wurde geändert. Der Wert eines Anweisungsattributs wurde geändert, während der Batch verarbeitet wurde. (Funktion gibt SQL_SUCCESS_WITH_INFO zurück.)
08S01 Kommunikationslinkfehler Die Kommunikationsverbindung zwischen dem Treiber und der Datenquelle, mit der der Treiber verbunden wurde, ist fehlgeschlagen, bevor die Verarbeitung der Funktion abgeschlossen wurde.
40001 Serialisierungsfehler Die Transaktion wurde aufgrund eines Ressourcen-Deadlocks mit einer anderen Transaktion zurückgesetzt.
40003 Abschluss der Anweisung unbekannt Die zugeordnete Verbindung ist während der Ausführung dieser Funktion fehlgeschlagen, und der Status der Transaktion kann nicht bestimmt werden.
HY000 Allgemeiner Fehler Es ist ein Fehler aufgetreten, für den kein spezifischer SQLSTATE-Wert vorhanden war und für den keine implementierungsspezifische SQLSTATE definiert wurde. Die von SQLGetDiagRec im *MessageText- Puffer zurückgegebene Fehlermeldung beschreibt den Fehler und dessen Ursache.
HY001 Speicherzuweisungsfehler Der Treiber konnte speicher nicht zuordnen, der erforderlich ist, um die Ausführung oder den Abschluss der Funktion zu unterstützen.
HY008 Vorgang abgebrochen Die asynchrone Verarbeitung wurde für die StatementHandle-aktiviert. Die SQLMoreResults-Funktion wurde aufgerufen, und vor abschluss der Ausführung wurde SQLCancel oder SQLCancelHandle für die Anweisungshandle aufgerufen. Anschließend wurde die SQLMoreResults-Funktion erneut für die Anweisungshandle aufgerufen.

Die SQLMoreResults-Funktion wurde aufgerufen, und vor abschluss der Ausführung wurde SQLCancel oder SQLCancelHandle von einem anderen Thread in einer Multithreadanwendung für das StatementHandle aufgerufen.
HY010 Funktionssequenzfehler (DM) Eine asynchron ausgeführte Funktion wurde für den Verbindungshandle aufgerufen, der dem StatementHandle-zugeordnet ist. Diese asynchrone Funktion wurde noch ausgeführt, als die SQLMoreResults-Funktion aufgerufen wurde.

(DM) Eine asynchron ausgeführte Funktion (nicht diese) wurde für die StatementHandle- aufgerufen und wurde weiterhin ausgeführt, als diese Funktion aufgerufen wurde.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperationsoder SQLSetPos wurde für die StatementHandle- aufgerufen und SQL_NEED_DATA zurückgegeben. Diese Funktion wurde aufgerufen, bevor Daten für alle Daten bei ausführungsparametern oder -spalten gesendet wurden.
HY013 Speicherverwaltungsfehler Der Funktionsaufruf konnte nicht verarbeitet werden, da auf die zugrunde liegenden Speicherobjekte nicht zugegriffen werden konnte, möglicherweise aufgrund geringer Arbeitsspeicherbedingungen.
HY117 Die Verbindung wird aufgrund des unbekannten Transaktionsstatus angehalten. Es sind nur Trenn- und schreibgeschützte Funktionen zulässig. (DM) Weitere Informationen zum angehaltenen Zustand finden Sie unter SQLEndTran Function.
HYT01 Verbindungstimeout abgelaufen Der Zeitraum für das Verbindungstimeout ist abgelaufen, bevor die Datenquelle auf die Anforderung geantwortet hat. Der Verbindungstimeoutzeitraum wird über SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT festgelegt.
IM001 Dieser Treiber unterstützt diese Funktion nicht. (DM) Der dem StatementHandle zugeordnete Treiber unterstützt die Funktion nicht.
IM017 Die Abrufung ist im asynchronen Benachrichtigungsmodus deaktiviert. Immer wenn das Benachrichtigungsmodell verwendet wird, ist die Abrufung deaktiviert.
IM018 SQLCompleteAsync- wurde nicht aufgerufen, um den vorherigen asynchronen Vorgang für dieses Handle abzuschließen. Wenn der vorherige Funktionsaufruf für das Handle SQL_STILL_EXECUTING zurückgibt und wenn der Benachrichtigungsmodus aktiviert ist, muss SQLCompleteAsync- für das Handle aufgerufen werden, um die Nachbearbeitung durchzuführen und den Vorgang abzuschließen.

Kommentare

SELECT-Anweisungen geben Resultsets zurück. UPDATE-, INSERT- und DELETE-Anweisungen geben eine Anzahl betroffener Zeilen zurück. Wenn eine dieser Anweisungen batchweise mit Arrays von Parametern übermittelt wird (nummeriert in zunehmender Parameterreihenfolge, in der Reihenfolge, in der sie im Batch angezeigt werden), oder in Prozeduren können sie mehrere Resultsets oder Zeilenanzahlen zurückgeben. Informationen zu Batches von Anweisungen und Arrays von Parametern finden Sie unter "Batches of SQL Statements " und "Arrays of Parameter Values".

Nach dem Ausführen des Batches wird die Anwendung im ersten Resultset positioniert. Die Anwendung kann SQLBindCol, SQLBulkOperations, SQLFetch, SQLGetData, SQLFetchScroll, SQLSetPos und alle Metadatenfunktionen auf der ersten oder allen nachfolgenden Resultsets aufrufen, genau wie bei einem einzigen Resultset. Sobald sie mit dem ersten Resultset abgeschlossen ist, ruft die Anwendung SQLMoreResults auf, um zum nächsten Resultset zu wechseln. Wenn ein anderer Resultset oder eine andere Anzahl verfügbar ist, gibt SQLMoreResults SQL_SUCCESS zurück und initialisiert das Resultset oder die Anzahl für die zusätzliche Verarbeitung. Wenn zeilenanzahlgenerierende Anweisungen zwischen Resultset-generierenden Anweisungen angezeigt werden, können sie durch Aufrufen von SQLMoreResults übersprungen werden. Nach dem Aufrufen von SQLMoreResults für UPDATE-, INSERT- oder DELETE-Anweisungen kann eine Anwendung SQLRowCount aufrufen.

Wenn ein aktueller Resultset mit nicht gelöschten Zeilen vorhanden ist, verwirft SQLMoreResults diesen Resultset und macht den nächsten Resultset oder die nächste Anzahl verfügbar. Wenn alle Ergebnisse verarbeitet wurden, gibt SQLMoreResults SQL_NO_DATA zurück. Für einige Treiber sind Ausgabeparameter und Rückgabewerte erst verfügbar, wenn alle Resultsets und Zeilenanzahlen verarbeitet wurden. Für solche Treiber werden Ausgabeparameter und Rückgabewerte verfügbar, wenn SQLMoreResults SQL_NO_DATA zurückgibt.

Alle Bindungen, die für den vorherigen Resultset eingerichtet wurden, bleiben weiterhin gültig. Wenn die Spaltenstrukturen für diesen Resultset unterschiedlich sind, kann das Aufrufen von SQLFetch oder SQLFetchScroll zu einem Fehler oder Abschneiden führen. Um dies zu verhindern, muss die Anwendung SQLBindCol aufrufen, um explizit nach Bedarf neu zu binden (oder dazu durch Festlegen von Deskriptorfeldern). Alternativ kann die Anwendung SQLFreeStmt mit einer Option von SQL_UNBIND aufrufen, um alle Spaltenpuffer zu entbinden.

Die Werte von Anweisungsattributen, z. B. Cursortyp, Cursorkoncurrency, Keysetgröße oder maximale Länge, können sich ändern, wenn die Anwendung durch aufrufe von SQLMoreResults durch den Batch navigiert. In diesem Fall gibt SQLMoreResults SQL_SUCCESS_WITH_INFO und SQLSTATE 01S02 zurück (Optionswert wurde geändert).

Durch Aufrufen von SQLCloseCursor oder SQLFreeStmt mit einer Option von SQL_CLOSE werden alle Resultsets und Zeilenanzahlen verworfen, die aufgrund der Ausführung des Batches verfügbar waren. Der Anweisungshandle wird entweder an den zugewiesenen oder vorbereiteten Zustand zurückgegeben. Das Aufrufen von SQLCancel zum Abbrechen einer asynchron ausgeführten Funktion, wenn ein Batch ausgeführt wurde und sich der Anweisungshandle im ausgeführten, cursorpositionierten oder asynchronen Zustand befindet, führt zu allen Resultsets und Zeilenzählungen, die vom Batch generiert werden, wenn der Abbruchaufruf erfolgreich war. Die Anweisung kehrt dann zum vorbereiteten oder zugeordneten Zustand zurück.

Wenn eine Reihe von Anweisungen oder eine Prozedur andere SQL-Anweisungen mit SELECT-, UPDATE-, INSERT- und DELETE-Anweisungen kombiniert, wirken sich diese anderen Anweisungen nicht auf SQLMoreResults aus.

Weitere Informationen finden Sie unter "Mehrere Ergebnisse".

Wenn eine durchsuchte Aktualisierung, Einfüge- oder Löschausweisung in einer Reihe von Anweisungen keine Auswirkungen auf Zeilen in der Datenquelle hat, gibt SQLMoreResults SQL_SUCCESS zurück. Dies unterscheidet sich von dem Fall einer durchsuchten Aktualisierung, eines Einfügens oder eines Löschanweisungs, die über SQLExecDirect, SQLExecute oder SQLParamData ausgeführt wird, was SQL_NO_DATA zurückgibt, wenn sie sich nicht auf Zeilen in der Datenquelle auswirkt. Wenn eine Anwendung SQLRowCount aufruft, um die Zeilenanzahl abzurufen, nachdem ein Aufruf von SQLMoreResults keine Zeilen beeinflusst hat, gibt SQLRowCount SQL_NO_DATA zurück.

Weitere Informationen zur gültigen Sequenzierung von Ergebnisverarbeitungsfunktionen finden Sie in Anhang B: ODBC-Zustandsübergangstabellen.

Weitere Informationen zu SQL_PARAM_DATA_AVAILABLE und gestreamten Ausgabeparametern finden Sie unter Abrufen von Ausgabeparametern mithilfe von SQLGetData.

Verfügbarkeit von Zeilenanzahlen

Wenn ein Batch mehrere aufeinander folgende Zeilenzählungsanweisungen enthält, ist es möglich, dass diese Zeilenanzahlen in nur eine Zeilenanzahl eingerollt werden. Wenn beispielsweise ein Batch fünf Einfügeanweisungen enthält, können bestimmte Datenquellen fünf einzelne Zeilenanzahlen zurückgeben. Bestimmte andere Datenquellen geben nur eine Zeilenanzahl zurück, die die Summe der fünf einzelnen Zeilenanzahlen darstellt.

Wenn ein Batch eine Kombination aus vom Resultset generierten Und Zeilenzählungsanweisungen enthält, sind Zeilenanzahlen möglicherweise überhaupt verfügbar. Das Verhalten des Treibers in Bezug auf die Verfügbarkeit der Zeilenanzahl wird im SQL_BATCH_ROW_COUNT Informationstyp aufgelistet, der über einen Aufruf von SQLGetInfo verfügbar ist. Angenommen, der Batch enthält eine SELECT, gefolgt von zwei INSERT-Anweisungen und einer anderen SELECT. Dann sind die folgenden Fälle möglich:

  • Die Zeilenanzahl, die den beiden INSERT-Anweisungen entspricht, sind überhaupt nicht verfügbar. Der erste Aufruf von SQLMoreResults positioniert Sie im Resultset der zweiten SELECT-Anweisung .

  • Die Zeilenanzahl, die den beiden INSERT-Anweisungen entspricht, sind einzeln verfügbar. (Ein Aufruf von SQLGetInfo gibt das SQL_BRC_ROLLED_UP Bit für den SQL_BATCH_ROW_COUNT Informationstyp nicht zurück.) Der erste Aufruf von SQLMoreResults positioniert Sie in der Zeilenanzahl des ersten INSERT, und der zweite Aufruf positioniert Sie in der Zeilenanzahl der zweiten INSERT. Der dritte Aufruf von SQLMoreResults positioniert Sie im Resultset der zweiten SELECT-Anweisung .

  • Die Zeilenanzahl, die den beiden INSERTs entspricht, wird in eine einzelne Zeilenanzahl eingerollt, die verfügbar ist. (Ein Aufruf von SQLGetInfo gibt das SQL_BRC_ROLLED_UP Bit für den SQL_BATCH_ROW_COUNT Informationstyp zurück.) Der erste Aufruf von SQLMoreResults positioniert Sie bei der Anzahl der Rollupzeilen, und der zweite Aufruf von SQLMoreResults positioniert Sie im Resultset der zweiten SELECT.

Bestimmte Treiber stellen Zeilenanzahl nur für explizite Batches und nicht für gespeicherte Prozeduren zur Verfügung.

Informationen zu Weitere Informationen
Abbrechen der Verarbeitung von Anweisungen SQLCancel-Funktion
Abrufen eines Datenblocks oder Scrollen durch ein Resultset SQLFetchScroll-Funktion
Abrufen einer einzelnen Zeile oder eines Datenblocks in eine vorwärtsgerichtete Richtung SQLFetch-Funktion
Abrufen eines Teils oder aller Datenspalten SQLGetData-Funktion

Siehe auch

ODBC-API-Referenz
ODBC-Headerdateien
Abrufen von Ausgabeparametern mithilfe von SQLGetData