Compartilhar via


Dados de caractere e cadeias de caracteres C

Os parâmetros de entrada que se referem a dados de caracteres de comprimento variável (como nomes de coluna, parâmetros dinâmicos e valores de atributo de cadeia de caracteres) têm um parâmetro de comprimento associado. Se o aplicativo encerrar cadeias de caracteres com o caractere nulo, como é típico em C, ele fornecerá como argumento o comprimento em bytes da cadeia de caracteres (não incluindo o terminador nulo) ou SQL_NTS (Cadeia de caracteres terminada nula). Um argumento de comprimento não negativo especifica o comprimento real da cadeia de caracteres associada. O argumento length pode ser 0 para especificar uma cadeia de caracteres de comprimento zero, que é diferente de um valor NULL. O valor negativo SQL_NTS direciona o driver para determinar o comprimento da cadeia de caracteres localizando o caractere de terminação nula.

Quando os dados de caracteres são retornados do driver para o aplicativo, o driver sempre deve encerrá-lo nulo. Isso dá ao aplicativo a opção de manipular os dados como uma cadeia de caracteres ou uma matriz de caracteres. Se o buffer do aplicativo não for grande o suficiente para retornar todos os dados de caracteres, o driver o truncará para o comprimento de byte do buffer menos o número de bytes exigido pelo caractere de terminação nula, terminará nulo os dados truncados e os armazenará no buffer. Portanto, os aplicativos sempre devem alocar espaço extra para o caractere de terminação nula em buffers usados para recuperar dados de caracteres. Por exemplo, um buffer de 51 bytes é necessário para recuperar 50 caracteres de dados.

Cuidado especial deve ser tomado pelo aplicativo e pelo driver ao enviar ou recuperar dados de caracteres longos em partes com SQLPutData ou SQLGetData. Se os dados forem passados como uma série de cadeias de caracteres terminadas em nulo, os caracteres de terminação nula nessas cadeias de caracteres deverão ser removidos antes que os dados possam ser remontados.

Vários programadores ODBC confundiram dados de caracteres e cadeias de caracteres C. Que isso ocorreu é um artefato de usar a linguagem C ao definir funções ODBC. Se um driver ou aplicativo ODBC usa outro idioma - lembre-se de que o ODBC é independente de idioma - essa confusão é menos provável de surgir.

Quando cadeias de caracteres C são usadas para armazenar dados de caracteres, o caractere de terminação nula não é considerado parte dos dados e não é contado como parte de seu comprimento de byte. Por exemplo, os dados de caracteres "ABC" podem ser mantidos como a cadeia de caracteres C "ABC\0" ou a matriz de caracteres {'A', 'B', 'C'}. O comprimento do byte dos dados é 3, quer sejam ou não tratados como uma cadeia de caracteres ou uma matriz de caracteres.

Embora os aplicativos e drivers geralmente usem cadeias de caracteres C (matrizes de caracteres terminadas em nulo) para armazenar dados de caracteres, não há nenhum requisito para fazer isso. Em C, os dados de caracteres também podem ser tratados como uma matriz de caracteres (sem terminação nula) e seu comprimento de byte passado separadamente no buffer de comprimento/indicador.

Como os dados de caracteres podem ser mantidos em uma matriz não terminada em nulo e seu comprimento de byte passado separadamente, é possível incorporar caracteres nulos em dados de caracteres. No entanto, o comportamento das funções ODBC nesse caso é indefinido e é específico do driver se um driver manipula isso corretamente. Assim, aplicativos interoperáveis devem sempre manipular dados de caracteres que podem conter caracteres nulos incorporados como dados binários.