Artigo: 294169 - Última revisão: segunda-feira, 12 de Maio de 2003 - Revisão: 2.1

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

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 | Reduzir tudo

Sumário

O Gestor do controlador de ODBC versão 3.5 ou posterior suporta versões ANSI e Unicode avançados do todas as funções que aceitam apontadores para cadeias de caracteres ou SQLPOINTER nos respectivos argumentos. As funções de Unicode são implementadas como funções com um sufixo "W", como, por exemplo, SQLExecDirectW e SQLGetInfoW .

Para muitas destas funções de Unicode, referência a ODBC Programmer fornece descrições incorrectas ou ambíguas para alguns argumentos de função. Especificamente, este problema está relacionado com os argumentos que são utilizados para especificar o comprimento de caracteres da cadeia valores de entrada e saídos.

Mais Informação

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 de uma cadeia de entrada ou saída. Para a versão ANSI destas funções, a contagem de bytes numa cadeia é igual a contagem de caracteres (porque caracteres ANSI ocupam apenas um byte cada), para os termos "bytes" e "caracteres" possam eficazmente ser utilizados alternadamente. No entanto, com cadeias Unicode, cada carácter ocupa dois bytes. Por conseguinte, é muito importante distinguir se entradas de comprimento para uma função de Unicode tem de especificar uma contagem de bytes ou caracteres.

Em alguns casos, a documentação utiliza a palavra "bytes" quando a palavra "caracteres" deve ter sido utilizada em vez disso. Noutros casos, a documentação não é necessariamente incorrecta mas Especifica um "período" de uma cadeia é necessário, sem explicitamente documentar se este valor deve ser uma contagem de bytes ou uma contagem de caracteres.

Independentemente do que a documentação indica para cada função ODBC, o parágrafo seguinte da secção Unicode de "Capítulo 17: Programming considerações" de referência para programadores de ODBC é a regra final para argumentos de comprimento em Unicode funções:
"Unicode funções que devolvem sempre ou cadeias ou argumentos de comprimento são passadas como número de caracteres. Para funções que devolvem informações de comprimento de dados do servidor, o tamanho de visualização e precisão são descritos em número de caracteres. Quando um comprimento (tamanho de transferência dos dados) pode fazer referência a dados de cadeia ou nonstring, o comprimento é descrito em comprimento do octeto. Por exemplo, SQLGetInfoW ainda terão o comprimento que contagem de bytes, mas SQLExecDirectW utilizará a contagem de caracteres."
Isto significa que, se o argumento em questão descreve o comprimento de outro argumento que é sempre uma cadeia (normalmente, representada como uma SQLCHAR), em seguida, o comprimento reflecte o número de caracteres da cadeia. Se o argumento de comprimento descreve outro argumento que pode ser uma cadeia ou outro tipo de dados (normalmente, representado como uma SQLPOINTER), o comprimento é em bytes.

A tabela seguinte lista todas as funções API do ODBC que tenham versões Unicode. Para cada função listada, a tabela realça os problemas conhecidos na documentação do ODBC e fornece uma descrição mais completa dos argumentos período em questão.

