Freigeben über


Positionierte Updates (ODBC)

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

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

  • SQLSetPos

  • WHERE CURRENT OF-Klausel

Der häufigere Ansatz besteht darin, SQLSetPos zu verwenden. 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 Anweisungsergebnissatz verwendet werden, wenn die Anweisung Cursorattribute für die Verwendung von Servercursorn festgelegt ist. 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 bequeme Alternative zum Erstellen und Ausführen einer SQL-Anweisung. SQLSetPos wird auf dem aktuellen Rowset ausgeführt und kann nur nach einem Aufruf von SQLFetchScroll verwendet werden.

Die Rowset-Größe wird durch einen Aufruf von SQLSetStmtAttr mit einem Attributargument 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, 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 Argument "RowNumber" in SQLSetPos muss eine Zeile im Rowset identifizieren. Das heißt, der Wert muss sich im Bereich zwischen 1 und der Anzahl der Zeilen befinden, 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.

Der Löschvorgang von SQLSetPos führt dazu, dass die Datenquelle eine oder mehrere ausgewählte Zeilen einer Tabelle löscht. Zum Löschen von Zeilen mit SQLSetPos ruft die Anwendung SQLSetPos mit Operation auf SQL_DELETE und RowNumber auf die Nummer der zu löschenden Zeile festgelegt. 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 der Status ist SQL_ROW_DELETED. Die Zeile kann nicht in zusätzlichen positionierten Vorgängen verwendet werden, z. B. Aufrufe 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 mithilfe des Zeilenvorgangsarrays wie für den Aktualisierungsvorgang von SQLSetPos löscht.

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 die 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 in 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 aufzurufen, bevor Sie die SELECT-Anweisung ausführen. SQLGetCursorName gibt einen standardmäßigen Cursornamen zurück, der von ODBC zugewiesen wird, wenn Sie keinen Cursornamen mit 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)