Ändern von Zeilen mit positionierten Operationen
Aktualisierbare Cursor unterstützen Anweisungen für Datenänderungen, die Zeilen über den Cursor aktualisieren. Wenn Sie in einer Zeile in einem aktualisierbaren Cursor positioniert sind, können Sie Aktualisierungs- oder Löschvorgänge ausführen, die sich auf die Zeilen in der Basistabelle beziehen, die zum Erstellen der aktuellen Zeile im Cursor verwendet werden. Diese Vorgänge werden als positionierte Aktualisierungen bezeichnet.
Die positionierten Aktualisierungen werden über dieselbe Verbindung ausgeführt, die den Cursor geöffnet hat. Dadurch kann derselbe Transaktionsbereich für die Datenänderungen und den Cursor freigegeben werden, und es wird verhindert, dass Aktualisierungen durch Sperren des Cursors blockiert werden.
Es gibt zwei Methoden für das Ausführen von positionierten Aktualisierungen in einem Cursor:
- Die WHERE CURRENT OF-Klausel von Transact-SQL in einer UPDATE- oder DELETE-Anweisung.
- Eine Datenbank-API-Funktion oder -Methode für positionierte Aktualisierungen, wie z. B. die SQLSetPos-Funktion von ODBC.
Ausführen positionierter Aktualisierungen mit Transact-SQL
Die WHERE CURRENT OF-Klausel von Transact-SQL wird in der Regel zusammen mit gespeicherten Transact-SQL-Prozeduren, Triggern und Skripts verwendet, wenn Änderungen auf der Grundlage von bestimmten Zeilen in einem Cursor ausgeführt werden müssen. Durch die gespeicherte Prozedur, den Trigger oder das Skript wird Folgendes ausgeführt:
- Ausführen der Anweisungen DECLARE und OPEN für einen Cursor.
- Verwenden der FETCH-Anweisungen, um eine Position in einer Zeile im Cursor zu beziehen.
- Ausführen einer UPDATE- oder DELETE-Anweisung mit einer WHERE CURRENT OF-Klausel. Verwenden von cursor_name aus der DECLARE-Anweisung als cursor_name in der WHERE CURRENT OF-Klausel.
Ausführen positionierter Aktualisierungen mit APIs
Cursor, die über die API-Funktionen und -Methoden von OLE DB und ADO erstellt wurden, werden nicht in WHERE CURRENT OF-Klauseln verwendet, da sie keine Namen besitzen. ODBC unterstützt jedoch das Lesen des Namens eines API-Servercursors mithilfe der SQLGetCursorName-Funktion. Nach dem Festlegen der Cursorattribute und dem Öffnen eines Cursors durch Ausführen einer Transact-SQL-Anweisung sollten Sie die SQLGetCursorName-Funktion verwenden, um den Namen des Cursors zu lesen. Nach dem Positionieren im Cursor führen Sie eine UPDATE- oder DELETE-Anweisung mit einer WHERE CURRENT OF-Klausel aus, die auf den von SQLGetCursorName zurückgegebenen Namen verweist. Diese Methode wird jedoch nicht empfohlen. Vielmehr sollten die Funktionen der positionierten Aktualisierung der ODBC-API verwendet werden.
Die Datenbank-APIs unterstützen zwei unterschiedliche Methoden für das Ausführen positionierter Operationen in API-Servercursorn. ODBC unterstützt ein Modell, OLE DB und ADO unterstützen das andere Modell.
In ODBC sollten Sie die Spalten des Cursors an Programmvariablen binden und anschließend eine Position in einer bestimmten Zeile des Cursors einnehmen. Wird eine positionierte Aktualisierung ausgeführt, sollten Sie die Datenwerte in den Programmvariablen zu den neuen Werten ändern. Rufen Sie die SQLSetPos-Funktion auf, um die positionierte Operation auszuführen.
Diese Funktionen besitzen folgende Optionen:
SQLSetPos(SQL_POSITION)
Nur ODBC; positioniert den ODBC-Cursor in einer bestimmten Zeile im aktuellen Rowset.
SQLSetPos(SQL_REFRESH)
Aktualisiert die an die Resultsetspalten gebundenen Programmvariablen mit den Werten aus der Zeile, auf der der Cursor zurzeit positioniert ist.
SQLSetPos(SQL_UPDATE)
Aktualisiert die aktuelle Zeile im Cursor mit den Werten aus den an die Resultsetspalten gebundenen Programmvariablen.
SQLSetPos(SQL_DELETE)
Löscht die aktuelle Zeile im Cursor.
OLE DB und ADO verwenden ein anderes Modell, um positionierte Aktualisierungen zu unterstützen.
Rufen Sie in OLE DB, wenn Sie in einer Zeile im Rowset positioniert sind, die Methoden IRowsetChange::SetData oder IRowsetChange::DeleteRows auf, um positionierte Aktualisierungen auszuführen. Wenn der OLE DB-Anbieter IRowsetUpdate::Update unterstützt, werden die Änderungen, die mithilfe der IRowsetChange-Methoden ausgeführt werden, so lange zwischengespeichert, bis Sie IRowsetUpdate::Update aufrufen. Wenn der OLE DB-Anbieter IRowsetUpdate::Update nicht unterstützt, werden die mithilfe der IRowsetChange-Methoden ausgeführten Änderungen sofort durchgeführt.
Rufen Sie in ADO, wenn Sie in einer Zeile im Recordset positioniert sind, die Methoden Update oder Delete des Recordset-Objekts auf, um die positionierten Aktualisierungen auszuführen. Wenn der OLE DB-Anbieter IRowsetUpdate::Update unterstützt, werden die mit den Methoden Update oder Delete des Recordset-Objekts durchgeführten Änderungen so lange zwischengespeichert, bis Sie die UpdateBatch-Methode des Recordset-Objekts aufrufen. Wenn der OLE DB-Anbieter IRowsetUpdate::Update nicht unterstützt, werden die mithilfe der Methoden Update oder Delete des Recordset-Objekts ausgeführten Änderungen sofort durchgeführt.
Siehe auch
Andere Ressourcen
WHERE (Transact-SQL)
Positioned Updates (ODBC)