Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
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 с ключевыми значениями базовой таблицы. Это может вызвать непреднамеренные обновления, если ключи в таблице не являются уникальными.