Reduzir esta tabelaExpandir esta tabela
FunçãoNome do argumentoDescrição da actualDescrição corrigida
SQLBrowseConnect StringLength1Comprimento de * InConnectionString.Comprimento de * InConnectionString em caracteres.
BufferLengthComprimento do * OutConnectionString da memória intermédia.Comprimento do * da memória intermédia OutConnectionString em caracteres.
StringLength2PtrO número total de bytes (excluindo o byte de terminação nula) disponíveis para devolver no * OutConnectionString.O número total de caracteres (excluindo o carácter nulo de terminação) disponíveis para devolver no * OutConnectionString.
SQLColAttribute BufferLengthSe FieldIdentifier é um campo definido pelo ODBC e CharacterAttributePtr aponta para uma cadeia de caracteres ou binária da memória intermédia, este argumento deverá ser o comprimento de * CharacterAttributePtr. Se FieldIdentifier for um campo definido de ODBC e * CharacterAttributePtr é um número inteiro, este campo é ignorado. Se o * CharacterAttributePtr é uma cadeia Unicode (ao chamar SQLColAttributeW), o argumento BufferLength tem de ser um número parEstá correcto. BufferLength refere-se ao número de bytes disponíveis para o valor CharacterAttributePtr.
StringLengthPtrPonteiro para uma memória intermédia no qual deseja devolver o número total de bytes (excluindo o byte de terminação nula para dados de caracteres) disponíveis para devolver no * CharacterAttributePtr.Está correcto.
SQLColAttributes Esta função, tal como foi preterida a SQLColAttribute (consultar acima).
SQLColumnPrivileges NameLength1-4Comprimento de * nomedocatálogo. (Tenha em atenção aqui que existem quatro diferentes argumentos que contêm valores de comprimento. Cada uma delas referente a um entrada diferente ou a memória intermédia de saída, tais como nomedocatálogo, 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 separadamente.)Comprimento de * nomedocatálogo em caracteres.
conjunto de resultados SQLColumns NameLength1-4Comprimento de * nomedocatálogo.Comprimento de * nomedocatálogo em caracteres.
SQLConnect NameLength1-3Comprimento de * nomeservidor.Comprimento de * Nome_do_servidor, em caracteres.
SQLDataSources BufferLength1Comprimento do * da memória intermédia Nome_do_servidor, em bytes.Comprimento do * da memória intermédia nomeservidor em caracteres.
NameLength1PtrPonteiro para uma memória intermédia no qual deseja devolver o número total de bytes (excluindo o byte de terminação nula). Ponteiro para uma memória intermédia no qual deseja devolver o número total de caracteres (excluindo o carácter de terminação nula).
BufferLength2Comprimento do * da memória intermédia de descrição.Comprimento do * da memória intermédia Descrição em caracteres.
NameLength2PtrPonteiro para uma memória intermédia no qual deseja devolver o número total de bytes (excluindo o byte de terminação nula) disponíveis para devolver no * descrição.Ponteiro para uma memória intermédia no qual deseja devolver o número total de caracteres (excluindo o carácter nulo de terminação) disponíveis para devolver no * descrição.
SQLDescribeCol BufferLengthComprimento do * da memória intermédia ColumnName em caracteres.Está correcto.
NameLengthPtrPonteiro para uma memória intermédia no qual deseja devolver o número total de bytes (excluindo o byte de terminação nula) disponíveis para devolver no * ColumnName.Ponteiro para uma memória intermédia no qual deseja devolver o número total de caracteres (excluindo o carácter nulo de terminação) disponíveis para devolver no * ColumnName.
SQLDriverConnect StringLength1Comprimento de * InConnectionString, em bytes.Comprimento de * InConnectionString em caracteres.
BufferLengthComprimento do * OutConnectionString da memória intermédia. Se o * OutConnectionString valor é uma cadeia Unicode (ao chamar SQLDriverConnectW), o argumento BufferLength tem de ser um número par.Comprimento do * da memória intermédia OutConnectionString em caracteres. (Tenha em atenção que isto significa que este argumento não tem de ser um número par.)
StringLength2PtrPonteiro para uma memória intermédia no qual deseja devolver o número total de caracteres (excluindo o carácter nulo de terminação) disponíveis para devolver no * OutConnectionString.Está correcto.
SQLDrivers BufferLength1Comprimento do * da memória intermédia DriverDescription em bytes.Comprimento do * da memória intermédia DriverDescription em caracteres.
DescriptionLengthPtrPonteiro para uma memória intermédia no qual deseja devolver o número total de bytes (excluindo o byte de terminação nula) disponíveis para devolver no * DriverDescription.Ponteiro para uma memória intermédia no qual deseja devolver o número total de caracteres (excluindo o carácter nulo de terminação) disponíveis para devolver no * DriverDescription.
BufferLength2Comprimento do * da memória intermédia DriverAttributes em bytes. Se o * DriverDescription valor é uma cadeia Unicode (ao chamar SQLDriversW), o argumento BufferLength tem de ser um número par.Comprimento do * da memória intermédia DriverAttributes em caracteres. (Tenha em atenção que isto significa que este argumento não tem de ser um número par.)
AttributesLengthPtrPonteiro para uma memória intermédia no qual deseja devolver o número total de bytes (excluindo o byte de terminação nula) disponíveis para devolver no * DriverAttributes.Ponteiro para uma memória intermédia no qual deseja devolver o número total de caracteres (excluindo o carácter nulo de terminação) disponíveis para devolver no * DriverAttributes.
SQLError Esta função foi preterida a 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 * ValuePtr é uma cadeia Unicode (ao chamar SQLGetConnectAttrW), o argumento BufferLength tem de ser um número par. Está correcto. BufferLength deve conter uma contagem de bytes.
StringLengthPtrUm apontador para uma memória intermédia no qual deseja devolver o número total de bytes (excluindo o carácter nulo de terminação) disponíveis para devolver no * ValuePtr.Está correcto.
SQLGetConnectOption Esta função foi preterida a SQLGetConnectAttr.
SQLGetCursorName BufferLengthComprimento de * CursorName, em bytes. Se o valor * CursorName é uma cadeia Unicode (ao chamar SQLGetCursorNameW), o argumento BufferLength tem de ser um número par.Comprimento de * CursorName em caracteres. (Tenha em atenção que isto significa que este argumento não tem de ser um número par.)
NameLengthPtrPonteiro para a memória no qual deseja devolver o número total de bytes (excluindo o carácter nulo de terminação) disponíveis para devolver no * CursorName.Ponteiro para a memória no qual deseja devolver o número total de caracteres (excluindo o carácter nulo de terminação) disponíveis para devolver no * CursorName.
SQLGetDescField BufferLengthSe o valor * ValuePtr é um tipo de dados Unicode (quando chamar SQLGetDescFieldW), o argumento BufferLength tem de ser um número par.Está correcto. BufferLength deve conter uma contagem de bytes.
StringLengthPtrPonteiro para a memória intermédia no qual deseja devolver o número total de bytes (excluindo o número de bytes necessários para o carácter nulo de terminação) disponíveis para devolver no * ValuePtr.Está correcto.
SQLGetDescRec BufferLengthComprimento do * memória intermédia do nome, em bytes.Comprimento do * memória intermédia do nome, em caracteres.
StringLengthPtrUm apontador para uma memória intermédia no qual deseja devolver o número de bytes de dados disponíveis para devolver o * memória intermédia do nome, excluindo o carácter nulo de terminação.Um apontador para uma memória intermédia no qual deseja devolver o número de caracteres disponíveis para regressar a * memória intermédia do nome, excluindo o carácter nulo de terminação.
SQLGetDiagField BufferLengthSe o valor * DiagInfoPtr é uma cadeia Unicode (ao chamar SQLGetDiagFieldW), o argumento BufferLength tem de ser um número par.Está correcto. BufferLength deve conter uma contagem de bytes.
StringLengthPtrPonteiro para uma memória intermédia no qual deseja devolver o número total de bytes (excluindo o número de bytes necessários para o carácter nulo de terminação) disponíveis para devolver no * DiagInfoPtr para dados de caracteres. Está correcto.
SQLGetDiagRec BufferLengthComprimento do * da memória intermédia MessageText em caracteres.Está correcto
TextLengthPtrPonteiro para uma memória intermédia no qual deseja devolver o número total de bytes (excluindo o número de bytes necessários para o carácter nulo de terminação) disponíveis para devolver no * MessageText. Ponteiro para uma memória intermédia no qual deseja devolver o número total de caracteres (excluindo o carácter nulo de terminação) disponíveis para devolver no * MessageText.
SQLGetInfo BufferLengthComprimento do * InfoValuePtr da memória intermédia. Se * InfoValuePtr é uma cadeia Unicode (ao chamar SQLGetInfoW), o argumento BufferLength tem de ser um número par.Está correcto. BufferLength deve conter uma contagem de bytes.
StringLengthPtrPonteiro para uma memória intermédia no qual deseja devolver o número total de bytes (excluindo o carácter nulo de terminação para dados de caracteres) disponíveis para devolver no * InfoValuePtr.Está correcto.
SQLGetStmtAttr BufferLengthSe atributo é um atributo definido de ODBC e ValuePtr aponta para uma cadeia de caracteres ou de uma memória intermédia binária, este argumento deve ser o comprimento de * ValuePtr. Se o valor devolvido na * ValuePtr é uma cadeia Unicode (ao chamar SQLGetStmtAttrW), o argumento BufferLength tem de ser um número parEstá correcto. BufferLength deve conter uma contagem de bytes.
StringLengthPtrUm apontador para uma memória intermédia no qual deseja devolver o número total de bytes (excluindo o carácter nulo de terminação) disponíveis para devolver no * ValuePtr.Está correcto.
SQLNativeSQL TextLength1Comprimento de * InStatementText cadeia de texto.Comprimento de * InStatementText cadeia de texto, em caracteres.
BufferLengthComprimento do * OutStatementText da memória intermédia. Se o valor devolvido na * InStatementText é uma cadeia Unicode (ao chamar SQLNativeSqlW), o argumento BufferLength tem de ser um número par.Comprimento do * da memória intermédia OutStatementText em caracteres. (Tenha em atenção que isto significa que este argumento não tem de ser um número par.)
TextLength2PtrPonteiro para uma memória intermédia no qual deseja devolver o número total de bytes (excluindo o byte de terminação nula) disponíveis para devolver no * OutStatementText.Ponteiro para uma memória intermédia no qual deseja devolver o número total de caracteres (excluindo o carácter nulo de terminação) disponíveis para devolver no * OutStatementText.
SQLPrepare TextLengthComprimento de * StatementText.Comprimento de * StatementText em caracteres.
SQLPrimaryKeys NameLength1-3Comprimento em bytes do * nomedocatálogo.Comprimento de * nomedocatálogo em caracteres.
SQLProcedureColumns NameLength1-4Comprimento de * nomedocatálogo.Comprimento de * nomedocatálogo em caracteres.
SQLProcedures NameLength1-3Comprimento em bytes do * nomedocatálogo.Comprimento de * nomedocatálogo em caracteres.
SQLSetConnectAttr StringLengthSe atributo é um atributo definido de ODBC e ValuePtr aponta para uma cadeia de caracteres ou de uma memória intermédia binária, este argumento deve ser o comprimento de * ValuePtr.Se atributo é um atributo definido de ODBC e ValuePtr aponta para uma cadeia de caracteres ou de uma memória intermédia binária, este argumento deve ser o comprimento de * ValuePtr. Dados de cadeia de caracteres, este argumento deve conter o número de bytes na cadeia.
SQLSetConnectOption Esta função foi preterida a SQLSetConnectAttr.
SQLSetCursorName NameLengthComprimento de * CursorName.Comprimento de * CursorName em caracteres.
SQLSetDescField BufferLengthSe FieldIdentifier é um campo definido pelo ODBC e ValuePtr aponta para uma cadeia de caracteres ou de uma memória intermédia binária, este argumento deverá ser o comprimento de * ValuePtr.Se FieldIdentifier é um campo definido pelo ODBC e ValuePtr aponta para uma cadeia de caracteres ou de uma memória intermédia binária, este argumento deverá ser o comprimento de * ValuePtr. Dados de cadeia de caracteres, este argumento deve conter o número de bytes na cadeia.
SQLSetStmtAttr StringLengthSe atributo é um atributo definido de ODBC e ValuePtr aponta para uma cadeia de caracteres ou de uma memória intermédia binária, este argumento deve ser o comprimento de * ValuePtr.Se atributo é um atributo definido de ODBC e ValuePtr aponta para uma cadeia de caracteres ou de uma memória intermédia binária, este argumento deve ser o comprimento de * ValuePtr. Dados de cadeia de caracteres, este argumento deve conter o número de bytes na cadeia.
SQLSpecialColumns NameLength1-3Comprimento de * TableName.Comprimento de * TableName em caracteres.
SQLStatistics NameLength1-3Comprimento de * nomedocatálogo.Comprimento de * nomedocatálogo em caracteres.
SQLTablePrivileges NameLength1-3Comprimento de * nomedocatálogo.Comprimento de * nomedocatálogo em caracteres.
SQLTables NameLength1-4Comprimento de * nomedocatálogo.Comprimento de * nomedocatálogo em caracteres.

Utilizando o exemplo SQLDriverConnect da tabela acima, os argumentos InConnectionString e OutConnectionString são ambas definidas como SQLCHAR * para que StringLength1 e BufferLength devem indicar o número de caracteres de cadeias. Em contrapartida, considere a função SQLGetInfo . Esta função tem uma entrada de InfoValuePtr e o comprimento desta entrada é passado em BufferLength . Uma vez que InfoValuePtr podem conter cadeias e outros tipos de dados, é um SQLPOINTER. Assim, aplicar as regras descritas acima, BufferLength será uma contagem de bytes, em vez de caracteres.

Referências

O artigo da base de dados de conhecimento da Microsoft seguinte contém informações sobre o problema acima que já tenha sido corrigido para a documentação SQLGetDiagRecW :
243526  (http://support.microsoft.com/kb/243526/EN-US/ ) DOC: Especificação ODBC incorrectamente indica 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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/ )