Freigeben über


Positionierte Updates (ODBC)

ODBC unterstützt zwei Methoden für das Ausführen von positionierten Updates in einem Cursor:

  • SQLSetPos

  • WHERE CURRENT OF-Klausel

Am häufigsten wird SQLSetPos verwendet. Es bietet die folgenden Optionen.

  • SQL_POSITION
    Positioniert den Cursor in einer bestimmten Zeile im aktuellen Rowset.

  • SQL_REFRESH
    Aktualisiert die an die Resultsetspalten gebundenen Programmvariablen mit den Werten aus der Zeile, in der der Cursor zurzeit positioniert ist.

  • SQL_UPDATE
    Aktualisiert die aktuelle Zeile im Cursor mit den Werten aus den an die Resultsetspalten gebundenen Programmvariablen.

  • SQL_DELETE
    Löscht die aktuelle Zeile im Cursor.

SQLSetPos kann gemeinsam mit einem Anweisungsresultset verwendet werden, wenn die Anweisungshandle-Cursorattribute so festgelegt sind, dass die Servercursor verwendet werden. Die Resultsetspalten müssen an Programmvariablen gebunden sein. Nachdem die Anwendung eine Zeile abgerufen hat, ruft sie SQLSetPos(SQL_POSTION) auf, um den Cursor in der Zeile zu positionieren. Die Anwendung könnte dann SQLSetPos(SQL_DELETE) aufrufen, um die aktuelle Zeile zu löschen, oder neue Datenwerte in die gebundenen Programmvariablen verschieben und SQLSetPos(SQL_UPDATE) aufrufen, um die aktuelle Zeile zu aktualisieren.

Anwendungen können mit SQLSetPos alle Zeilen im Rowset aktualisieren oder löschen. Der Aufruf von SQLSetPos ist eine gute Alternative zum Erstellen und Ausführen einer SQL-Anweisung. SQLSetPos gilt für das aktuelle Rowset und kann nur nach einem Aufruf von SQLFetchScroll verwendet werden.

Die Rowsetgröße wird durch einen Aufruf von SQLSetStmtAttr mit einem Attributsargument von SQL_ATTR_ROW_ARRAY_SIZE festgelegt. SQLSetPos verwendet eine neue Rowsetgröße, aber nur nach einem Aufruf von SQLFetch oder SQLFetchScroll. Wenn beispielsweise die Rowsetgröße geändert wird, werden zuerst SQLSetPos und dann SQLFetch oder SQLFetchScroll aufgerufen. Beim Aufruf von SQLSetPos wird die alte Rowsetgröße verwendet, bei SQLFetch oder SQLFetchScroll wird jedoch die neue Rowsetgröße verwendet.

Die erste Zeile im Rowset ist die Zeile 1. Das RowNumber-Argument in SQLSetPos muss eine Zeile im Rowset kennzeichnen; das heißt, der Wert muss im Bereich von 1 und der Anzahl der zuletzt abgerufenen Zeilen liegen. Diese ist eventuell kleiner als die Rowsetgröße. Wenn RowNumber 0 ist, gilt der Vorgang für jede Zeile im Rowset.

Beim Löschvorgang von SQLSetPos löscht die Datenquelle eine oder mehrere ausgewählte Zeilen in einer Tabelle. Um Zeilen mit SQLSetPos zu löschen, ruft die Anwendung SQLSetPos auf, wobei Operation auf SQL_DELETE und RowNumber auf die Nummer der zu löschenden Zeile gesetzt wird. Wenn RowNumber 0 ist, werden alle Zeilen im Rowset gelöscht.

Nachdem SQLSetPos zurückgegeben wurde, ist die gelöschte Zeile die aktuelle Zeile mit dem Status SQL_ROW_DELETED. Die Zeile kann nicht in weiteren positionierten Vorgängen verwendet werden, wie z. B. Aufrufen von SQLGetData oder SQLSetPos.

Wenn Sie alle Zeilen im Rowset (RowNumber entspricht 0) löschen, kann die Anwendung verhindern, dass der Treiber bestimmte Zeilen löscht, indem Sie das Zeilenvorgangsarray wie beim Updatevorgang mit SQLSetPos verwenden.

Jede Zeile, die gelöscht wird, sollte eine Zeile sein, die im Resultset vorhanden ist. Wenn die Anwendungspuffer beim Abrufen gefüllt werden und ein Zeilenstatusarray beibehalten wurde, sollten die Werte an jeder Zeilenposition nicht SQL_ROW_DELETED, SQL_ROW_ERROR oder SQL_ROW_NOROW sein.

Positionierte Updates können auch mit der WHERE CURRENT OF-Klausel für UPDATE-, DELETE- und INSERT-Anweisungen durchgeführt werden. Für WHERE CURRENT OF ist ein Cursorname erforderlich, der von ODBC beim Aufruf der SQLGetCursorName-Funktion erstellt wird oder den Sie durch Aufruf von SQLSetCursorName festlegen können. Im Folgenden finden Sie allgemeine Schritte zum Durchführen eines WHERE CURRENT OF-Updates in einer ODBC-Anwendung:

  • Rufen Sie SQLSetCursorName auf, um einen Cursornamen für das Anweisungshandle einzurichten.

  • Erstellen Sie eine SELECT-Anweisung mit einer FOR UPDATE OF-Klausel, und führen Sie sie aus.

  • Rufen Sie SQLFetchScroll auf, um ein Rowset oder SQLFetch abzurufen, um eine Zeile abzurufen.

  • Rufen Sie SQLSetPos (SQL_POSITION) auf, um den Cursor in der Zeile zu positionieren.

  • Erstellen Sie eine UPDATE-Anweisung mit einer WHERE CURRENT OF-Klausel, und führen Sie sie mit dem Cursornamensset mit SQLSetCursorName aus.

Alternativ können Sie auch SQLGetCursorName aufrufen, nachdem Sie die SELECT-Anweisung ausgeführt haben, anstatt SQLSetCursorName aufzurufen, bevor Sie die SELECT-Anweisung ausführen. SQLGetCursorName gibt einen Standardcursornamen zurück, der von ODBC zugewiesen wird, wenn Sie keinen Namen mit SQLSetCursorName festlegen.

SQLSetPos wird bevorzugt anstelle von WHERE CURRENT OF verwendet, wenn Sie mit Servercursorn arbeiten. Wenn Sie einen statischen, aktualisierbaren Cursor mit der ODBC-Cursorbibliothek verwenden, implementiert die Cursorbibliothek die WHERE CURRENT OF-Updates, indem eine WHERE-Klausel mit den Schlüsselwerten für die zugrunde liegende Tabelle hinzugefügt wird. Dies kann zu nicht beabsichtigten Updates führen, wenn die Schlüssel in der Tabelle nicht eindeutig sind.

Siehe auch

Konzepte

Verwenden von Cursorn (ODBC)