Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Соответствие
Представлена версия: соответствие стандартам ODBC 1.0: ISO 92
Сводка
SQLExecDirect выполняет препарабельную инструкцию, используя текущие значения переменных маркера параметра, если какие-либо параметры существуют в инструкции.
SQLExecDirect — самый быстрый способ отправки инструкции SQL для однократного выполнения.
Синтаксис
SQLRETURN SQLExecDirect(
SQLHSTMT StatementHandle,
SQLCHAR * StatementText,
SQLINTEGER TextLength);
Аргументы
ОператорHandle
[Входные данные] Дескриптор инструкции.
StatementText
[Входные данные] Инструкция SQL для выполнения.
TextLength
[Входные данные] Длина *StatementText в символах.
Возвраты
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NEED_DATA, SQL_STILL_EXECUTING, SQL_ERROR, SQL_NO_DATA, SQL_INVALID_HANDLE или SQL_PARAM_DATA_AVAILABLE.
Диагностика
Когда SQLExecDirect возвращает SQL_ERROR или SQL_SUCCESS_WITH_INFO, связанное значение SQLSTATE можно получить путем вызова SQLGetDiagRec с помощью HandleType SQL_HANDLE_STMT и handle of StatementHandle. В следующей таблице перечислены значения SQLSTATE, которые обычно возвращаются SQLExecDirect и объясняются каждый из них в контексте этой функции. Нотация "(DM)" предшествует описаниям SQLSTATEs, возвращаемым диспетчером драйверов. Возвращаемый код, связанный с каждым значением SQLSTATE, SQL_ERROR, если не указано иное.
| SQLSTATE | Ошибка | Описание |
|---|---|---|
| 01000 | Общее предупреждение | Информационное сообщение для конкретного драйвера. (Функция возвращает SQL_SUCCESS_WITH_INFO.) |
| 01001 | Конфликт операций курсора |
*
StatementText содержал позиционированную инструкцию обновления или удаления, а строки или несколько строк не были обновлены или удалены. (Дополнительные сведения об обновлениях нескольких строк см. в описании SQL_ATTR_SIMULATE_CURSOR Атрибут в SQLSetStmtAttr.) (Функция возвращает SQL_SUCCESS_WITH_INFO.) |
| 01003 | Значение NULL, устраненное в функции set | Аргумент StatementText содержал функцию set (например, AVG, MAX, MIN и т. д.), но не функцию count set, а значения аргументов NULL были устранены до применения функции. (Функция возвращает SQL_SUCCESS_WITH_INFO.) |
| 01004 | Строковые данные, усеченные справа | Строковые или двоичные данные, возвращаемые для входного или выходного параметра, привели к усечению небланковых символов или ненулевых двоичных данных. Если это строковое значение, оно было усечено по правому краю. (Функция возвращает SQL_SUCCESS_WITH_INFO.) |
| 01006 | Привилегии не отозваны | * StatementText содержал REVOKE оператор, и пользователь не имел указанного права. (Функция возвращает SQL_SUCCESS_WITH_INFO.) |
| 01007 | Привилегии не предоставлены | *StatementText был 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, а соответствующий параметр не имеет значения по умолчанию. |
| 08S01 | Сбой связи | Связь между драйвером и источником данных, к которому был подключен драйвер, произошел сбой до завершения обработки функции. |
| 21S01 | Список вставок значений не соответствует списку столбцов | * StatementText содержал INSERT оператор, и количество значений не совпадало со степенью производной таблицы. |
| 21S02 | Степень производной таблицы не соответствует списку столбцов | * StatementText содержал CREATE VIEW оператор, а список неквалифицированных столбцов (количество столбцов, указанных для представления в аргументах идентификатора столбцов SQL-оператора) содержал больше имён, чем количество столбцов в производной таблице, определённой аргументом спецификации запроса SQL-оператора. |
| 22001 | Строковые данные, правое усечение | Назначение символа или двоичного значения столбцу привело к усечению небланковых символьных данных или ненулевого двоичного значения. |
| 22002 | Переменная индикатора, требуемая, но не указанная | Данные NULL были привязаны к выходному параметру, StrLen_or_IndPtr заданный SQLBindParameter был указателем NULL. |
| 22003 | Числовое значение вне диапазона |
*
StatementText содержит инструкцию SQL, содержащую привязанный числовый параметр или литерал, и значение привело ко всей части (в отличие от дробной) части числа, усеченной при назначении связанному столбцу таблицы. Возвращая числовое значение (как числовое или строковое) для одного или нескольких входных или выходных параметров, было бы вызвано усечение всей части (в отличие от дробной) части числа. |
| 22007 | Недопустимый формат datetime |
*
StatementText содержал инструкцию SQL, содержащую структуру даты, времени или метки времени в качестве привязанного параметра, а параметр был соответственно недопустимым датой, временем или меткой времени. Входной или выходной параметр привязан к структуре даты, времени или метки времени, а значение в возвращаемом параметре было соответственно недопустимой датой, временем или меткой времени. (Функция возвращает SQL_SUCCESS_WITH_INFO.) |
| 22008 | Переполнение поля Datetime |
*
StatementText содержит инструкцию SQL, содержащую выражение datetime, которое при вычислении привело к недопустимой структуре меток даты, времени или метки времени. Выражение даты и времени, вычисленное для входного или выходного параметра, привело к недопустимой структуре даты, времени или метки времени. |
| 22012 | Деление по нулю |
*
StatementText содержит инструкцию SQL, содержащую арифметическое выражение, которое вызвало деление на ноль. Арифметическое выражение, вычисляемое для входного или выходного параметра, приводит к делении на нулю. |
| 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-символ | * StatementText содержит инструкцию SQL, содержащую предикат LIKE с ESCAPE в предложении WHERE , а длина escape-символа после ESCAPE не равна 1. |
| 22025 | Недопустимая последовательность escape-адресов | * StatementText содержит инструкцию SQL, содержащую "ESCAPE-символ значения шаблонаLIKE" в предложении WHERE, а символ, следующий за escape-символом в значении шаблона, не был одним из "%" или "_". |
| 23000 | Нарушение ограничений целостности | * StatementText содержит инструкцию SQL, содержащую параметр или литерал. Значение параметра было NULL для столбца, определенного как NOT NULL в связанном столбце таблицы, повторяющееся значение было предоставлено для столбца, ограниченного только уникальными значениями, или другое ограничение целостности было нарушено. |
| 24000 | Недопустимое состояние курсора | Курсор был размещен на ОператорHandleSQLFetch или SQLFetchScroll. Эта ошибка возвращается диспетчером драйверов, если SQLFetch или SQLFetchScroll не вернул SQL_NO_DATA и возвращается драйвером, если SQLFetch или SQLFetchScroll вернул SQL_NO_DATA. Курсор был открыт, но не расположен на ОператорHandle. * StatementText содержал позиционированную инструкцию обновления или удаления, а курсор был размещен до начала результирующий набор или после окончания результирующий набор. |
| 34000 | Недопустимое имя курсора | * StatementText содержал позиционный оператор обновления или удаления, и курсор, на который ссылается выполняемая инструкция, не был открыт. |
| 3D000 | Недопустимое имя каталога | Имя каталога, указанное в StatementText , было недопустимым. |
| 3F000 | Недопустимое имя схемы | Недопустимое имя схемы, указанное в StatementText . |
| 40001 | Сбой сериализации | Транзакция была откатена из-за взаимоблокировки ресурсов с другой транзакцией. |
| 40003 | Неизвестное завершение инструкции | Связанное соединение завершилось сбоем во время выполнения этой функции, и состояние транзакции невозможно определить. |
| 42 000 | Синтаксическая ошибка или нарушение доступа |
*
StatementText содержал инструкцию SQL, которая не была предварительной или содержала синтаксическую ошибку. У пользователя не было разрешения на выполнение инструкции SQL, содержащейся в *StatementText. |
| 42S01 | Базовая таблица или представление уже существует | * StatementText содержал CREATE TABLE оператор или CREATE VIEW , а указанное имя таблицы или представления уже существует. |
| 42S02 | Базовая таблица или представление не найдено |
*
StatementText содержал DROP TABLE оператор или DROP VIEW оператор, и указанное имя таблицы или представления не существовало. * StatementText содержал ALTER TABLE оператор, и указанное имя таблицы не существовало. * StatementText содержал CREATE VIEW оператор, а имя таблицы или представления, определённое спецификацией запроса, не существовало. * StatementText содержал CREATE INDEX оператор, и указанное имя таблицы не существовало. * StatementText содержал GRANT оператор или REVOKE , и указанного имени таблицы или представления не существовало. * StatementText содержал инструкцию SELECT , а указанное имя таблицы или имя представления не существовало. * StatementText содержал DELETE, INSERTили UPDATE оператор, и указанное имя таблицы не существовало. * StatementText содержал CREATE TABLE оператор, а таблица, указанная в ограничении (ссылающейся на таблицу, отличную от создаваемой), не существовала. * StatementText содержал CREATE SCHEMA оператор, и указанное имя таблицы или представления не существовало. |
| 42S11 | Индекс уже существует |
*
StatementText содержал CREATE INDEX оператор, и указанное имя индекса уже существовало. * StatementText содержал CREATE SCHEMA оператор, и указанное имя индекса уже существовало. |
| 42S12 | Индекс не найден | * StatementText содержал DROP INDEX оператор, и указанное имя индекса не существовало. |
| 42S21 | Столбец уже существует | * StatementText содержал ALTER TABLE оператор, и столбец, указанный в клаузе ADD , не является уникальным и не обозначает существующий столбец в базовой таблице. |
| 42S22 | Столбец не найден |
*
StatementText содержал CREATE INDEX оператор, и одно или несколько названий столбцов, указанных в списке столбцов, не существовало. * StatementText содержал GRANT оператор OR REVOKE , и указанное имя столбца не существовало. * StatementText содержал SELECT, DELETE, INSERTили UPDATE оператор, и указанного имя столбца не существовало. * StatementText содержал CREATE TABLE оператор, и столбца, указанная в ограничении (ссылающейся на таблицу, отличную от создаваемой), не существовала. * StatementText содержал CREATE SCHEMA оператор, и указанного имени столбца не существовало. |
| 44000 | Нарушение параметра WITH CHECK OPTION | Аргумент StatementText содержал INSERT оператор, выполняемый на просмотренной таблице, или таблицу, полученную из просмотренной таблицы, созданную путём указания WITH CHECK OPTION, так что одна или несколько строк, затронутых этим INSERT оператором, больше не будут присутствовать в просмотренной таблице. Аргумент StatementText содержал UPDATE оператор, выполняемый на просмотренной таблице, или таблицу, полученную из просмотренной таблицы, созданную путём указания WITH CHECK OPTION, так что одна или несколько строк, затронутых этим UPDATE оператором, больше не будут присутствовать в просмотренной таблице. |
| HY000 | Общая ошибка | Произошла ошибка, для которой не было определенного SQLSTATE и для которого не было определено значение SQLSTATE для конкретной реализации. Сообщение об ошибке, возвращаемое SQLGetDiagRec в буфере *MessageText , описывает ошибку и ее причину. |
| HY001 | Ошибка выделения памяти | Драйверу не удалось выделить память, необходимую для поддержки выполнения или завершения функции. |
| HY008 | Операция отменена | Асинхронная обработка была включена для ОператораHandle. Функция была вызвана и до завершения выполнения, SQLCancel или SQLCancelHandle была вызвана на ОператорHandle. Затем функция снова была вызвана на ОператорHandle. Функция была вызвана и до завершения выполнения SQLCancel или SQLCancelHandle была вызвана оператором StatementHandle из другого потока в многопотоковом приложении. |
| HY009 | Недопустимое использование указателя NULL | (DM) *StatementText — это указатель null. |
| HY010 | Ошибка последовательности функций | (DM) Асинхронно выполняющаяся функция была вызвана для дескриптора соединения, связанного с ОператоромHandle. Эта асинхронная функция по-прежнему выполнялась при вызове функции SQLExecDirect . (DM) SQLExecute, SQLExecDirect или SQLMoreResults был вызван для ОператораHandle и возвращен SQL_PARAM_DATA_AVAILABLE. Эта функция была вызвана до получения данных для всех потоковых параметров. (DM) асинхронно выполняющаяся функция (не эта) была вызвана для StatementHandle и по-прежнему выполнялась при вызове этой функции. (DM) SQLExecute, SQLExecDirect, SQLBulkOperations или SQLSetPos были вызваны для ОператораHandle и возвращены SQL_NEED_DATA. Эта функция была вызвана до отправки данных для всех параметров выполнения или столбцов. |
| HY013 | Ошибка управления памятью | Не удалось обработать вызов функции, так как к базовым объектам памяти не удалось получить доступ, возможно, из-за низкой памяти. |
| HY090 | Недопустимая длина строки или буфера | (DM) Аргумент TextLength был меньше или равен 0, но не равен SQL_NTS. Значение параметра, заданное с помощью SQLBindParameter, было пустым указателем, и значение длины параметра не равно 0, SQL_NULL_DATA, SQL_DATA_AT_EXEC, SQL_DEFAULT_PARAM или меньше или равно SQL_LEN_DATA_AT_EXEC_OFFSET. Значение параметра, заданное с помощью SQLBindParameter, не было указателем NULL; тип данных C был SQL_C_BINARY или SQL_C_CHAR; и значение длины параметра было меньше 0, но не было SQL_NTS, SQL_NULL_DATA, SQL_DATA_AT_EXEC, SQL_DEFAULT_PARAM или меньше или равно 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 | Недопустимое положение курсора | * StatementText содержал позиционированную инструкцию обновления или удаления, и курсор был размещен ( 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 должен вызываться на дескрипторе для выполнения последующей обработки и завершения операции. |
Комментарии
Вы вызываете SQLExecDirect для отправки инструкции SQL в источник данных. Дополнительные сведения о прямом выполнении см. в разделе "Прямое выполнение". Драйвер изменяет инструкцию для использования формы SQL, используемой источником данных, а затем отправляет его в источник данных. В частности, драйвер изменяет escape-последовательности, используемые для определения определенных функций в SQL. Синтаксис escape-последовательностей см. в разделе "Escape-последовательности" в ODBC.
В инструкцию SQL можно включить один или несколько маркеров параметров. Чтобы включить маркер параметра, вставьте вопросительный знак (?) в инструкцию SQL по соответствующей позиции. Сведения о параметрах см. в разделе "Параметры инструкции".
После успешного вызова SQLExecDirect , возвращающего результирующий набор (например, из инструкции SELECT ), дескриптор инструкции размещается перед первой строкой результирующий набор. Затем вы можете вызвать SQLFetch или SQLFetchScroll для получения строк, или вызвать SQLRowCount для определения количества затронутых строк для INSERT, UPDATE, или DELETE операторов.
Если инструкция SQL является инструкцией SELECT и называется SQLSetCursorName для связывания курсора с инструкцией, драйвер использует указанный курсор. В противном случае драйвер создает имя курсора.
Если источник данных находится в режиме ручной фиксации (требующий явного запуска транзакции) и транзакция еще не была инициирована, драйвер инициирует транзакцию перед отправкой инструкции SQL. Дополнительные сведения см. в режиме ручной фиксации.
Если вы используете SQLExecDirect для отправки инструкции COMMIT или ROLLBACK , она не будет взаимодействовать между продуктами СУБД. Чтобы зафиксировать или откат транзакции, вызовите SQLEndTran.
Если SQLExecDirect сталкивается с параметром выполнения данных, он возвращает SQL_NEED_DATA. Отправка данных с помощью SQLParamData и SQLPutData. См. статью SQLBindParameter, SQLParamData, SQLPutData и отправка длинных данных.
Если SQLExecDirect выполняет поиск обновления, вставки или удаления инструкции, которая не влияет на строки в источнике данных, вызов SQLExecDirect возвращает SQL_NO_DATA.
Если значение атрибута инструкции SQL_ATTR_PARAMSET_SIZE больше 1, а инструкция SQL содержит по крайней мере один маркер параметра, SQLExecDirect выполняет инструкцию SQL один раз для каждого набора значений параметров из массивов, на которые указывает аргумент ParameterValuePointer в вызове SQLBindParameter. Дополнительные сведения см. в разделе "Массивы значений параметров".
Если закладки включены и выполняется запрос, который не поддерживает закладки, драйвер должен попытаться принудить среду к той, которая поддерживает закладки, изменив значение атрибута и возвращая значение SQLSTATE 01S02 (значение параметра изменено). Если атрибут не может быть изменен, драйвер должен вернуть SQLSTATE HY024 (недопустимое значение атрибута).
Примечание.
При использовании пула подключений не выполняйте инструкции SQL, которые изменяют базу данных или контекст базы данных, например инструкцию USEdatabase в SQL Server, которая изменяет каталог, используемый источником данных.
Пример кода
См. статью SQLBindCol, SQLGetData и пример программы ODBC.
Связанные функции
| Сведения | Смотрите |
|---|---|
| Привязка буфера к столбцу в результирующем наборе | Функция SQLBindCol |
| Отмена обработки инструкций | Функция SQLCancel |
| Выполнение операции фиксации или отката | Функция SQLEndTran |
| Выполнение подготовленной инструкции SQL | Функция SQLExecute |
| Получение нескольких строк данных | Функция SQLFetch |
| Получение блока данных или прокрутка результирующий набор | Функция SQLFetchScroll |
| Возврат имени курсора | Функция SQLGetCursorName |
| Извлечение части или всех столбцов данных | Функция SQLGetData |
| Возврат следующего параметра для отправки данных | Функция SQLParamData |
| Подготовка инструкции для выполнения | Функция SQLPrepare |
| Отправка данных параметров во время выполнения | Функция SQLPutData |
| Задание имени курсора | Функция SQLSetCursorName |
| Задание атрибута инструкции | Функция SQLSetStmtAttr |