Использование значений длины и индикатора

Буфер длины или индикатора используется для передачи длины байтов данных в буфере данных или специального индикатора, например SQL_NULL_DATA, который указывает, что данные являются NULL. В зависимости от используемой функции буфер длины или индикатора определяется как SQLINTEGER или SQLSMALLINT. Поэтому для описания необходимо описать один аргумент. Если буфер данных является недеференционным входным буфером, этот аргумент содержит длину байтов самих данных или значение индикатора. Он часто называется StrLen_or_Ind или аналогичное имя. Например, следующий код вызывает SQLPutData для передачи буфера, заполненного данными; длина байтов (ValueLen) передается напрямую, так как буфер данных (ValuePtr) является входным буфером.

SQLCHAR      ValuePtr[50];  
SQLINTEGER   ValueLen;  
  
// Call local function to place data in ValuePtr. In ValueLen, return the  
// number of bytes of data placed in ValuePtr. If there is not enough  
// data, this will be less than 50.  
FillBuffer(ValuePtr, sizeof(ValuePtr), &ValueLen);  
  
// Call SQLPutData to send the data to the driver.  
SQLPutData(hstmt, ValuePtr, ValueLen);  

Если буфер данных является отложенным входным буфером, недеференционным выходным буфером или выходным буфером, аргумент содержит адрес буфера длины или индикатора. Он часто называется StrLen_or_IndPtr или аналогичное имя. Например, следующий код вызывает SQLGetData для получения буфера, заполненного данными; длина байтов возвращается приложению в буфере длины или индикатора (ValueLenOrInd), адрес которого передается в SQLGetData , так как соответствующий буфер данных (ValuePtr) является непреднамеренный выходной буфер.

SQLCHAR      ValuePtr[50];  
SQLINTEGER   ValueLenOrInd;  
SQLGetData(hstmt, 1, SQL_C_CHAR, ValuePtr, sizeof(ValuePtr), &ValueLenOrInd);  

Если это не запрещено, аргумент буфера длины или индикатора может быть 0 (если непреднамеренные входные данные) или пустой указатель (если выходные или отложенные входные данные). Для входных буферов драйвер игнорирует длину байтов данных. Это возвращает ошибку при передаче данных переменной длины, но часто возникает при передаче данных без значения NULL, так как ни длина, ни значение индикатора не требуется. Для выходных буферов драйвер не возвращает длину байтов данных или значение индикатора. Это ошибка, если данные, возвращаемые драйвером, имеют значение NULL, но часто используются при получении данных фиксированной длины, не допускающих значение NULL, так как ни длина, ни значение индикатора не требуются.

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

Следующие длины допустимы в качестве значений длины или индикатора:

  • n, где n> 0.

  • SQL_NTS. Строка, отправленная драйверу в соответствующем буфере данных, завершается null; Это удобный способ для программистов C передавать строки без необходимости вычислять их длину байтов. Это значение является законным только в том случае, если приложение отправляет данные драйверу. Когда драйвер возвращает данные в приложение, он всегда возвращает фактическую длину байтов данных.

Следующие значения допустимы в качестве значений длины или индикатора. SQL_NULL_DATA хранится в поле дескриптора SQL_DESC_INDICATOR_PTR; все остальные значения хранятся в поле дескриптора SQL_DESC_OCTET_LENGTH_PTR.

  • SQL_NULL_DATA. Данные являются значением NULL, а значение в соответствующем буфере данных игнорируется. Это значение является законным только для данных SQL, отправленных или полученных от драйвера.

  • SQL_DATA_AT_EXEC. Буфер данных не содержит никаких данных. Вместо этого данные будут отправляться с помощью SQLPutData при выполнении инструкции или при вызове SQLBulkOperations или SQLSetPos . Это значение является законным только для данных SQL, отправленных драйверу. Дополнительные сведения см. в разделе SQLBindParameter, SQLBulkOperations и SQLSetPos.

  • Результат макроса SQL_LEN_DATA_AT_EXEC(длина). Это значение аналогично SQL_DATA_AT_EXEC. Дополнительные сведения см. в разделе "Отправка длинных данных".

  • SQL_NO_TOTAL. Драйвер не может определить количество байтов длинных данных, которые по-прежнему доступны для возврата в выходной буфер. Это значение является законным только для данных SQL, полученных из драйвера.

  • SQL_DEFAULT_PARAM. Процедура — использовать значение по умолчанию входного параметра в процедуре вместо значения в соответствующем буфере данных.

  • SQL_COLUMN_IGNORE. SQLBulkOperations или SQLSetPos — игнорировать значение в буфере данных. При обновлении строки данных вызовом SQLBulkOperations или SQLSetPos значение столбца не изменяется. При вставке новой строки данных вызовом SQLBulkOperations значение столбца устанавливается по умолчанию или, если столбец по умолчанию не имеет значения NULL.