Отправка данных типа Long

DBMS определяют длинные данные как любые символы или двоичные данные с определенным размером, например 254 символа. Возможно, невозможно сохранить весь элемент длинных данных в памяти, например, когда элемент представляет длинный текстовый документ или растровое изображение. Так как эти данные не могут храниться в одном буфере, источник данных отправляет его драйверу в части с SQLPutData при выполнении инструкции. Параметры, для которых данные отправляются во время выполнения, называются параметрами данных во время выполнения.

Примечание.

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

Чтобы отправить данные во время выполнения, приложение выполняет следующие действия:

  1. Передает 32-разрядное значение, которое определяет параметр в аргументе ParameterValuePtr в SQLBindParameter , а не передает адрес буфера. Это значение не анализируется драйвером. Оно будет возвращено приложению позже, поэтому оно должно означать что-то для приложения. Например, это может быть число параметров или дескриптор файла, содержащего данные.

  2. Передает адрес буфера длины или индикатора в аргументе StrLen_or_IndPtr SQLBindParameter.

  3. Сохраняет SQL_DATA_AT_EXEC или результат макроса SQL_LEN_DATA_AT_EXEC(длина) в буфере длины или индикатора. Оба этих значения указывают драйверу, что данные для параметра будут отправлены с помощью SQLPutData. SQL_LEN_DATA_AT_EXEC(длина) используется при отправке длинных данных в источник данных, который должен знать, сколько байтов длинных данных будет отправлено таким образом, чтобы он смог предварительно выделить пространство. Чтобы определить, требуется ли для источника данных это значение, приложение вызывает SQLGetInfo с параметром SQL_NEED_LONG_DATA_LEN. Все драйверы должны поддерживать этот макрос; Если источник данных не требует длины байтов, драйвер может игнорировать его.

  4. Вызывает SQLExecute или SQLExecDirect. Драйвер обнаруживает, что буфер длины или индикатора содержит значение SQL_DATA_AT_EXEC или результат макроса SQL_LEN_DATA_AT_EXEC(длина) и возвращает SQL_NEED_DATA в качестве возвращаемого значения функции.

  5. Вызывает SQLParamData в ответ на возвращаемое значение SQL_NEED_DATA. Если требуется отправить длинные данные, SQLParamData возвращает SQL_NEED_DATA. В буфере, на который указывает аргумент ValuePtrPtr , драйвер возвращает значение, определяющее параметр data-at-execution. Если существует несколько параметров выполнения данных, приложение должно использовать это значение, чтобы определить, какой параметр следует отправлять данные; Драйвер не требуется запрашивать данные для параметров выполнения во время выполнения в определенном порядке.

  6. Вызывает SQLPutData для отправки данных параметров драйверу. Если данные параметров не помещаются в один буфер, как это часто происходит с длинными данными, приложение многократно вызывает SQLPutData для отправки данных в частях; это до драйвера и источника данных для повторного анализа данных. Если приложение передает данные строки, завершаемые значением NULL, драйвер или источник данных должны удалить символ завершения null в процессе повторной сборки.

  7. Вызывает SQLParamData еще раз, чтобы указать, что он отправил все данные для параметра. Если существуют параметры, для которых данные не были отправлены, драйвер возвращает SQL_NEED_DATA и значение, определяющее следующий параметр; приложение возвращается на шаг 6. Если данные были отправлены для всех параметров выполнения данных, инструкция выполняется. SQLParamData возвращает SQL_SUCCESS или SQL_SUCCESS_WITH_INFO и может возвращать любое возвращаемое значение или диагностику, возвращаемые SQLExecute или SQLExecDirect .

После того как SQLExecute или SQLExecDirect возвращает SQL_NEED_DATA и до того, как данные были полностью отправлены для последнего параметра данных при выполнении, инструкция находится в состоянии "Необходимые данные". Хотя инструкция находится в состоянии "Необходимые данные", приложение может вызывать только SQLPutData, SQLParamData, SQLCancel, SQLGetDiagField или SQLGetDiagRec; все остальные функции возвращают SQLSTATE HY010 (ошибка последовательности функций). Вызов SQLCancel отменяет выполнение инструкции и возвращает его в предыдущее состояние. Дополнительные сведения см . в приложении B: таблицы перехода состояния ODBC.

Пример отправки данных во время выполнения см. в описании функции SQLPutData .