Compartir por


Datos de caracteres y cadenas de c

Los parámetros de entrada que hacen referencia a datos de caracteres de longitud variable (como nombres de columna, parámetros dinámicos y valores de atributo de cadena) tienen un parámetro de longitud asociado. Si la aplicación finaliza las cadenas con el carácter nulo, como es habitual en C, proporciona como argumento la longitud en bytes de la cadena (sin incluir el terminador NULL) o SQL_NTS (cadena terminada en NULL). Un argumento de longitud no negativa especifica la longitud real de la cadena asociada. El argumento de longitud puede ser 0 para especificar una cadena de longitud cero, que es distinta de un valor NULL. El valor negativo SQL_NTS dirige al controlador para determinar la longitud de la cadena mediante la localización del carácter de terminación NULL.

Cuando los datos de caracteres se devuelven del controlador a la aplicación, el controlador siempre debe finalizarlo en null. De esta forma, la aplicación puede elegir si controlar los datos como una cadena o una matriz de caracteres. Si el búfer de la aplicación no es lo suficientemente grande como para devolver todos los datos de caracteres, el controlador lo trunca a la longitud de bytes del búfer menos el número de bytes requeridos por el carácter de terminación null, termina en null los datos truncados y lo almacena en el búfer. Por lo tanto, las aplicaciones siempre deben asignar espacio adicional para el carácter de terminación NULL en los búferes usados para recuperar datos de caracteres. Por ejemplo, se necesita un búfer de 51 bytes para recuperar 50 caracteres de datos.

Tanto la aplicación como el controlador deben tener especial cuidado al enviar o recuperar datos de caracteres largos en partes con SQLPutData o SQLGetData. Si los datos se pasan como una serie de cadenas terminadas en NULL, los caracteres de terminación NULL de estas cadenas deben quitarse antes de que se puedan volver a ensamblar los datos.

Varios programadores de ODBC tienen datos de caracteres confusos y cadenas de C. Esto sucede porque se ha usado el lenguaje C al definir funciones ODBC. Si una aplicación o controlador ODBC usa otro lenguaje (recuerde que ODBC es independiente del lenguaje), es menos probable que surja esta confusión.

Cuando se usan cadenas de C para contener datos de caracteres, el carácter de terminación NULL no se considera parte de los datos y no se cuenta como parte de su longitud de bytes. Por ejemplo, los datos de caracteres "ABC" se pueden mantener como la cadena C "ABC\0" o la matriz de caracteres {'A', 'B', 'C'}. La longitud de bytes de los datos es 3, tanto si se trata como una cadena como una matriz de caracteres.

Aunque las aplicaciones y los controladores suelen usar cadenas de C (matrices de caracteres terminadas en NULL) para contener datos de caracteres, no es necesario. En C, los datos de caracteres también se pueden tratar como una matriz de caracteres (sin terminación NULL) y su longitud de bytes pasada por separado en el búfer de longitud o indicador.

Dado que los datos de caracteres se pueden mantener en una matriz que no termine en NULL y su longitud de bytes se puede pasar por separado, es posible insertar caracteres NULL en los datos de caracteres. Sin embargo, el comportamiento de las funciones ODBC en este caso no está definido y dependerá del controlador si lo controla correctamente. Por lo tanto, las aplicaciones interoperables siempre deben controlar los datos de caracteres que pueden contener caracteres NULL insertados como datos binarios.