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


Буферы

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

Примечание.

Если функция ODBC возвращает SQL_ERROR, содержимое любых выходных аргументов этой функции не определено.

Это обсуждение относится в первую очередь к буферам неопределенного типа. Адреса этих буферов отображаются как аргументы типа SQLPOINTER, например аргумент TargetValuePtr в SQLBindCol. Однако некоторые элементы, рассмотренные здесь, такие как аргументы, используемые с буферами, также применяются к аргументам, используемым для передачи строк драйверу, например аргументу TableName в SQLTables.

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

Data buffer and length/indicator buffer

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

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

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

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

  • Если аргумент функции, указывающий значение поля или атрибута, является указателем на двоичный буфер, приложение помещает результат макроса SQL_LEN_BINARY_ATTR(длина) в аргумент длины. Это помещает отрицательное значение в аргумент длины .

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

  • Если аргумент функции, указывающий значение поля или атрибута, содержит значение фиксированной длины, аргумент длины — SQL_IS_INTEGER, SQL_IS_UINTEGER, SQL_IS_SMALLINT или SQL_ISI_USMALLINT соответствующим образом.

Этот раздел содержит следующие подразделы.