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

Der gebräuchlichere Ansatz ist die Verwendung von SQLSetPos. 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 mit einem beliebigen Anweisungs-Resultset verwendet werden, wenn die Cursorattribute der Anweisung handle so festgelegt sind, dass Servercursor verwendet werden. Die Resultsetspalten müssen an Programmvariablen gebunden sein. Sobald 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 jede Zeile im Rowset mit SQLSetPos aktualisieren oder löschen. Das Aufrufen von SQLSetPos ist eine praktische Alternative zum Erstellen und Ausführen einer SQL-Anweisung. SQLSetPos funktioniert mit dem aktuellen Rowset und kann nur nach einem Aufruf von SQLFetchScroll verwendet werden.

Die Rowsetgröße wird durch einen Aufruf von SQLSetStmtAttr mit dem Attributargument 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, wird SQLSetPos aufgerufen und dann SQLFetch oder SQLFetchScroll aufgerufen. Der Aufruf von SQLSetPos verwendet die alte Rowsetgröße, aber SQLFetch oder SQLFetchScroll verwendet die neue Rowsetgröße.

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

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

Nachdem SQLSetPos zurückgegeben wurde, ist die gelöschte Zeile die aktuelle Zeile und ihre status ist SQL_ROW_DELETED. Die Zeile kann nicht in zusätzlichen positionierten Vorgängen verwendet werden, z. B. in Aufrufen von SQLGetData oder SQLSetPos.

Wenn Sie alle Zeilen des Rowsets löschen (RowNumber ist gleich 0), kann die Anwendung verhindern, dass der Treiber bestimmte Zeilen löscht, indem sie das Zeilenvorgangsarray wie beim Updatevorgang von SQLSetPos verwendet.

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. WHERE CURRENT OF erfordert einen Cursornamen, den ODBC generiert, wenn die SQLGetCursorName-Funktion aufgerufen wird, oder den Sie durch Aufrufen von SQLSetCursorName angeben 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 auf der Zeile zu positionieren.

  • Erstellen und Ausführen einer UPDATE-Anweisung mit einer WHERE CURRENT OF-Klausel mithilfe des Cursornamens, der mit SQLSetCursorName festgelegt ist.

Alternativ können Sie SQLGetCursorName aufrufen, nachdem Sie die SELECT-Anweisung ausgeführt haben, anstatt SQLSetCursorName vor dem Ausführen der SELECT-Anweisung aufzurufen. SQLGetCursorName gibt einen von ODBC zugewiesenen Standardcursornamen zurück, wenn Sie keinen Cursornamen mithilfe von SQLSetCursorName festlegen.

SQLSetPos wird gegenüber WHERE CURRENT OF bevorzugt, wenn Sie Servercursor verwenden. 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.

Weitere Informationen

Verwenden von Cursorn (ODBC)