Подготовленное выполнение ODBC

Подготовленное выполнение — это эффективный способ выполнения инструкции более одного раза. Инструкция сначала скомпилирована или подготовлена в план доступа. Затем план доступа выполняется один или несколько раз позже. Дополнительные сведения о планах доступа см. в разделе "Обработка инструкции SQL".

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

SQLREAL       Price;  
SQLUINTEGER   PartID;  
SQLINTEGER    PartIDInd = 0, PriceInd = 0;  
  
// Prepare a statement to update salaries in the Employees table.  
SQLPrepare(hstmt, "UPDATE Parts SET Price = ? WHERE PartID = ?", SQL_NTS);  
  
// Bind Price to the parameter for the Price column and PartID to  
// the parameter for the PartID column.  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_REAL, 7, 0,  
                  &Price, 0, &PriceInd);  
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 10, 0,  
                  &PartID, 0, &PartIDInd);  
  
// Repeatedly execute the statement.  
while (GetPrice(&PartID, &Price)) {  
   SQLExecute(hstmt);  
}  

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

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

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

Внимание

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

Чтобы подготовить и выполнить инструкцию, приложение:

  1. Вызывает SQLPrepare и передает ему строку, содержащую инструкцию SQL.

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

  3. Вызывает SQLExecute и выполняет дополнительную обработку, необходимую, например получение данных.

  4. При необходимости повторяет шаги 2 и 3.

  5. При вызове SQLPrepare драйвер:

    • Изменяет инструкцию SQL для использования грамматики SQL источника данных без анализа инструкции. Это включает в себя замену escape-последовательностей, рассмотренных в escape-последовательностях в ODBC. Приложение может получить измененную форму инструкции SQL, вызвав SQLNativeSql. Escape-последовательности не заменяются, если задан атрибут инструкции SQL_ATTR_NOSCAN.

    • Отправляет инструкцию в источник данных для подготовки.

    • Сохраняет идентификатор возвращаемого плана доступа для последующего выполнения (если подготовка выполнена успешно) или возвращает любые ошибки (если подготовка завершилась сбоем). К ошибкам относятся синтаксические ошибки, такие как SQLSTATE 42000 (синтаксическая ошибка или нарушение доступа) и семантические ошибки, такие как SQLSTATE 42S02 (базовая таблица или представление не найдено).

      Примечание.

      Некоторые драйверы не возвращают ошибки в данный момент, а возвращают их при выполнении инструкции или при вызове функций каталога. Таким образом, SQLPrepare может оказаться успешным, когда на самом деле он завершился ошибкой.

  6. При вызове SQLExecute драйвер:

    • Извлекает текущие значения параметров и преобразует их по мере необходимости. Дополнительные сведения см. в разделе "Параметры инструкции" далее в этом разделе.

    • Отправляет идентификатор плана доступа и преобразует значения параметров в источник данных.

    • Возвращает все ошибки. Обычно это ошибки во время выполнения, такие как SQLSTATE 24000 (недопустимое состояние курсора). Однако некоторые драйверы возвращают синтаксические и семантические ошибки на этом этапе.

Если источник данных не поддерживает подготовку инструкций, драйвер должен эмулировать его в максимально возможном объеме. Например, драйвер может ничего не делать при вызове SQLPrepare , а затем выполнять прямое выполнение инструкции при вызове SQLExecute .

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

Если драйвер не может эмулировать подготовку инструкций, он сохраняет инструкцию при вызове SQLPrepare и отправляет его для выполнения при вызове SQLExecute .

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