Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Обновляемые курсоры поддерживают инструкции изменения данных, которые обновляют строки через курсор. При позиционировании в строке обновляемого курсора можно выполнить операции обновления или удаления в отношении строк базовой таблицы, которые использовались для построения текущей строки курсора. Такие обновления называются позиционированными.
Позиционированные обновления выполняются в том же соединении, которым был открыт курсор. Это позволяет использовать для изменения данных и для курсора общее пространство транзакций и препятствует блокированию обновлений блокировками, принадлежащими курсору.
Существует два метода для выполнения позиционированных обновлений в курсоре:
- С помощью предложения Transact-SQL WHERE CURRENT OF для инструкции UPDATE или DELETE.
- С помощью функции или метода позиционированного обновления из API-интерфейса базы данных, например функции ODBC SQLSetPos.
Выполнение позиционированных обновлений с использованием Transact-SQL
Предложение Transact-SQL WHERE CURRENT OF обычно используется в хранимых процедурах, триггерах и сценариях Transact-SQL, когда изменение данных необходимо осуществлять на основе определенных строк в курсоре. Хранимой процедурой, триггером или сценарием выполняются следующие действия:
- Объявление и открытие курсора с помощью инструкций DECLARE и OPEN.
- Использование инструкции FETCH для позиционирования в строке курсора.
- Выполнение инструкции UPDATE или DELETE с использованием предложения WHERE CURRENT OF. При этом значение cursor_name из инструкции DECLARE используется в качестве значения cursor_name в предложении WHERE CURRENT OF.
Выполнение позиционированных обновлений с использованием API-интерфейсов
Курсоры, созданные с помощью функций и методов OLE DB и ADO, не используются в предложениях WHERE CURRENT OF, поскольку не имеют имен. Однако ODBC поддерживает назначение имени серверному курсору API с использованием функции SQLGetCursorName. Установив атрибуты курсора и открыв курсор путем выполнения инструкции Transact-SQL, используйте функцию SQLGetCursorName, чтобы получить имя для курсора. После позиционирования курсора выполните инструкцию UPDATE или DELETE с предложением WHERE CURRENT OF, в котором содержится ссылка на имя, возвращенное SQLGetCursorName. Но применять этот метод не рекомендуется. Вместо этого лучше использовать функции позиционированного обновления в API-интерфейсе ODBC.
API-интерфейсы баз данных поддерживают два различных метода выполнения позиционированных операций с серверными курсорами API. ODBC поддерживает одну модель, OLE DB и ADO — другую.
В ODBC привяжите столбцы курсора к программным переменным, затем позиционируйтесь в определенной строке курсора. Если выполняется позиционированное обновление, измените значения данных в программных переменных на новые значения. Для выполнения позиционированной операции вызовите функцию SQLSetPos.
Эта функция имеет следующие параметры:
- SQLSetPos(SQL_POSITION)
Только для ODBC; позиционирует курсор ODBC в определенной строке в текущем наборе строк.
- SQLSetPos(SQL_REFRESH)
Обновляет программные переменные, привязанные к столбцам результирующего набора, присваивая им новые значения из строки, в которой в настоящий момент позиционирован курсор.
- SQLSetPos(SQL_UPDATE)
Обновляет текущую строку в курсоре значениями, хранимыми в программных переменных, которые привязаны к столбцам результирующего набора.
- SQLSetPos(SQL_DELETE)
Удаляет текущую строку в курсоре.
В OLE DB и ADO для позиционированных обновлений используется другая модель.
В OLE DB при позиционировании в строке внутри набора строк вызовите методы IRowsetChange::SetData или IRowsetChange::DeleteRows для выполнения позиционированных обновлений. Если поставщик OLE DB поддерживает IRowsetUpdate::Update, то изменения, сделанные с помощью методов IRowsetChange, хранятся в кэше до тех пор, пока не будет вызван метод IRowsetUpdate::Update. Если поставщик OLE DB не поддерживает IRowsetUpdate::Update, изменения, сделанные с помощью методов IRowsetChange, вносятся немедленно.
В ADO при позиционировании в строке внутри набора записей вызовите методы Update или Delete объекта Recordset. Если поставщик OLE DB поддерживает IRowsetUpdate::Update, то изменения, сделанные с помощью методов Update или Delete объекта Recordset, хранятся в кэше до тех пор, пока не будет вызван метод UpdateBatch объекта Recordset. Если поставщик OLE DB не поддерживает IRowsetUpdate::Update, то изменения, сделанные с помощью методов Update или Delete объекта IRowsetChange, вносятся немедленно.
См. также
Другие ресурсы
Предложение WHERE (Transact-SQL)
Positioned Updates (ODBC)