ID do artigo: 294169 - Última revisão: segunda-feira, 12 de maio de 2003 - Revisão: 2.1

DOC: Explicação de argumentos de comprimento para funções ODBC Unicode

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Expandir tudo | Recolher tudo

Sumário

O Gerenciador de driver ODBC versão 3.5 ou posterior suporta versões ANSI e Unicode de todas as funções que aceitam ponteiros para as seqüências de caracteres ou SQLPOINTER em seus argumentos. As funções do Unicode são implementadas como funções com um sufixo de "W", como SQLExecDirectW e SQLGetInfoW .

Para muitas dessas funções de Unicode, referência do programador ODBC fornece descrições incorretas ou ambíguas para alguns argumentos de função. Especificamente, esse problema se relaciona com argumentos que são usados para especificar o comprimento do caractere seqüência valores de entrada e saídas.

Mais Informações

Os problemas na documentação do ODBC envolvem se um argumento de comprimento deve especificar o número de bytes ou o número de caracteres em uma seqüência de entrada ou saída. Para a versão ANSI dessas funções, a contagem de bytes em uma seqüência de caracteres é igual a contagem de caracteres (como caracteres ANSI ocupam apenas um byte cada), para que os termos "bytes" e "caracteres" possam efetivamente ser usados alternadamente. No entanto, com as cadeias de caracteres Unicode, cada caractere ocupa dois bytes. Portanto, é muito importante distinguir se entradas de comprimento para uma função Unicode devem especificar uma contagem de bytes ou de caracteres.

Em alguns casos, a documentação usa a palavra "bytes" quando a palavra "caracteres" deve ter sido usada em vez disso. Em outros casos, a documentação não é necessariamente incorreta, mas Especifica que um "comprimento" de uma seqüência de caracteres é necessário, sem documentar explicitamente se esse valor deve ser uma contagem de bytes ou uma contagem de caracteres.

Independentemente do que a documentação diz para cada função ODBC, o parágrafo seguinte da seção de "Capítulo 17: programação considerações" na referência do programador de ODBC Unicode é a regra definitiva para usar para argumentos de comprimento em funções do Unicode:
"Funções de Unicode que sempre retornam ou seqüências de caracteres ou comprimento argumentos são passadas como contagem de caracteres. Para funções que retornam informações de comprimento de dados do servidor, o tamanho de exibição e precisão são descritos em número de caracteres. Quando um comprimento (tamanho de transferência dos dados) pode se referir a seqüência de caracteres ou nonstring dados, o comprimento é descrito em comprimento do octeto. Por exemplo, SQLGetInfoW ainda terão o comprimento de contagem de bytes, mas SQLExecDirectW usará a contagem de caracteres."
Isso significa que, se o argumento em questão descreve o comprimento do outro argumento é sempre uma seqüência de caracteres (normalmente representada por um SQLCHAR), e o comprimento reflete o número de caracteres na seqüência. Se o argumento de comprimento descreve outro argumento pode ser uma seqüência de caracteres ou algum outro tipo de dados (normalmente representado por um SQLPOINTER), o comprimento é em bytes.

A tabela a seguir lista todas as funções API ODBC que possuem as versões do Unicode. Para cada função listada, a tabela destaca os problemas conhecidos na documentação do ODBC e fornece uma descrição mais completa dos argumentos de comprimento em questão.

