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


Функция SQLExecute

Соответствие
Представлена версия: соответствие стандартам ODBC 1.0: ISO 92

Сводка
SQLExecute выполняет подготовленную инструкцию, используя текущие значения переменных маркера параметра, если в инструкции существуют какие-либо маркеры параметров.

Синтаксис

  
SQLRETURN SQLExecute(  
     SQLHSTMT     StatementHandle);  

Аргументы

ОператорHandle
[Входные данные] Дескриптор инструкции.

Возвраты

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NEED_DATA, SQL_STILL_EXECUTING, SQL_ERROR, SQL_NO_DATA, SQL_INVALID_HANDLE или SQL_PARAM_DATA_AVAILABLE.

Диагностика

Когда SQLExecute возвращает SQL_ERROR или SQL_SUCCESS_WITH_INFO, связанное значение SQLSTATE можно получить путем вызова SQLGetDiagRec с помощью HandleType SQL_HANDLE_STMT и handle of StatementHandle. В следующей таблице перечислены значения SQLSTATE, которые обычно возвращаются SQLExecute и объясняются каждый из них в контексте этой функции. Нотация "(DM)" предшествует описаниям SQLSTATEs, возвращаемым диспетчером драйверов. Возвращаемый код, связанный с каждым значением SQLSTATE, SQL_ERROR, если не указано иное.

SQLSTATE Ошибка Описание
01000 Общее предупреждение Информационное сообщение для конкретного драйвера. (Функция возвращает SQL_SUCCESS_WITH_INFO.)
01001 Конфликт операций курсора Подготовленная инструкция, связанная с Оператором StatementHandle , содержала позиционированный оператор обновления или удаления, а строки или несколько строк не были обновлены или удалены. (Дополнительные сведения об обновлениях нескольких строк см. в описании SQL_ATTR_SIMULATE_CURSOR Атрибут в SQLSetStmtAttr.)

(Функция возвращает SQL_SUCCESS_WITH_INFO.)
01003 Значение NULL, устраненное в функции set Подготовленная инструкция, связанная с StatementHandle, содержала функцию set (например, AVG, MAX, MIN и т. д.), но не функцию COUNT, а значения аргументов NULL были устранены до применения функции. (Функция возвращает SQL_SUCCESS_WITH_INFO.)
01004 Строковые данные, усеченные справа Строковые или двоичные данные, возвращаемые для выходного параметра, привели к усечению небланковых символов или двоичных данных, отличных от NULL. Если это строковое значение, оно было усечено по правому краю. (Функция возвращает SQL_SUCCESS_WITH_INFO.)
01006 Привилегии не отозваны Подготовленная инструкция, связанная с Оператором StatementHandle , была инструкцией REVOKE , и у пользователя не было указанной привилегии. (Функция возвращает SQL_SUCCESS_WITH_INFO.)
01007 Привилегии не предоставлены Подготовленная инструкция, связанная с Оператором StatementHandle , была инструкцией GRANT , и пользователю не удалось предоставить указанные привилегии.
01S02 Изменено значение параметра Указанный атрибут инструкции был недопустим из-за условий работы реализации, поэтому аналогичное значение временно заменено. (SQLGetStmtAttr можно вызвать, чтобы определить, что такое временно замененное значение.) Значение замены допустимо для оператора StatementHandle , пока курсор не будет закрыт, после чего атрибут инструкции возвращается к предыдущему значению. Атрибуты инструкции, которые можно изменить: SQL_ATTR_CONCURRENCY, SQL_ATTR_CURSOR_TYPE, SQL_ATTR_KEYSET_SIZE, SQL_ATTR_MAX_LENGTH, SQL_ATTR_MAX_ROWS, SQL_ATTR_QUERY_TIMEOUT и SQL_ATTR_SIMULATE_CURSOR. (Функция возвращает SQL_SUCCESS_WITH_INFO.)
01S07 Дробное усечение Данные, возвращаемые для входного или выходного параметра, усечены таким образом, чтобы дробная часть числового типа данных была усечена или дробной частью компонента времени, метки времени или типа данных интервала.

