Partilhar via


Comprimento dos dados, comprimento do buffer e truncamento

O comprimento dos dados é o comprimento do byte dos dados tal como seriam armazenados no buffer de dados da aplicação, e não como estão armazenados na fonte de dados. Esta distinção é importante porque os dados são frequentemente armazenados em tipos diferentes no buffer de dados do que na fonte de dados. Portanto, para os dados enviados para a fonte de dados, este é o comprimento do byte dos dados antes da conversão para o tipo da fonte de dados. Para dados recuperados da fonte de dados, este é o comprimento do byte dos dados após a conversão para o tipo do buffer de dados e antes de qualquer truncamento ser realizado.

Para dados de comprimento fixo, como um inteiro ou uma estrutura de data, o comprimento do byte dos dados é sempre o tamanho do tipo de dado. Em geral, as aplicações alocam um buffer de dados que é do tamanho do tipo de dado. Se a aplicação alocar um buffer menor, as consequências são indefinidas porque o driver assume que o buffer de dados tem o tamanho do tipo de dado e não trunca os dados para caber num buffer menor. Se a aplicação alocar um buffer maior, o espaço extra nunca é utilizado.

Para dados de comprimento variável, como dados de caracteres ou binários, é importante reconhecer que o comprimento do byte dos dados é separado e frequentemente diferente do comprimento do byte do buffer. A relação destes dois comprimentos é descrita na secção Buffers . Se o comprimento em bytes dos dados for maior do que o comprimento em bytes do buffer, o driver trunca os dados obtidos para o comprimento do byte do buffer e devolve SQL_SUCCESS_WITH_INFO com SQLSTATE 01004 (Dados truncados). No entanto, o comprimento do byte devolvido é o comprimento dos dados não truncados.

Por exemplo, suponha que uma aplicação aloca 50 bytes para um buffer de dados binário. Se o driver tiver 10 bytes de dados binários para devolver, devolve esses 10 bytes no buffer. O comprimento do byte dos dados é 10, e o comprimento do byte do buffer é 50. Se o driver tiver 60 bytes de dados binários para devolver, trunca os dados para 50 bytes, devolve esses bytes no buffer e devolve SQL_SUCCESS_WITH_INFO. O comprimento do byte dos dados é 60 (o comprimento antes do truncamento), e o comprimento do byte do buffer continua a ser 50.

É criado um registo de diagnóstico para cada coluna truncada. Como o driver leva tempo para criar estes registos e a aplicação para os processar, o truncamento pode degradar o desempenho. Normalmente, uma aplicação pode evitar este problema alocando buffers suficientemente grandes, embora isso possa não ser possível ao trabalhar com dados longos. Quando ocorre truncamento de dados, a aplicação pode, por vezes, alocar um buffer maior e recuperar os dados; Isto não é verdade em todos os casos. Se ocorrer truncamento ao receber dados com chamadas para SQLGetData, a aplicação não precisa de chamar SQLGetData para dados que já foram devolvidos; para mais informações, consulte Obter Dados Longos.