Бөлісу құралы:


Построение поисковых выражений

Внимание

Эта функция будет удалена в будущей версии Windows. Избегайте использования этой функции в новых рабочих областях разработки и планируете изменять приложения, которые в настоящее время используют эту функцию. Корпорация Майкрософт рекомендует использовать функции курсора драйвера.

Для поддержки позиционированных инструкций обновления и удаления библиотека курсоров создает инструкцию UPDATE или DELETE из позиционированного оператора. Для поддержки вызовов SQLGetData в блоке данных библиотека курсоров создает инструкцию SELECT для создания результирующий набор, содержащий текущую строку данных. В каждом из этих инструкций предложение WHERE перечисляет значения, хранящиеся в кэше для каждого связанного столбца, возвращающего SQL_PRED_SEARCHABLE или SQL_PRED_BASIC для идентификатора поля SQL_DESC_SEARCHABLE в SQLColAttribute.

Внимание

Предложение WHERE , созданное библиотекой курсоров для идентификации текущей строки, может не идентифицировать строки, определить другую строку или определить несколько строк.

Если размещенная инструкция обновления или удаления влияет на несколько строк, библиотека курсоров обновляет массив состояния строки только для строки, в которой находится курсор, и возвращает SQL_SUCCESS_WITH_INFO и SQLSTATE 01001 (конфликт операции курсора). Если инструкция не определяет строки, библиотека курсоров не обновляет массив состояния строки и возвращает SQL_SUCCESS_WITH_INFO и SQLSTATE 01001 (конфликт операции курсора). Приложение может вызвать SQLRowCount , чтобы определить количество строк, которые были обновлены или удалены.

Если предложение SELECT, используемое для размещения курсора для вызова SQLGetData, определяет несколько строк, SQLGetData не гарантирует возврат правильных данных. Если он не определяет строки, SQLGetData возвращает SQL_NO_DATA.

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

  • Привязка столбцов, однозначно определяющих строку. Если привязанные столбцы не однозначно определяют строку, предложение WHERE, созданное библиотекой курсоров, может определить несколько строк. В размещенном операторе обновления или удаления такое предложение может привести к обновлению или удалению нескольких строк. При вызове SQLGetData такое предложение может привести к тому, что драйвер возвращает данные для неправильной строки. Привязка всех столбцов в уникальном ключе гарантирует уникальность каждой строки.

  • Выделение буферов данных достаточно большого размера, чтобы не было усечений. Кэш библиотеки курсоров — это копия значений в буферах набора строк, привязанных к результирующем набору с SQLBindCol. Если данные усечены при его размещении в этих буферах, он также будет усечен в кэше. Предложение WHERE, созданное из усеченных значений, может неправильно определить базовую строку в источнике данных.

  • Укажите буферы длины, отличные от NULL, для двоичных данных C. Библиотека курсоров выделяет буферы длины в кэше, только если аргумент StrLen_or_IndPtr в SQLBindCol не имеет значения NULL. Если аргумент TargetType SQL_C_BINARY, библиотека курсоров требует длины двоичных данных для создания предложения WHERE из данных. Если для столбца SQL_C_BINARY нет буфера длины, а приложение вызывает SQLGetData или пытается выполнить позиционированную инструкцию обновления или удаления, библиотека курсоров возвращает SQL_ERROR и SQLSTATE SL014 (был выдан позиционный запрос, а не все поля счетчика столбцов были буферизуются).

  • Укажите буферы длины, отличные от NULL, для столбцов, допускающих значение NULL. Библиотека курсоров выделяет буферы длины в кэше, только если аргумент StrLen_or_IndPtr в SQLBindCol не имеет значения NULL. Так как SQL_NULL_DATA хранится в буфере длины, библиотека курсоров предполагает, что любой столбец, для которого не указан буфер длины, не допускает значение NULL. Если для столбца, допускающего значение NULL, длина столбца не указана, библиотека курсоров создает предложение WHERE , которое использует значение данных для столбца. Это предложение не будет правильно определять строку.