Создание поисковых запросов

Important

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

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

Caution

Клауза 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 , построенная из усеченных значений, может неправильно идентифицировать исходную строку в источнике данных.

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

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