(Функция возвращает SQL_SUCCESS_WITH_INFO.)
07002 Неправильное поле COUNT Число параметров, указанных в SQLBindParameter , меньше количества параметров в инструкции SQL, содержащейся в *StatementText.

SQLBindParameter был вызван с параметром ParameterValuePtr , который имеет значение NULL, StrLen_or_IndPtr не задано значение SQL_NULL_DATA или SQL_DATA_AT_EXEC, и InputOutputType не задано значение SQL_PARAM_OUTPUT, чтобы число параметров, указанных в SQLBindParameter , было больше количества параметров в инструкции SQL, содержащейся в файле *StatementText.
07006 Нарушение атрибута ограниченного типа данных Значение данных, определяемое аргументом ValueType в SQLBindParameter для связанного параметра, не может быть преобразовано в тип данных, определенный аргументом ParameterType в SQLBindParameter.

Значение данных, возвращаемое для параметра, привязанного к SQL_PARAM_INPUT_OUTPUT или SQL_PARAM_OUTPUT, не может быть преобразовано в тип данных, определенный аргументом ValueType в SQLBindParameter.

(Если значения данных для одной или нескольких строк не удалось преобразовать, но одна или несколько строк были успешно возвращены, эта функция возвращает SQL_SUCCESS_WITH_INFO.)
07007 Нарушение ограниченного значения параметра Тип параметра SQL_PARAM_INPUT_OUTPUT_STREAM используется только для параметра, который отправляет и получает данные в частях. Для этого типа параметра не допускается входной привязанный буфер.

Эта ошибка возникает, если тип параметра SQL_PARAM_INPUT_OUTPUT, и если параметр *StrLen_or_IndPtr , указанный в SQLBindParameter , не равен SQL_NULL_DATA, SQL_DEFAULT_PARAM, SQL_LEN_DATA_AT_EXEC(len) или SQL_DATA_AT_EXEC.
07S01 Недопустимое использование параметра по умолчанию Значение параметра, заданное с помощью SQLBindParameter, было SQL_DEFAULT_PARAM, и соответствующий параметр не был параметром для вызова канонической процедуры ODBC.
08S01 Сбой связи Связь между драйвером и источником данных, к которому был подключен драйвер, произошел сбой до завершения обработки функции.
21S02 Степень производной таблицы не соответствует списку столбцов Подготовленная инструкция, связанная с оператором StatementHandle, содержала инструкцию CREATE VIEW и список неквалифицированных столбцов (число столбцов, указанных для представления в аргументах идентификатора столбцов инструкции SQL), содержало больше имен, чем число столбцов в производной таблице, определенной аргументом спецификации запроса инструкции SQL.
22001 Строковые данные, правое усечение Назначение символа или двоичного значения столбцу привело к усечению небланковых (символов) или непустых (двоичных) символов или байтов.
22002 Переменная индикатора, требуемая, но не указанная Данные NULL были привязаны к выходному параметру, StrLen_or_IndPtr заданный SQLBindParameter был указателем NULL.
22003 Числовое значение вне диапазона Подготовленная инструкция, связанная с ОператоромHandle , содержала привязанный числовый параметр, а значение параметра привело ко всей части (в отличие от дробной) части числа, усеченной при назначении связанному столбцу таблицы.

Возвращая числовое значение (как числовое или строковое) для одного или нескольких входных или выходных параметров, было бы вызвано усечение всей части (в отличие от дробной) части числа.
22007 Недопустимый формат datetime Подготовленная инструкция, связанная с оператором StatementHandle , содержала инструкцию SQL, содержащую структуру даты, времени или метки времени в качестве привязанного параметра, а параметр был соответственно недопустимым датой, временем или меткой времени.

Входной или выходной параметр привязан к структуре даты, времени или метки времени, а значение в возвращаемом параметре было соответственно недопустимой датой, временем или меткой времени. (Функция возвращает SQL_SUCCESS_WITH_INFO.)
22008 Переполнение поля Datetime Подготовленная инструкция, связанная с оператором StatementHandle , содержала инструкцию SQL, содержащую выражение datetime, которое при вычислении привело к недопустимой структуре даты, времени или метки времени.

