Функция 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 |