Compartir a través de


Longitud de los datos, la longitud de búfer y truncamiento

La longitud de los datos es la longitud en bytes de los datos como se almacenarían en el búfer de datos de la aplicación, no como se almacenan en el origen de datos. Esta distinción es importante porque los datos a menudo se almacenan en el búfer de datos con tipos diferentes que en el origen de datos. Por lo tanto, para los datos que se envían al origen de datos, es la longitud en 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 en 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 enteros o una estructura de fecha, la longitud en 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 que se ajusten a un búfer más pequeño. Si la aplicación asigna un búfer más grande, el espacio adicional nunca se usa.

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

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 para devolver, devuelve esos 10 bytes del búfer. La longitud en bytes de los datos es de 10, y la longitud en bytes del búfer es de 50. Si el controlador tiene 60 bytes de datos binarios para devolver, trunca los datos en 50 bytes, devuelve esos bytes del búfer y devuelve SQL_SUCCESS_WITH_INFO. La longitud en bytes de los datos es de 60 (la longitud antes del truncamiento), y la longitud en bytes del búfer sigue siendo de 50.

Se crea un registro de diagnóstico para cada columna que se trunca. Dado que se tarda tiempo en que el controlador cree estos registros y la aplicación los procese, el truncamiento puede degradar el rendimiento. Normalmente, para evitar este problema, una aplicación puede asignar búferes lo suficientemente grandes, aunque esto podría no ser posible al trabajar con datos de tipo Long. Cuando se produce un truncamiento de datos, la aplicación a veces puede asignar un búfer mayor y volver a capturar los datos; esto no es cierto 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 Obtener datos de tipo Long.