Recolher esta tabelaExpandir esta tabela
FunçãoNome de argumentoDescrição atualDescrição corrigida
SQLBrowseConnect StringLength1Comprimento de * InConnectionString.Comprimento de * InConnectionString, em caracteres.
BufferLengthComprimento do * OutConnectionString buffer.Comprimento do * OutConnectionString buffer, em caracteres.
StringLength2PtrO número total de bytes (excluindo o byte de terminação nula) disponíveis para retornar em * OutConnectionString.O número total de caracteres (excluindo o caractere de terminação nula) disponíveis para retornar em * OutConnectionString.
SQLColAttribute BufferLengthSe FieldIdentifier é um campo definido pelo ODBC e CharacterAttributePtr aponta para uma seqüência de caracteres ou buffer binário, esse argumento deverá ser o tamanho de * CharacterAttributePtr. Se FieldIdentifier for um campo definido pelo ODBC e * CharacterAttributePtr é um número inteiro, este campo é ignorado. Se o * CharacterAttributePtr é uma seqüência de caracteres Unicode (ao chamar SQLColAttributeW), o argumento BufferLength deve ser um número parIsso está correto. BufferLength se refere ao número de bytes disponíveis para o valor no CharacterAttributePtr.
StringLengthPtrPonteiro para um buffer no qual retornar o número total de bytes (excluindo a finalização null do byte de dados de caracteres) disponíveis para retornar em * CharacterAttributePtr.Isso está correto.
SQLColAttributes Essa função como foi substituída para SQLColAttribute (veja acima).
SQLColumnPrivileges NameLength1-4Comprimento de * CatalogName. (Observe aqui que há quatro argumentos diferentes que contêm valores de comprimento. Cada um deles se refere a uma entrada diferente ou buffer de saída, como CatalogName, SchemaName, TableName e ColumnName. Para simplificar, para todas as funções com valores de entrada semelhantes, este tabelas combina todos os argumentos tais NameLength, em vez de listar cada um deles separadamente.)Comprimento de * CatalogName, em caracteres.
SQLColumns NameLength1-4Comprimento de * CatalogName.Comprimento de * CatalogName, em caracteres.
SQLConnect NameLength1-3Comprimento de * nomedoservidor.Comprimento de * NomeDoServidor, em caracteres.
SQLDataSources BufferLength1Comprimento do * nome_do_servidor buffer, em bytes.Comprimento do * nome_do_servidor buffer, em caracteres.
NameLength1PtrPonteiro para um buffer no qual retornar o número total de bytes (excluindo o byte de terminação nula). Ponteiro para um buffer no qual retornar o número total de caracteres (excluindo o caractere de terminação nula).
BufferLength2Comprimento do * descrição buffer.Comprimento do * buffer descrição, em caracteres.
NameLength2PtrPonteiro para um buffer no qual retornar o número total de bytes (excluindo o byte de terminação nula) disponíveis para retornar em * Descrição.Ponteiro para um buffer no qual retornar o número total de caracteres (excluindo o caractere de terminação nula) disponíveis para retornar em * Descrição.
SQLDescribeCol BufferLengthComprimento do * ColumnName buffer, em caracteres.Isso está correto.
NameLengthPtrPonteiro para um buffer no qual retornar o número total de bytes (excluindo o byte de terminação nula) disponíveis para retornar em * ColumnName.Ponteiro para um buffer no qual retornar o número total de caracteres (excluindo o caractere de terminação nula) disponíveis para retornar em * ColumnName.
SQLDriverConnect StringLength1Comprimento de * InConnectionString, em bytes.Comprimento de * InConnectionString, em caracteres.
BufferLengthComprimento do * OutConnectionString buffer. Se o * OutConnectionString valor é uma seqüência de caracteres Unicode (ao chamar SQLDriverConnectW), o argumento BufferLength deve ser um número par.Comprimento do * OutConnectionString buffer, em caracteres. (Observe que isso significa que esse argumento não é necessário ser um número par.)
StringLength2PtrPonteiro para um buffer no qual retornar o número total de caracteres (excluindo o caractere de terminação nula) disponíveis para retornar em * OutConnectionString.Isso está correto.
SQLDrivers BufferLength1Comprimento do * DriverDescription buffer, em bytes.Comprimento do * DriverDescription buffer, em caracteres.
DescriptionLengthPtrPonteiro para um buffer no qual retornar o número total de bytes (excluindo o byte de terminação nula) disponíveis para retornar em * DriverDescription.Ponteiro para um buffer no qual retornar o número total de caracteres (excluindo o caractere de terminação nula) disponíveis para retornar em * DriverDescription.
BufferLength2Comprimento do * DriverAttributes buffer, em bytes. Se o * DriverDescription valor é uma seqüência de caracteres Unicode (ao chamar SQLDriversW), o argumento BufferLength deve ser um número par.Comprimento do * DriverAttributes buffer, em caracteres. (Observe que isso significa que esse argumento não é necessário ser um número par.)
AttributesLengthPtrPonteiro para um buffer no qual retornar o número total de bytes (excluindo o byte de terminação nula) disponíveis para retornar em * DriverAttributes.Ponteiro para um buffer no qual retornar o número total de caracteres (excluindo o caractere de terminação nula) disponíveis para retornar em * DriverAttributes.
SQLError Esta função foi substituída para SQLGetDiagRec.
SQLExecDirect TextLengthComprimento de * StatementText.Comprimento de * StatementText, em caracteres.
SQLForeignKeys NameLength1 2Comprimento de * PKCatalogName, em bytes.Comprimento de * PKCatalogName, em caracteres.
NameLength3-6Comprimento de * PKTableName.Comprimento de * PKTableName, em caracteres.
SQLGetConnectAttr BufferLengthSe o valor no * ValuePtr é uma seqüência de caracteres Unicode (ao chamar SQLGetConnectAttrW), o argumento BufferLength deve ser um número par. Isso está correto. BufferLength deve conter uma contagem de bytes.
StringLengthPtrUm ponteiro para um buffer no qual retornar o número total de bytes (excluindo o caractere de terminação nula) disponíveis para retornar em * ValuePtr.Isso está correto.
SQLGetConnectOption Esta função foi substituída para SQLGetConnectAttr.
SQLGetCursorName BufferLengthComprimento de * CursorName, em bytes. Se o valor no * CursorName é uma seqüência de caracteres Unicode (ao chamar SQLGetCursorNameW), o argumento BufferLength deve ser um número par.Comprimento de * CursorName, em caracteres. (Observe que isso significa que esse argumento não é necessário ser um número par.)
NameLengthPtrPonteiro para a memória retornar o número total de bytes (excluindo o caractere de terminação nula) disponíveis para retornar em * CursorName.Ponteiro para a memória retornar o número total de caracteres (excluindo o caractere de terminação nula) disponíveis para retornar em * CursorName.
SQLGetDescField BufferLengthSe o valor no * ValuePtr é de um tipo de dados Unicode (ao chamar SQLGetDescFieldW), o argumento BufferLength deve ser um número par.Isso está correto. BufferLength deve conter uma contagem de bytes.
StringLengthPtrPonteiro para o buffer no qual retornar o número total de bytes (excluindo o número de bytes necessários para o caractere de terminação nula) disponíveis para retornar em * ValuePtr.Isso está correto.
SQLGetDescRec BufferLengthComprimento do * buffer de nome, em bytes.Comprimento do * buffer de nome, em caracteres.
StringLengthPtrUm ponteiro para um buffer no qual retornar o número de bytes de dados disponíveis para retornar o * buffer de nome, excluindo o caractere de finalização null.Um ponteiro para um buffer no qual retornar o número de caracteres disponíveis para retornar o * buffer de nome, excluindo o caractere de finalização null.
SQLGetDiagField BufferLengthSe o valor no * DiagInfoPtr é uma seqüência de caracteres Unicode (ao chamar SQLGetDiagFieldW), o argumento BufferLength deve ser um número par.Isso está correto. BufferLength deve conter uma contagem de bytes.
StringLengthPtrPonteiro para um buffer no qual retornar o número total de bytes (excluindo o número de bytes necessários para o caractere de terminação nula) disponíveis para retornar em * DiagInfoPtr, para dados de caracteres. Isso está correto.
SQLGetDiagRec BufferLengthComprimento do * MessageText buffer em caracteres.Isso está correto
TextLengthPtrPonteiro para um buffer no qual retornar o número total de bytes (excluindo o número de bytes necessários para o caractere de terminação nula) disponíveis para retornar em * MessageText. Ponteiro para um buffer no qual retornar o número total de caracteres (excluindo o caractere de terminação nula) disponíveis para retornar em * MessageText.
SQLGetInfo BufferLengthComprimento do * InfoValuePtr buffer. Se * InfoValuePtr é uma seqüência de caracteres Unicode (ao chamar SQLGetInfoW), o argumento BufferLength deve ser um número par.Isso está correto. BufferLength deve conter uma contagem de bytes.
StringLengthPtrPonteiro para um buffer no qual retornar o número total de bytes (excluindo o caractere de terminação nula para dados de caractere) disponíveis para retornar em * InfoValuePtr.Isso está correto.
SQLGetStmtAttr BufferLengthSe o atributo é um atributo definido pelo ODBC e ValuePtr aponta para uma seqüência de caracteres ou um buffer binário, este argumento deve ser o comprimento do * ValuePtr. Se o valor retornado no * ValuePtr é uma seqüência de caracteres Unicode (ao chamar SQLGetStmtAttrW), o argumento BufferLength deve ser um número parIsso está correto. BufferLength deve conter uma contagem de bytes.
StringLengthPtrUm ponteiro para um buffer no qual retornar o número total de bytes (excluindo o caractere de terminação nula) disponíveis para retornar em * ValuePtr.Isso está correto.
SQLNativeSQL TextLength1Comprimento de * InStatementText seqüência de caracteres de texto.Comprimento de * InStatementText seqüência de texto, em caracteres.
BufferLengthComprimento do * OutStatementText buffer. Se o valor retornado no * InStatementText é uma seqüência de caracteres Unicode (ao chamar SQLNativeSqlW), o argumento BufferLength deve ser um número par.Comprimento do * OutStatementText buffer, em caracteres. (Observe que isso significa que esse argumento não é necessário ser um número par.)
TextLength2PtrPonteiro para um buffer no qual retornar o número total de bytes (excluindo o byte de terminação nula) disponíveis para retornar em * OutStatementText.Ponteiro para um buffer no qual retornar o número total de caracteres (excluindo o caractere de terminação nula) disponíveis para retornar em * OutStatementText.
SQLPrepare TextLengthComprimento de * StatementText.Comprimento de * StatementText, em caracteres.
SQLPrimaryKeys NameLength1-3Comprimento em bytes de * CatalogName.Comprimento de * CatalogName, em caracteres.
SQLProcedureColumns NameLength1-4Comprimento de * CatalogName.Comprimento de * CatalogName, em caracteres.
SQLProcedures NameLength1-3Comprimento em bytes de * CatalogName.Comprimento de * CatalogName, em caracteres.
SQLSetConnectAttr StringLengthSe o atributo é um atributo definido pelo ODBC e ValuePtr aponta para uma seqüência de caracteres ou um buffer binário, este argumento deve ser o comprimento do * ValuePtr.Se o atributo é um atributo definido pelo ODBC e ValuePtr aponta para uma seqüência de caracteres ou um buffer binário, este argumento deve ser o comprimento do * ValuePtr. Para dados de seqüência de caracteres, esse argumento deve conter o número de bytes na seqüência de caracteres.
SQLSetConnectOption Esta função foi substituída para SQLSetConnectAttr.
SQLSetCursorName NameLengthComprimento de * CursorName.Comprimento de * CursorName, em caracteres.
SQLSetDescField BufferLengthSe FieldIdentifier é um campo definido pelo ODBC e ValuePtr aponta para uma seqüência de caracteres ou um buffer binário, esse argumento deverá ser o tamanho de * ValuePtr.Se FieldIdentifier é um campo definido pelo ODBC e ValuePtr aponta para uma seqüência de caracteres ou um buffer binário, esse argumento deverá ser o tamanho de * ValuePtr. Para dados de seqüência de caracteres, esse argumento deve conter o número de bytes na seqüência de caracteres.
SQLSetStmtAttr StringLengthSe o atributo é um atributo definido pelo ODBC e ValuePtr aponta para uma seqüência de caracteres ou um buffer binário, este argumento deve ser o comprimento do * ValuePtr.Se o atributo é um atributo definido pelo ODBC e ValuePtr aponta para uma seqüência de caracteres ou um buffer binário, este argumento deve ser o comprimento do * ValuePtr. Para dados de seqüência de caracteres, esse argumento deve conter o número de bytes na seqüência de caracteres.
SQLSpecialColumns NameLength1-3Comprimento de * TableName.Comprimento de * TableName, em caracteres.
SQLStatistics NameLength1-3Comprimento de * CatalogName.Comprimento de * CatalogName, em caracteres.
SQLTablePrivileges NameLength1-3Comprimento de * CatalogName.Comprimento de * CatalogName, em caracteres.
SQLTables NameLength1-4Comprimento de * CatalogName.Comprimento de * CatalogName, em caracteres.

