Compartir a través de


Longitud de datos, longitud del búfer y truncamiento

La longitud de los datos es la longitud de bytes de los datos, ya que se almacenaría en el búfer de datos de la aplicación, no como se almacena en el origen de datos. Esta distinción es importante porque los datos a menudo se almacenan en tipos diferentes en el búfer de datos que en el origen de datos. Por lo tanto, para los datos que se envían al origen de datos, esta es la longitud de bytes de los datos antes de la conversión al tipo del origen de datos. Para los datos que se recuperan del origen de datos, esta es la longitud de bytes de los datos después de la conversión al tipo del búfer de datos y antes de que se realice cualquier truncamiento.

Para los datos de longitud fija, como un entero o una estructura de fecha, la longitud de bytes de los datos es siempre el tamaño del tipo de datos. En general, las aplicaciones asignan un búfer de datos que es el tamaño del tipo de datos. Si la aplicación asigna un búfer más pequeño, las consecuencias no están definidas porque el controlador supone que el búfer de datos es el tamaño del tipo de datos y no trunca los datos para ajustarse a un búfer más pequeño. Si la aplicación asigna un búfer mayor, nunca se usa el espacio adicional.

Para los datos de longitud variable, como los datos binarios o de caracteres, es importante reconocer que la longitud de bytes de los datos es independiente de y a menudo es diferente de la longitud de bytes del búfer. La relación de estas dos longitudes se describe en la sección Búferes . Si la longitud de bytes de los datos es mayor que la longitud de bytes del buffer, el controlador trunca los datos obtenidos a la longitud de bytes del buffer y devuelve SQL_SUCCESS_WITH_INFO con SQLSTATE 01004 (Datos Truncados). Sin embargo, la longitud de bytes devuelta es la longitud de los datos no truncados.

Por ejemplo, supongamos que una aplicación asigna 50 bytes para un búfer de datos binarios. Si el controlador tiene 10 bytes de datos binarios que se van a devolver, devuelve esos 10 bytes en el búfer. La longitud de bytes de los datos es 10 y la longitud de bytes del búfer es 50. Si el controlador tiene 60 bytes de datos binarios que se van a devolver, trunca los datos en 50 bytes, devuelve esos bytes en el búfer y devuelve SQL_SUCCESS_WITH_INFO. La longitud de bytes de los datos es 60 (la longitud antes del truncamiento) y la longitud de bytes del búfer sigue siendo 50.

Se crea un registro de diagnóstico para cada columna truncada. Dado que el controlador tarda tiempo en crear estos registros y para que la aplicación los procese, el truncamiento puede degradar el rendimiento. Normalmente, una aplicación puede evitar este problema asignando búferes lo suficientemente grandes, aunque esto podría no ser posible al trabajar con datos largos. Cuando se produce un truncamiento de datos, la aplicación a veces puede asignar un búfer mayor y volver a obtener los datos; sin embargo, esto no sucede en todos los casos. Si se produce un truncamiento al obtener datos con llamadas a SQLGetData, la aplicación no necesita llamar a SQLGetData para los datos que ya se han devuelto; para obtener más información, consulte Obtención de datos largos.