Выражение даты и времени, вычисленное для входного или выходного параметра, привело к недопустимой структуре даты, времени или метки времени.
22012 Деление по нулю Подготовленная инструкция, связанная с ОператоромHandle , содержала арифметическое выражение, вызывающее деление на ноль.

Арифметическое выражение, вычисляемое для входного или выходного параметра, приводит к делении на нулю.
22015 Переполнение поля интервала *StatementText содержит точный числовый или интервальный параметр, который при преобразовании в тип данных SQL интервала вызвал потерю значительных цифр.

*StatementText содержал параметр интервала с несколькими полями, которые при преобразовании в числовый тип данных в столбце не имели представления в числовом типе данных.

*StatementText содержит данные параметров, назначенные типу SQL интервала, и не было представления значения типа C в типе SQL интервала.

Назначение входного или выходного параметра, который был точным числовым или интервалным типом SQL для типа C интервала C, приводил к потере значительных цифр.

При назначении входного или выходного параметра структуре C интервала не было представления данных в структуре данных интервала.
22018 Недопустимое значение символа для спецификации приведения *StatementText содержал тип C, который был точным или приблизительным числом, датой и интервалом, типом данных SQL столбца был символьный тип данных, а значение в столбце не было допустимым литералом привязанного типа C.

При возврате входного или выходного параметра тип SQL был точным или приблизительным числом, датой или типом данных интервала; Тип C был SQL_C_CHAR; значение в столбце не является допустимым литералом связанного типа SQL.
22019 Недопустимый escape-символ Подготовленная инструкция, связанная с StatementHandle , содержала предикат LIKE с ESCAPE в предложении WHERE , а длина escape-символа после ESCAPE не равна 1.
22025 Недопустимая последовательность escape-адресов Подготовленная инструкция, связанная с ОператоромHandle, содержала символ ESCAPE-escape-значения LIKE в предложении WHERE, а символ, следующий за escape-символом в значении шаблона, не был одним из "%" или "_".
23000 Нарушение ограничений целостности Подготовленная инструкция, связанная с ОператоромHandle , содержала параметр. Значение параметра было NULL для столбца, определенного как NOT NULL в связанном столбце таблицы, повторяющееся значение было предоставлено для столбца, ограниченного только уникальными значениями, или другое ограничение целостности было нарушено.
24000 Недопустимое состояние курсора Курсор был размещен на ОператорHandle SQLFetch или SQLFetchScroll. Эта ошибка возвращается диспетчером драйверов, если SQLFetch или SQLFetchScroll не вернул SQL_NO_DATA и возвращается драйвером, если SQLFetch или SQLFetchScroll вернул SQL_NO_DATA.

Курсор был открыт на операторе StatementHandle.

Подготовленная инструкция, связанная с оператором StatementHandle , содержала позиционированную инструкцию обновления или удаления, и курсор был размещен до начала результирующий набор или после окончания результирующий набор.
40001 Сбой сериализации Транзакция была откатена из-за взаимоблокировки ресурсов с другой транзакцией.
40003 Неизвестное завершение инструкции Связанное соединение завершилось сбоем во время выполнения этой функции, и состояние транзакции невозможно определить.
42 000 Синтаксическая ошибка или нарушение доступа У пользователя не было разрешения на выполнение подготовленной инструкции, связанной с ОператоромHandle.
44000 Нарушение параметра WITH CHECK OPTION Подготовленная инструкция, связанная с Оператором StatementHandle, содержит инструкцию INSERT, выполняемую в просматриваемой таблице или таблице, созданной с помощью инструкции WITH CHECK OPTION, так что одна или несколько строк, затронутых инструкцией INSERT, больше не будут присутствовать в просматриваемой таблице.

Подготовленная инструкция, связанная с оператором StatementHandle, содержит инструкцию UPDATE, выполняемую в просматриваемой таблице или таблице, полученной из просматриваемой таблицы, созданной путем указания WITH CHECK OPTION, таким образом, что одна или несколько строк, затронутых инструкцией UPDATE, больше не будут присутствовать в просматриваемой таблице.
HY000 Общая ошибка Произошла ошибка, для которой не было определенного SQLSTATE и для которого не было определено значение SQLSTATE для конкретной реализации. Сообщение об ошибке, возвращаемое SQLGetDiagRec в буфере *MessageText , описывает ошибку и ее причину.
HY001 Ошибка выделения памяти Драйверу не удалось выделить память, необходимую для поддержки выполнения или завершения функции.
HY008 Операция отменена Асинхронная обработка была включена для ОператораHandle. Функция была вызвана и до завершения выполнения, SQLCancel или SQLCancelHandle была вызвана на ОператорHandle. Затем функция снова была вызвана на ОператорHandle.

