Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Parâmetros de entrada que se referem a dados de caracteres de comprimento variável (como nomes de colunas, parâmetros dinâmicos e valores de atributos de string) têm um parâmetro de comprimento associado. Se a aplicação terminar cadeias com o carácter nulo, como é típico em C, fornece como argumento o comprimento em bytes da cadeia (excluindo o terminador nulo) ou SQL_NTS (Null-Terminated String). Um argumento de comprimento não negativo especifica o comprimento real da cadeia associada. O argumento do comprimento pode ser 0 para especificar uma cadeia de comprimento zero, que é distinta de um valor NULL. O valor negativo SQL_NTS orienta o driver a determinar o comprimento da cadeia localizando o carácter de terminação nula.
Quando os dados dos caracteres são devolvidos do driver para a aplicação, este deve sempre terminá-los com null-termination. Isto dá à aplicação a escolha de tratar os dados como uma string ou um array de caracteres. Se o buffer da aplicação não for suficientemente grande para devolver todos os dados dos caracteres, o driver trunca-os para o comprimento do buffer menos o número de bytes necessários para o caráter de terminação nula, adiciona um caráter nulo ao final dos dados truncados e armazena-os no buffer. Portanto, as aplicações devem sempre alocar espaço extra para o carácter de terminação nula nos buffers usados para recuperar dados de caracteres. Por exemplo, é necessário um buffer de 51 bytes para recuperar 50 caracteres de dados.
Deve-se ter um cuidado especial tanto pela aplicação quanto pelo driver ao enviar ou recuperar dados longos de caracteres em partes com SQLPutData ou SQLGetData. Se os dados forem passados como uma série de cadeias terminadas por nulos, os caracteres de terminação nula dessas cadeias devem ser removidos antes de os dados poderem ser reconstituídos.
Vários programadores ODBC confundiram dados de caracteres com cadeias C. O facto de isto ter acontecido é um artefacto do uso da linguagem C ao definir funções ODBC. Se um driver ou aplicação ODBC usar outra linguagem – lembre-se que o ODBC é independente da linguagem – esta confusão é menos provável.
Quando as cadeias C são usadas para armazenar dados de caracteres, o carácter de terminação nula não é considerado parte dos dados e não é contado como parte do seu comprimento de byte. Por exemplo, os dados de carácter "ABC" podem ser mantidos como a cadeia C "ABC\0" ou o array de caracteres {'A', 'B', 'C'}. O comprimento do byte dos dados é 3, quer seja tratado como uma cadeia de caracteres ou um array de caracteres.
Embora aplicações e drivers usem frequentemente cadeias C (arrays de caracteres com terminação nula) para armazenar dados de caracteres, não há necessidade de o fazer. Em C, os dados de caracteres também podem ser tratados como um array de caracteres (sem terminação nula) e o comprimento em bytes é passado separadamente no buffer de comprimento/indicador.
Como os dados de carácter podem ser mantidos num array não terminado por nulo e o seu comprimento de byte passado separadamente, é possível incorporar caracteres nulos nos dados de caracteres. No entanto, o comportamento das funções ODBC neste caso é indefinido e depende do driver se este controla isto corretamente. Assim, as aplicações interoperáveis devem sempre tratar dados de caracteres que possam conter caracteres nulos embutidos como dados binários.