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


Привязка и передача данных Table-Valued параметров и значений столбцов

Перед передачей на сервер табличное значение параметров, как и другие параметры, необходимо привязать. Приложение привязывает табличное значение параметров так же, как и привязывает другие параметры: с помощью SQLBindParameter или эквивалентных вызовов SQLSetDescField или SQLSetDescRec. Тип данных сервера для табличного параметра SQL_SS_TABLE. Тип C можно указать как SQL_C_DEFAULT, так и SQL_C_BINARY.

В SQL Server 2008 или более поздней версии поддерживаются только входные табличные параметры. Поэтому любая попытка задать SQL_DESC_PARAMETER_TYPE значение, отличное от SQL_PARAM_INPUT, вернет SQL_ERROR с SQLSTATE = HY105 и сообщением "Недопустимый тип параметра".

Все столбцы параметров с табличным значением можно назначать значения по умолчанию с помощью атрибута SQL_CA_SS_COL_HAS_DEFAULT_VALUE. Однако для отдельных значений столбцов столбцов с табличным значением нельзя назначать значения по умолчанию с помощью SQL_DEFAULT_PARAM в StrLen_or_IndPtr с SQLBindParameter. Табличное значение параметров в целом нельзя задать значение по умолчанию с помощью SQL_DEFAULT_PARAM в StrLen_or_IndPtr с SQLBindParameter. Если эти правила не соблюдаются, SQLExecute или SQLExecDirect возвращает SQL_ERROR. Диагностическая запись будет создана с помощью SQLSTATE=07S01 и сообщения "Недопустимое использование параметра по умолчанию для параметра <p>", где <p> — порядковый номер TVP в инструкции запроса.

После привязки табличного параметра приложение должно привязать каждый столбец параметров с табличным значением. Для этого приложение сначала вызывает SQLSetStmtAttr, чтобы задать SQL_SOPT_SS_PARAM_FOCUS порядковый номер табличного параметра. Затем приложение привязывает столбцы табличного параметра, вызывая следующие подпрограммы: SQLBindParameter, SQLSetDescRec и SQLSetDescField. Установка SQL_SOPT_SS_PARAM_FOCUS значение 0 восстанавливает обычный эффект SQLBindParameter, SQLSetDescRec и SQLSetDescField в работе с обычными параметрами верхнего уровня.

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

Параметр Связанный атрибут для типов параметров, отличных от табличного значения, включая столбцы Связанный атрибут для параметров с табличным значением
InputOutputType SQL_DESC_PARAMETER_TYPE в IPD.

Для столбцов параметров, возвращаемых табличным значением, это должно совпадать с параметром для самого табличного параметра.
SQL_DESC_PARAMETER_TYPE в IPD.

Это должно быть SQL_PARAM_INPUT.
ValueType SQL_DESC_TYPE, SQL_DESC_CONCISE_TYPE в APD. SQL_DESC_TYPE, SQL_DESC_CONCISE_TYPE в APD.

Это должно быть SQL_C_DEFAULT или SQL_C_BINARY.
ParameterType SQL_DESC_TYPE, SQL_DESC_CONCISE_TYPE в IPD. SQL_DESC_TYPE, SQL_DESC_CONCISE_TYPE в IPD.

Это должно быть SQL_SS_TABLE.
ColumnSize SQL_DESC_LENGTH или SQL_DESC_PRECISION в IPD.

Это зависит от значения ParameterType.
SQL_DESC_ARRAY_SIZE

Можно также задать с помощью SQL_ATTR_PARAM_SET_SIZE, если фокус параметра имеет значение табличного параметра.

Для табличного параметра это число строк в буферах столбцов столбцов с табличным значением.
DecimalDigits SQL_DESC_PRECISION или SQL_DESC_SCALE в IPD. Неиспользованный. Это должно быть 0.

Если этот параметр не равен 0, SQLBindParameter вернет SQL_ERROR, а диагностическая запись будет создана с помощью SQLSTATE= HY104 и сообщение "Недопустимая точность или масштабирование".
ParameterValuePtr SQL_DESC_DATA_PTR в APD. SQL_CA_SS_TYPE_NAME.

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

Этот параметр также служит уникальным значением, которое приложение может использовать для идентификации этого табличного параметра при использовании привязки строк переменной. Дополнительные сведения см. в разделе "Привязка строк параметров переменной Table-Valued" далее в этом разделе.

Если имя типа параметра с табличным значением указано при вызове SQLBindParameter, оно должно быть указано как значение Юникода, даже в приложениях, созданных как приложения ANSI. Значение, используемое для параметра StrLen_or_IndPtr , должно быть либо SQL_NTS, либо строковая длина имени, умноженная на размер(WCHAR).
BufferLength SQL_DESC_OCTET_LENGTH в APD. Длина имени типа параметра с табличным значением в байтах.

Это может быть SQL_NTS, если имя типа равно null или 0, если имя типа с табличным значением не требуется.
StrLen_or_IndPtr SQL_DESC_OCTET_LENGTH_PTR в APD. SQL_DESC_OCTET_LENGTH_PTR в APD.

Для параметров с табличным значением это число строк, а не длина данных.

Два режима передачи данных поддерживаются для параметров с табличным значением: фиксированная привязка строк и привязка строк переменной.

Исправлена привязка строк параметров Table-Valued

