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


Функция SQLPrepare

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

Сводка
SQLPrepare подготавливает строку SQL для выполнения.

Синтаксис

  
SQLRETURN SQLPrepare(  
     SQLHSTMT      StatementHandle,  
     SQLCHAR *     StatementText,  
     SQLINTEGER    TextLength);  

Аргументы

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

StatementText
[Входные данные] Текстовая строка SQL.

TextLength
[Входные данные] Длина *StatementText в символах.

Возвраты

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR или SQL_INVALID_HANDLE.

Диагностика

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

SQLSTATE Ошибка Описание
01000 Общее предупреждение Информационное сообщение для конкретного драйвера. (Функция возвращает SQL_SUCCESS_WITH_INFO.)
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.)
08S01 Сбой связи Связь между драйвером и источником данных, к которому был подключен драйвер, произошел сбой до завершения обработки функции.
21S01 Список вставок значений не соответствует списку столбцов *StatementText содержал инструкцию INSERT , а количество вставленных значений не соответствовало степени производной таблицы.
21S02 Степень производной таблицы не соответствует списку столбцов *StatementText содержит инструкцию CREATE VIEW , а число указанных имен не совпадает с производной таблицей, определенной спецификацией запроса.
22018 Недопустимое значение символа для спецификации приведения *StatementText содержит инструкцию SQL, содержащую литерал или параметр, и значение несовместимо с типом данных связанного столбца таблицы.
22019 Недопустимый escape-символ Аргумент StatementText содержал предикат LIKE с ESCAPE в предложении WHERE, а длина escape-символа после ESCAPE не равна 1.
22025 Недопустимая последовательность escape-адресов Аргумент StatementText содержит escape-символ "LIKE pattern value ESCAPE" в предложении WHERE, а символ, следующий за escape-символом в значении шаблона, не был ни "%", ни "_".
24000 Недопустимое состояние курсора (DM) Курсор был открыт на ОператорHandle, а SQLFetch или SQLFetchScroll был вызван.

Курсор был открыт на операторе StatementHandle, но не был вызван SQLFetch или SQLFetchScroll .
34000 Недопустимое имя курсора *StatementText содержал позиционированный DELETE или позиционированный UPDATE, а курсор, на который ссылается подготовленный оператор, не был открыт.
3D000 Недопустимое имя каталога Имя каталога, указанное в StatementText , было недопустимым.
3F000 Недопустимое имя схемы Недопустимое имя схемы, указанное в StatementText .
42 000 Синтаксическая ошибка или нарушение доступа *StatementText содержал инструкцию 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 , а таблица, указанная в ограничении (ссылающаяся на таблицу, не созданную) не существовала.
42S11 Индекс уже существует *StatementText содержит инструкцию CREATE INDEX , а указанное имя индекса уже существует.
42S12 Индекс не найден *StatementText содержал инструкцию DROP INDEX , и указанное имя индекса не существовало.
42S21 Столбец уже существует *StatementText содержит инструкцию ALTER TABLE, а столбец, указанный в предложении ADD, не является уникальным или идентифицирует существующий столбец в базовой таблице.
42S22 Столбец не найден *StatementText содержал инструкцию CREATE INDEX , а один или несколько имен столбцов, указанных в списке столбцов, не существовали.

*StatementText содержал инструкцию GRANT или REVOKE , а указанное имя столбца не существовало.

*StatementText содержит инструкцию SELECT, DELETE, INSERT или UPDATE, а указанное имя столбца не существует.

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

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

(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.
HY117 Подключение приостановлено из-за неизвестного состояния транзакции. Разрешены только функции отключения и только для чтения. (DM) Дополнительные сведения о приостановленном состоянии см. в статье SQLEndTran Function.
HYC00 Необязательный компонент не реализован Параметр параллелизма недопустим для определенного типа курсора.

Для атрибута инструкции 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 должен вызываться на дескрипторе для выполнения последующей обработки и завершения операции.

Комментарии

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

Примечание.

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

Драйвер может изменить инструкцию, чтобы использовать форму SQL, используемую источником данных, а затем отправить ее в источник данных для подготовки. В частности, драйвер изменяет escape-последовательности, используемые для определения синтаксиса SQL для определенных функций. (Описание грамматики инструкции SQL см. в разделе Escape-последовательности в ODBC и приложении C: грамматика SQL.) Для драйвера дескриптор инструкции аналогичен идентификатору инструкции в внедренном коде SQL. Если источник данных поддерживает идентификаторы инструкций, драйвер может отправить идентификатор оператора и значения параметров в источник данных.

После подготовки инструкции приложение использует дескриптор инструкции для ссылки на инструкцию в последующих вызовах функций. Подготовленная инструкция, связанная с дескриптором инструкции, может быть повторно выполнена путем вызова SQLExecute, пока приложение не освобождает инструкцию с вызовом SQLFreeStmt с параметром SQL_DROP или до тех пор, пока дескриптор инструкции не будет использоваться в вызове SQLPrepare, SQLExecDirect или одной из функций каталога (SQLColumns, SQLTables и т. д.). После подготовки инструкции приложение может запросить сведения о формате результирующий набор. Для некоторых реализаций вызов SQLDescribeCol или SQLDescribeParam после SQLPrepare может не быть столь эффективным, как вызов функции после SQLExecute или SQLExecDirect.

Некоторые драйверы не могут возвращать синтаксические ошибки или нарушения доступа, когда приложение вызывает SQLPrepare. Драйвер может обрабатывать синтаксические ошибки и нарушения доступа, только синтаксические ошибки или ни синтаксические ошибки, ни нарушения доступа. Поэтому приложение должно иметь возможность обрабатывать эти условия при вызове последующих связанных функций, таких как SQLNumResultCols, SQLDescribeCol, SQLColAttribute и SQLExecute.

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

Внимание

Фиксация транзакции путем явного вызова SQLEndTran или путем работы в режиме автоматической фиксации может привести к удалению источников данных планов доступа для всех инструкций подключения. Дополнительные сведения см. в SQL_CURSOR_COMMIT_BEHAVIOR и SQL_CURSOR_ROLLBACK_BEHAVIOR типах сведений в SQLGetInfo и эффекте транзакций на курсорах и подготовленных инструкциях.

Пример кода

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

Сведения Смотрите
Выделение дескриптора инструкций Функция SQLAllocHandle
Привязка буфера к столбцу в результирующем наборе Функция SQLBindCol
Привязка буфера к параметру Функция SQLBindParameter
Отмена обработки инструкций Функция SQLCancel
Выполнение операции фиксации или отката Функция SQLEndTran
Выполнение инструкции SQL Функция SQLExecDirect
Выполнение подготовленной инструкции SQL Функция SQLExecute
Возврат количества строк, затронутых инструкцией Функция SQLRowCount
Задание имени курсора Функция SQLSetCursorName

См. также

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