Данные типа Long Data и функции SQLSetPos и SQLBulkOperations

Как и в случае с параметрами в инструкциях SQL, длинные данные можно отправлять при обновлении строк с помощью SQLBulkOperations или SQLSetPos или при вставке строк с помощью SQLBulkOperations. Данные отправляются в части с несколькими вызовами SQLPutData. Столбцы, для которых данные отправляются во время выполнения, называются столбцами данных во время выполнения.

Примечание.

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

Так как длинные столбцы данных обычно не привязаны, приложение должно привязать столбец перед вызовом SQLBulkOperations или SQLSetPos и отменить его привязку после вызова SQLBulkOperations или SQLSetPos. Столбец должен быть привязан, так как SQLBulkOperations или SQLSetPos работает только в привязанных столбцах и должен быть несвязанным, чтобы SQLGetData можно было использовать для получения данных из столбца.

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

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

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

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

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

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

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

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