Для фиксированной привязки строк приложение выделяет буферы (или массивы буферов) достаточно большим для всех возможных входных значений столбцов. Приложение выполняет следующее:

  1. Привязывает все параметры с помощью вызовов SQLBindParameter, SQLSetDescRec или SQLSetDescField.

    1. Задает SQL_DESC_ARRAY_SIZE максимальное количество строк, которые можно передать для каждого табличного параметра. Это можно сделать в вызове SQLBindParameter.
  2. Вызывает SQLSetStmtAttr, чтобы задать SQL_SOPT_SS_PARAM_FOCUS порядковый номер каждого табличного параметра.

    1. Для каждого табличного параметра привязывает столбцы параметров, возвращающих табличное значение, с помощью SQLBindParameter, SQLSetDescRec или SQLSetDescField.

    2. Для каждого столбца параметров с табличным значением, который имеет значения по умолчанию, вызовет SQLSetDescField для задания SQL_CA_SS_COL_HAS_DEFAULT_VALUE значение 1.

  3. Вызывает SQLSetStmtAttr, чтобы задать SQL_SOPT_SS_PARAM_FOCUS значение 0. Это необходимо сделать до вызова SQLExecute или SQLExecDirect. В противном случае возвращается SQL_ERROR и создается диагностическая запись с помощью SQLSTATE=HY024 и сообщение "Недопустимое значение атрибута, SQL_SOPT_SS_PARAM_FOCUS (должно быть равно нулю во время выполнения)".

  4. Задает StrLen_or_IndPtr или SQL_DESC_OCTET_LENGTH_PTR SQL_DEFAULT_PARAM для табличного параметра без строк или количества строк, которые необходимо передать при следующем вызове SQLExecute или SQLExecDirect, если параметр с табличным значением имеет строки. StrLen_or_IndPtr или SQL_DESC_OCTET_LENGTH_PTR нельзя задать для SQL_NULL_DATA для табличного параметра, так как табличное значение параметров не допускает значение NULL (хотя табличное значение параметров может иметь значение NULL). Если задано недопустимое значение, SQLExecute или SQLExecDirect возвращает SQL_ERROR, а диагностическая запись создается с помощью SQLSTATE=HY090 и сообщение "Недопустимая строка или длина буфера для параметра <p>", где p — номер параметра.

  5. Вызывает SQLExecute или SQLExecDirect.

Входные значения столбцов столбцов параметров с табличным значением можно передавать в фрагментах, если StrLen_or_IndPtr задано значение SQL_LEN_DATA_AT_EXEC(длина) или SQL_DATA_AT_EXEC для столбца. Это похоже на передачу значений в фрагментах при использовании массивов параметров. Как и во всех параметрах выполнения данных, SQLParamData не указывает, какая строка массива драйвер запрашивает данные; Приложение должно заботиться об этом. Приложение не может делать никаких предположений о порядке, в котором драйвер запрашивает значения.

Привязка строк параметров переменной Table-Valued

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

  1. Привязывает параметры и столбцы параметров с табличным значением, как описано в шагах 1 до 3 предыдущего раздела "Исправлена привязка строк параметра Table-Valued".

  2. Задает StrLen_or_IndPtr или SQL_DESC_OCTET_LENGTH_PTR для всех табличных параметров, передаваемых во время выполнения в SQL_DATA_AT_EXEC. Если этот параметр не задан, параметр будет обработан, как описано в предыдущем разделе.

  3. Вызывает SQLExecute или SQLExecDirect. При наличии параметров SQL_PARAM_INPUT или SQL_PARAM_INPUT_OUTPUT параметров, которые будут обрабатываться в качестве параметров выполнения, SQL_NEED_DATA будут возвращены SQL_NEED_DATA. В этом случае приложение выполняет следующие действия:

    • Вызывает SQLParamData. Возвращает значение ParameterValuePtr для параметра выполнения данных и возвращаемого кода SQL_NEED_DATA. Когда все данные параметров передаются драйверу, SQLParamData возвращает SQL_SUCCESS, SQL_SUCCESS_WITH_INFO или SQL_ERROR. Для параметров выполнения параметр ParameterValuePtr, который совпадает с полем дескриптора SQL_DESC_DATA_PTR, можно рассматривать как токен для уникального определения параметра, для которого требуется значение. Этот маркер передается из приложения в драйвер во время привязки, а затем передается приложению во время выполнения.
  4. Чтобы отправить табличное значение данные строки параметров для параметров, возвращающих табличное значение, если параметр табличного значения не имеет строк, приложение вызывает SQLPutData с StrLen_or_Ind значение SQL_DEFAULT_PARAM .

    Для телевизоров, отличных от NULL, приложение:

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

    • Вызывает SQLPutData с Str_Len_or_Ind задать количество строк, отправляемых на сервер. Любое значение за пределами диапазона 0 до SQL_DESC_ARRAY_SIZE или SQL_DEFAULT_PARAM является ошибкой и возвращает SQLSTATE HY090 с сообщением "Недопустимая строка или длина буфера". 0 указывает, что все строки были отправлены и больше данных для табличного параметра (как указано во втором элементе маркера в этом списке). SQL_DEFAULT_PARAM можно использовать только при первом запросе данных драйвера к табличному параметру (как описано в первом элементе маркера в этом списке).

  5. Когда все строки были отправлены, вызывает SQLPutData для табличного параметра со значением Str_Len_or_Ind 0, а затем переходит к шагу 3a выше.

  6. Снова вызывает SQLParamData. Если между столбцами параметров, возвращаемыми табличным значением, существуют какие-либо параметры данных во время выполнения, они будут определяться значением ValuePtrPtr , возвращаемым SQLParamData. Когда все значения столбцов доступны, SQLParamData снова возвращает значение ParameterValuePtr для табличного параметра, и приложение начинается снова.

См. также

Возвращающие табличные значения параметры (ODBC)