Поделиться через


Позиционированное обновление (ODBC)

ODBC поддерживает два метода для выполнения позиционированных обновлений в курсоре:

  • SQLSetPos

  • Предложение WHERE CURRENT OF

Наиболее часто применяемым подходом является использование SQLSetPos. Он содержит следующие параметры:

  • SQL_POSITION
    Позиционирует курсор в определенной строке в текущем наборе строк.

  • SQL_REFRESH
    Обновляет программные переменные, привязанные к столбцам результирующего набора, присваивая им новые значения из строки, в которой в настоящий момент позиционирован курсор.

  • SQL_UPDATE
    Обновляет текущую строку в курсоре значениями, хранимыми в программных переменных, которые привязаны к столбцам результирующего набора.

  • SQL_DELETE
    Удаляет текущую строку в курсоре.

Когда атрибуты курсора дескриптора инструкции установлены на использование серверных курсоров, SQLSetPos можно использовать с любым результирующим набором инструкции. Столбцы результирующего набора должны быть привязаны к переменным программы. После выбора приложением строки оно вызывает SQLSetPos(SQL_POSTION) для позиционирования курсора на строке. Затем приложение может вызвать SQLSetPos(SQL_DELETE) для удаления текущей строки или переместить новые значения данных в привязанные переменные программы и вызвать SQLSetPos(SQL_UPDATE) для обновления текущей строки.

С помощью SQLSetPos приложения могут обновлять или удалять любую строку набора строк. Вызов SQLSetPos является удобной альтернативой созданию и выполнению инструкции SQL. SQLSetPos работает с текущим набором строк и может использоваться только после вызова SQLFetchScroll.

Размер набора строк устанавливается вызовом SQLSetStmtAttr с аргументом атрибута SQL_ATTR_ROW_ARRAY_SIZE. SQLSetPos использует новый размер набора строк только после вызова SQLFetch или SQLFetchScroll. Например, если набор строк изменяется, то сначала вызывается SQLSetPos, а затем SQLFetch или SQLFetchScroll. Вызов SQLSetPos использует старый набор строк, а SQLFetch или SQLFetchScroll — новый.

Первая строка набора строк имеет номер 1. Аргумент RowNumber в SQLSetPos должен определять строку в наборе строк. То есть, его значение должно быть в диапазоне от 1 до числа последних выбранных строк. Оно может быть меньше размера набора строк. Если аргумент RowNumber имеет значение 0, то операция применяется к каждой строке набора строк.

Операция удаления SQLSetPos приводит к удалению из источника данных одной или нескольких выбранных строк таблицы. Для удаления строк с SQLSetPos приложение вызывает SQLSetPos с аргументом Operation, установленным в значение SQL_DELETE, и RowNumber, установленным на число строк, которые необходимо удалить. Если аргумент RowNumber имеет значение 0, то в наборе строк удаляются все строки.

После возвращения SQLSetPos удаленная строка является текущей строкой с состоянием SQL_ROW_DELETED. Ее нельзя использовать в каких-либо дополнительных позиционированных операциях, например, вызовах SQLGetData или SQLSetPos.

При удалении всех строк набора строк (аргумент RowNumber равен 0) приложение может предотвратить удаление определенных строк драйвером с помощью массива операций строк, как и для операции обновления SQLSetPos.

Каждая удаляемая строка должна существовать в результирующем наборе. Если буферы приложения заполняются выборкой, а массив состояния строк сохраняется, то значения каждой из этих позиций строк не должны иметь значение SQL_ROW_DELETED, SQL_ROW_ERROR, или SQL_ROW_NOROW.

Позиционированные обновления также можно выполнить с помощью предложения WHERE CURRENT OF инструкций UPDATE, DELETE и INSERT. Предложение WHERE CURRENT OF требует имени курсора, которое ODBC сформирует при вызове функции SQLGetCursorName или можно указать путем вызова SQLSetCursorName. Для обновления предложения WHERE CURRENT OF в предложении ODBC используются следующие основные шаги.

  • Вызовите SQLSetCursorName для установления имени курсора для дескриптора инструкции.

  • Создайте инструкцию SELECT с предложением FOR UPDATE OF и выполните ее.

  • Вызовите SQLFetchScroll для получения набора строк или SQLFetch для получения строки.

  • Вызовите SQLSetPos(SQL_POSITION) для позиционирования курсора на строке.

  • Создайте и выполните инструкцию UPDATE с предложением WHERE CURRENT OF, используя имя курсора, установленное с помощью SQLSetCursorName.

После выполнения инструкции SELECT можно также вызвать SQLGetCursorName, вместо вызова SQLSetCursorName после выполнения этой инструкции. Если имя курсора устанавливается без использования SQLSetCursorName, то SQLGetCursorName возвращает имя курсора по умолчанию, назначенное ODBC.

При использовании серверных курсоров SQLSetPos предпочтительнее предложения WHERE CURRENT OF. Если используется статический, обновляемый курсор с библиотекой курсоров ODBC, то данная библиотека реализует обновления предложения WHERE CURRENT OF путем добавления предложения WHERE с ключевыми значениями базовой таблицы. Это может вызвать непреднамеренные обновления, если ключи в таблице не являются уникальными.