Функция была вызвана и до завершения выполнения SQLCancel или SQLCancelHandle была вызвана оператором StatementHandle из другого потока в многопотоковом приложении.
HY010 Ошибка последовательности функций (DM) Асинхронно выполняющаяся функция была вызвана для дескриптора соединения, связанного с ОператоромHandle. Эта асинхронная функция по-прежнему выполнялась при вызове функции SQLExecute .

(DM) SQLExecute, SQLExecDirect или SQLMoreResults был вызван для ОператораHandle и возвращен SQL_PARAM_DATA_AVAILABLE. Эта функция была вызвана до получения данных для всех потоковых параметров.

(DM) асинхронно выполняющаяся функция (не эта) была вызвана для StatementHandle и по-прежнему выполнялась при вызове этой функции.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperations или SQLSetPos были вызваны для ОператораHandle и возвращены SQL_NEED_DATA. Эта функция была вызвана до отправки данных для всех параметров выполнения или столбцов.

(DM) ЗаявлениеHandle не было подготовлено.
HY013 Ошибка управления памятью Не удалось обработать вызов функции, так как к базовым объектам памяти не удалось получить доступ, возможно, из-за низкой памяти.
HY090 Недопустимая длина строки или буфера Значение параметра, заданное с помощью SQLBindParameter, было пустым указателем, и значение длины параметра не равно 0, SQL_NULL_DATA, SQL_DATA_AT_EXEC, SQL_DEFAULT_PARAM или меньше или равно SQL_LEN_DATA_AT_EXEC_OFFSET.

Значение параметра, заданное с помощью SQLBindParameter, не было пустым указателем; тип данных C был SQL_C_BINARY или SQL_C_CHAR; и значение длины параметра было меньше 0, но не было SQL_NTS, SQL_NULL_DATA, SQL_DEFAULT_PARAM или SQL_DATA_AT_EXEC или меньше или равно SQL_LEN_DATA_AT_EXEC_OFFSET.

Значение длины параметра, привязанное к SQLBindParameter , было задано значение SQL_DATA_AT_EXEC; тип SQL был либо SQL_LONGVARCHAR, SQL_LONGVARBINARY, либо длинный тип данных для конкретного источника данных; а тип сведений SQL_NEED_LONG_DATA_LEN в SQLGetInfo был "Y".
HY105 Недопустимый тип параметра Значение, указанное для аргумента InputOutputType в SQLBindParameter , было SQL_PARAM_OUTPUT, и параметр был входным параметром.
HY109 Недопустимое положение курсора Подготовленная инструкция была позиционированной инструкцией обновления или удаления, и курсор был расположен (с помощью SQLSetPos или SQLFetchScroll) в строке, которая была удалена или не могла быть возвращена.
HY117 Подключение приостановлено из-за неизвестного состояния транзакции. Разрешены только функции отключения и только для чтения. (DM) Дополнительные сведения о приостановленном состоянии см. в статье SQLEndTran Function.
HYC00 Необязательный компонент не реализован Сочетание текущих параметров SQL_ATTR_CONCURRENCY и атрибутов инструкции SQL_ATTR_CURSOR_TYPE не поддерживается драйвером или источником данных.