Usando o exemplo SQLDriverConnect da tabela acima, os argumentos InConnectionString e OutConnectionString são ambos definidos como SQLCHAR 1, para que StringLength1 e BufferLength devem indicar o número de caracteres em seqüências. Por outro lado, considere a função SQLGetInfo . Esta função tem uma entrada de InfoValuePtr e o comprimento dessa entrada é passado no BufferLength . Como InfoValuePtr pode conter seqüências de caracteres e outros tipos de dados, ele é um SQLPOINTER. Portanto, aplicar regras explicadas acima, BufferLength será uma contagem de bytes, em vez de caracteres.

Referências

O seguinte artigo da Base de dados de Conhecimento da Microsoft contém informações sobre o problema acima que já tenha sido corrigido da documentação SQLGetDiagRecW :
243526  (http://support.microsoft.com/kb/243526/EN-US/ ) DOC: ODBC espec incorretamente afirma SQLGetDiagRecW demora na Bufferlength como o número de bytes

A informação contida neste artigo aplica-se a:
  • Microsoft Open Database Connectivity 3.5
  • Microsoft Data Access Components 2.1
  • Microsoft Data Access Components 2.5
  • Microsoft Data Access Components 2.6
  • Microsoft Data Access Components 2.7
Palavras-chave: 
kbmt kbbug kbdocerr KB294169 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 294169  (http://support.microsoft.com/kb/294169/en-us/ )