Compartir por


Búferes

Un búfer es cualquier fragmento de memoria de la aplicación que se usa para pasar datos entre la aplicación y el controlador. Por ejemplo, los búferes de aplicación se pueden asociar o enlazar a columnas del conjunto de resultados con SQLBindCol. A medida que se captura cada fila, se devuelven datos para cada columna de estos búferes. Los búferes de entrada se usan para pasar datos de la aplicación al controlador; los búferes de salida se usan para devolver datos del controlador a la aplicación.

Nota:

Si una función de ODBC devuelve SQL_ERROR, el contenido de los argumentos de salida a esa función no está definido.

Esta discusión se refiere principalmente a los búferes de tipo indeterminado. Las direcciones de estos búferes aparecen como argumentos de tipo SQLPOINTER, como el argumento TargetValuePtr en SQLBindCol. Sin embargo, algunos de los elementos que se describen aquí, como los argumentos usados con los búferes, también se aplican a los argumentos usados para pasar cadenas al controlador, como el argumento TableName en SQLTables.

Estos búferes suelen venir en pares. Los búferes de datos se usan para pasar los propios datos, mientras que los búferes de longitud o indicador se usan para pasar la longitud de los datos en el búfer de datos o un valor especial, como SQL_NULL_DATA, lo que indica que los datos son NULL. La longitud de los datos de un búfer de datos es diferente de la longitud del propio búfer de datos. En la ilustración siguiente se muestra la relación entre el búfer de datos y el búfer de lognitud o indicador.

Data buffer and length/indicator buffer

Se requiere un búfer de longitud o indicador cada vez que el búfer de datos contiene datos de longitud variable, como datos binarios o de caracteres. Si el búfer de datos contiene datos de longitud fija, como un entero o una estructura de fecha, solo se necesita un búfer de longitud o indicador para pasar valores de indicador, porque ya se conoce la longitud de los datos. Si una aplicación usa un búfer de longitud o indicador con datos de longitud fija, el controlador omite las longitudes pasadas.

La longitud del búfer de datos y de los datos que contiene se mide en bytes, en lugar de caracteres. Esta distinción no tiene importancia para los programas que usan cadenas ANSI, porque las longitudes en bytes y caracteres son iguales.

Cuando el búfer de datos representa un campo de descriptor definido por el controlador, un campo de diagnóstico o un atributo, la aplicación debe indicar al Administrador de controladores la naturaleza del argumento de función que indica el valor del campo o atributo. Para ello, la aplicación debe establecer el argumento length en cualquier llamada de función que establezca el campo o atributo en uno de los valores siguientes. (Lo mismo sucede con las funciones que recuperan los valores del campo o atributo, con la excepción de que el argumento apunta a los valores que están en el propio argumento para la función de configuración.)

  • Si el argumento de función que indica el valor del campo o atributo es un puntero a una cadena de caracteres, el argumento length es la longitud de la cadena o SQL_NTS.

  • Si el argumento de función que indica el valor del campo o atributo es un puntero a un búfer binario, la aplicación coloca el resultado de la macro SQL_LEN_BINARY_ATTR(length) en el argumento length. Esto coloca un valor negativo en el argumento length.

  • Si el argumento de función que indica el valor del campo o atributo es un puntero a un valor que no es una cadena de caracteres o una cadena binaria, el argumento length debe tener el valor SQL_IS_POINTER.

  • Si el argumento de función que indica el valor del campo o atributo contiene un valor de longitud fija, el argumento length es SQL_IS_INTEGER, SQL_IS_UINTEGER, SQL_IS_SMALLINT o SQL_ISI_USMALLINT, según corresponda.

Esta sección contiene los temas siguientes.