Для атрибута инструкции SQL_ATTR_USE_BOOKMARKS задано значение SQL_UB_VARIABLE, а для атрибута инструкции SQL_ATTR_CURSOR_TYPE задан тип курсора, для которого драйвер не поддерживает закладки.
HYT00 Время ожидания истекло. Срок ожидания запроса истек, прежде чем источник данных вернул результирующий набор. Период времени ожидания задается через SQLSetStmtAttr, SQL_ATTR_QUERY_TIMEOUT.
HYT01 Время ожидания для подключения истекло Срок ожидания подключения истек до того, как источник данных ответил на запрос. Период времени ожидания подключения задается через SQLSetConnectAttr SQL_ATTR_CONNECTION_TIMEOUT.
IM001 Драйвер не поддерживает эту функцию (DM) Драйвер, связанный с StatementHandle , не поддерживает функцию.
IM017 Опрос отключен в асинхронном режиме уведомлений При использовании модели уведомлений опрос отключается.
IM018 SQLCompleteAsync не был вызван для выполнения предыдущей асинхронной операции с этим дескриптором. Если предыдущий вызов функции дескриптора возвращает SQL_STILL_EXECUTING и если включен режим уведомлений, sqlCompleteAsync должен вызываться на дескрипторе для выполнения последующей обработки и завершения операции.

SQLExecute может возвращать любой SQLSTATE, который может быть возвращен SQLPrepare, в зависимости от того, когда источник данных оценивает инструкцию SQL, связанную с инструкцией.

Комментарии

SQLExecute выполняет инструкцию, подготовленную SQLPrepare. После обработки или отмены результатов вызова SQLExecute приложение может снова вызвать SQLExecute с новыми значениями параметров. Дополнительные сведения о подготовленном выполнении см. в разделе "Подготовленное выполнение".

Чтобы выполнить инструкцию SELECT несколько раз, приложение должно вызвать SQLCloseCursor , прежде чем повторно выполнить инструкцию SELECT .

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

Если приложение использует SQLPrepare для подготовки и SQLExecute для отправки инструкции COMMIT или ROLLBACK , взаимодействие между продуктами СУБД не будет. Чтобы зафиксировать или откат транзакции, вызовите SQLEndTran.

Если SQLExecute обнаруживает параметр выполнения данных, он возвращает SQL_NEED_DATA. Приложение отправляет данные с помощью SQLParamData и SQLPutData. См. статью SQLBindParameter, SQLParamData, SQLPutData и отправка длинных данных.

Если SQLExecute выполняет поисковую инструкцию обновления, вставки или удаления, которая не влияет на строки в источнике данных, вызов SQLExecute возвращает SQL_NO_DATA.

Если значение атрибута инструкции SQL_ATTR_PARAMSET_SIZE больше 1, а инструкция SQL содержит по крайней мере один маркер параметра, SQLExecute выполняет инструкцию SQL один раз для каждого набора значений параметров в массивах, на который указывает аргумент *ParameterValuePtr в вызовах SQLBindParameter. Дополнительные сведения см. в разделе "Массивы значений параметров".

Если закладки включены и запрос не поддерживает закладки, драйвер должен попытаться принудить среду к той, которая поддерживает закладки, изменив значение атрибута и возвращая значение SQLSTATE 01S02 (значение параметра изменено). Если атрибут нельзя изменить, драйвер должен вернуть SQLSTATE HY024 (недопустимое значение атрибута).

Примечание.

При использовании пула подключений приложение не должно выполнять инструкции SQL, которые изменяют базу данных или контекст базы данных, например инструкцию USE database в SQL Server, которая изменяет каталог, используемый источником данных.

Пример кода

См. статью SQLBindParameter, SQLBulkOperations, SQLPutData и SQLSetPos.

Сведения Смотрите
Привязка буфера к столбцу в результирующем наборе Функция SQLBindCol
Отмена обработки инструкций Функция SQLCancel
Закрытие курсора Функция SQLCloseCursor
Выполнение операции фиксации или отката Функция SQLEndTran
Выполнение инструкции SQL Функция SQLExecDirect
Получение нескольких строк данных Функция SQLFetch
Получение блока данных или прокрутка результирующий набор Функция SQLFetchScroll
Освобождение дескриптора инструкций Функция SQLFreeStmt
Возврат имени курсора Функция SQLGetCursorName
Извлечение части или всех столбцов данных Функция SQLGetData
Возврат следующего параметра для отправки данных Функция SQLParamData
Подготовка инструкции для выполнения Функция SQLPrepare
Отправка данных параметров во время выполнения Функция SQLPutData
Задание имени курсора Функция SQLSetCursorName
Задание атрибута инструкции Функция SQLSetStmtAttr

См. также

Справочник по API ODBC
Файлы заголовков ODBC