Função SQLColAttribute
Conformidade
Versão introduzida: Conformidade com as normas ODBC 3.0: ISO 92
Resumo
SQLColAttribute retorna informações do descritor para uma coluna em um conjunto de resultados. As informações do descritor são retornadas como uma cadeia de caracteres, um valor dependente do descritor ou um valor inteiro.
Observação
Para obter mais informações sobre o que o Gerenciador de Driver mapeia essa função para quando um ODBC 3.x aplicativo está funcionando com um ODBC 2.x driver, consulte Mapeando funções de substituição para compatibilidade com versões anteriores de aplicativos.
Sintaxe
SQLRETURN SQLColAttribute (
SQLHSTMT StatementHandle,
SQLUSMALLINT ColumnNumber,
SQLUSMALLINT FieldIdentifier,
SQLPOINTER CharacterAttributePtr,
SQLSMALLINT BufferLength,
SQLSMALLINT * StringLengthPtr,
SQLLEN * NumericAttributePtr);
Argumentos
StatementHandle
[Entrada] Identificador de instrução.
ColumnNumber
[Entrada] O número do registro no IRD do qual o valor do campo deve ser recuperado. Este argumento corresponde ao número da coluna dos dados de resultados, ordenados sequencialmente em ordem de coluna crescente, começando em 1. As colunas podem ser descritas em qualquer ordem.
A coluna 0 pode ser especificada neste argumento, mas todos os valores, exceto SQL_DESC_TYPE e SQL_DESC_OCTET_LENGTH, retornarão valores indefinidos.
FieldIdentifier
[Entrada] O identificador do descritor. Esse identificador define qual campo no IRD deve ser consultado (por exemplo, SQL_COLUMN_TABLE_NAME).
CharacterAttributePtr
[Realização] Ponteiro para um buffer no qual retornar o valor no campo
Se CharacterAttributePtr for NULL, StringLengthPtr ainda retornará o número total de bytes (excluindo o caractere de terminação nula para dados de caracteres) disponíveis para retornar no buffer apontado por CharacterAttributePtr.
BufferLength
[Entrada] Se FieldIdentifier for um campo definido por ODBC e CharacterAttributePtr apontar para uma cadeia de caracteres ou buffer binário, esse argumento deverá ser o comprimento de *CharacterAttributePtr. Se FieldIdentifier for um campo definido por ODBC e *CharacterAttributePtr for um inteiro, esse campo será ignorado. Se o *CharacterAttributePtr for uma cadeia de caracteres Unicode (ao chamar SQLColAttributeW), o argumento BufferLength deverá ser um número par. Se FieldIdentifier for um campo definido pelo driver, o aplicativo indicará a natureza do campo para o Gerenciador de Driver definindo o argumento BufferLength.
BufferLength pode ter os seguintes valores:
Se CharacterAttributePtr for um ponteiro para um ponteiro, BufferLength deverá ter o valor SQL_IS_POINTER.
Se CharacterAttributePtr for um ponteiro para uma cadeia de caracteres, o BufferLength será o comprimento do buffer.
Se CharacterAttributePtr for um ponteiro para um buffer binário, o aplicativo colocará o resultado da macro SQL_LEN_BINARY_ATTR(length) em BufferLength. Isso coloca um valor negativo em BufferLength.
Se CharacterAttributePtr for um ponteiro para um tipo de dados de comprimento fixo, BufferLength deverá ser um dos seguintes: SQL_IS_INTEGER, SQL_IS_UINTEGER, SQL_IS_SMALLINT ou SQL_IS_USMALLINT.
StringLengthPtr
[Realização] Ponteiro para um buffer no qual retornar o número total de bytes (excluindo o byte de terminação nula para dados de caracteres) disponíveis para retornar em *CharacterAttributePtr.
Para dados de caracteres, se o número de bytes disponíveis para retornar for maior ou igual a BufferLength, as informações do descritor em *CharacterAttributePtr serão truncadas para BufferLength menos o comprimento de um caractere de terminação nula e serão terminadas nulas pelo driver.
Para todos os outros tipos de dados, o valor de BufferLength é ignorado e o driver assume que o tamanho de *CharacterAttributePtr é de 32 bits.
NumericAttributePtr
[Realização] Ponteiro para um buffer inteiro no qual retornar o valor no campo
Devoluções
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR ou SQL_INVALID_HANDLE.
Diagnóstico
Quando
SQLSTATE | Erro | Descrição |
---|---|---|
01000 | Advertência geral | Mensagem informativa específica do motorista. (A função retorna SQL_SUCCESS_WITH_INFO.) |
01004 | Dados da cadeia de caracteres, truncados à direita | O buffer * CharacterAttributePtr não era grande o suficiente para retornar o valor da cadeia de caracteres inteira, portanto, o valor da cadeia de caracteres foi truncado. O comprimento do valor da cadeia de caracteres não truncada é retornado em *StringLengthPtr. (A função retorna SQL_SUCCESS_WITH_INFO.) |
07005 | Declaração preparada que não é um de especificação do cursor | A instrução associada ao StatementHandle não retornou um conjunto de resultados e FieldIdentifier não foi SQL_DESC_COUNT. Não havia colunas para descrever. |
07009 | Índice de descritor inválido | (DM) O valor especificado para ColumnNumber foi igual a 0 e o atributo SQL_ATTR_USE_BOOKMARKS statement foi SQL_UB_OFF. O valor especificado para o argumento ColumnNumber era maior do que o número de colunas no conjunto de resultados. |
HY000 | Erro geral | Ocorreu um erro para o qual não havia SQLSTATE específico e para o qual nenhum SQLSTATE específico de implementação foi definido. A mensagem de erro retornada pelo SQLGetDiagField da estrutura de dados de diagnóstico descreve o erro e sua causa. |
HY001 | Erro de alocação de memória | O driver não pôde alocar a memória necessária para suportar a execução ou conclusão da função. |
HY008 | Operação cancelada | O processamento assíncrono foi habilitado para o StatementHandle. A função foi chamada e, antes de concluir a execução, SQLCancel ou SQLCancelHandle foi chamada no StatementHandle. Em seguida, a função foi chamada novamente no StatementHandle. A função foi chamada e, antes de concluir a execução, |
HY010 | Erro de sequência de função | (DM) Uma função de execução assíncrona foi chamada para o identificador de conexão associado ao StatementHandle. Essa função assíncrona ainda estava em execução quando SQLColAttribute foi chamado. (DM) SQLExecute, SQLExecDirectou SQLMoreResults foi chamado para o StatementHandle e retornou SQL_PARAM_DATA_AVAILABLE. Esta função foi chamada antes que os dados fossem recuperados para todos os parâmetros transmitidos. (DM) A função foi chamada antes de chamar SQLPrepare, SQLExecDirectou uma função de catálogo para o StatementHandle. (DM) Uma função de execução assíncrona (não esta) foi chamada para o StatementHandle e ainda estava em execução quando essa função foi chamada. (DM) SQLExecute, SQLExecDirect, SQLBulkOperationsou SQLSetPos foi chamado para o StatementHandle e retornou SQL_NEED_DATA. Esta função foi chamada antes de os dados serem enviados para todos os parâmetros ou colunas de dados em execução. |
HY013 | Erro de gerenciamento de memória | A chamada de função não pôde ser processada porque os objetos de memória subjacentes não puderam ser acessados, possivelmente devido a condições de pouca memória. |
HY090 | String inválida ou comprimento do buffer | (DM) *CharacterAttributePtr é uma cadeia de caracteres e BufferLength foi menor que 0, mas não igual a SQL_NTS. |
HY091 | Identificador de campo descritor inválido | O valor especificado para o argumento FieldIdentifier não era um dos valores definidos e não era um valor definido pela implementação. |
HY117 | A conexão é suspensa devido ao estado desconhecido da transação. Apenas as funções de desconexão e somente leitura são permitidas. | (DM) Para obter mais informações sobre o estado suspenso, consulte função SQLEndTran. |
HYC00 | Motorista não capaz | O valor especificado para o argumento FieldIdentifier não foi suportado pelo driver. |
HYT01 | O tempo limite de conexão expirou | O período de tempo limite de conexão expirou antes que a fonte de dados respondesse à solicitação. O período de tempo limite da conexão é definido por meio SQLSetConnectAttr SQL_ATTR_CONNECTION_TIMEOUT. |
IM001 | Driver não suporta esta função | (DM) O driver associado ao StatementHandle não suporta a função. |
IM017 | A sondagem está desativada no modo de notificação assíncrona | Sempre que o modelo de notificação é usado, a sondagem é desativada. |
IM018 | SQLCompleteAsync não foi chamado para concluir a operação assíncrona anterior neste identificador. | Se a chamada de função anterior no identificador retornar SQL_STILL_EXECUTING e se o modo de notificação estiver habilitado, SQLCompleteAsync deverá ser chamado no identificador para fazer o pós-processamento e concluir a operação. |
Quando chamado após SQLPrepare e antes de SQLExecute , SQLColAttribute pode retornar qualquer SQLSTATE que possa ser retornado por SQLPrepare ou SQLExecute, dependendo de quando a fonte de dados avalia a instrução SQL associada ao StatementHandle.
Por motivos de desempenho, um aplicativo não deve chamar SQLColAttribute antes de executar uma instrução.
Observações
Para obter informações sobre como os aplicativos usam as informações retornadas por SQLColAttribute, consulte Metadados do conjunto de resultados.
SQLColAttribute retorna informações em *NumericAttributePtr ou em *CharacterAttributePtr. Informações inteiras são retornadas em *NumericAttributePtr como um valor SQLLEN; todos os outros formatos de informação são retornados em *CharacterAttributePtr. Quando as informações são retornadas em *NumericAttributePtr, o driver ignora CharacterAttributePtr , BufferLengthe StringLengthPtr. Quando as informações são retornadas em *CharacterAttributePtr, o driver ignora NumericAttributePtr.
SQLColAttribute retorna valores dos campos descritores do IRD. A função é chamada com um identificador de instrução em vez de um identificador de descritor. Os valores retornados por
Os campos descritores atualmente definidos, a versão do ODBC na qual eles foram introduzidos e os argumentos nos quais as informações são retornadas para eles são mostrados mais adiante nesta seção; Mais tipos de descritores podem ser definidos pelos drivers para aproveitar diferentes fontes de dados.
Um ODBC 3.x driver deve retornar um valor para cada um dos campos descritores. Se um campo descritor não se aplicar a um driver ou fonte de dados e salvo indicação em contrário, o driver retornará 0 em *StringLengthPtr ou uma cadeia de caracteres vazia em *CharacterAttributePtr.
Compatibilidade com versões anteriores
O ODBC 3.função xSQLColAttribute substitui o ODBC 2 preterido.função xSQLColAttributes. Ao mapear SQLColAttributes para SQLColAttribute (quando um ODBC 2.x aplicativo está trabalhando com um ODBC 3.x driver), ou mapeando SQLColAttribute para SQLColAttributes (quando um ODBC 3.x aplicativo está trabalhando com um ODBC 2.x driver), o Gerenciador de Driver passa o valor de FieldIdentifier através, Mapeia-o para um novo valor ou retorna um erro, da seguinte maneira:
Observação
O prefixo usado em FieldIdentifier valores no ODBC 3.x foi alterado em relação ao usado no ODBC 2.x. O novo prefixo é "SQL_DESC"; O prefixo antigo era "SQL_COLUMN".
Se o valor #define do ODBC 2.xFieldIdentifier é o mesmo que o valor #define do ODBC 3.xFieldIdentifier, o valor na chamada de função é apenas passado.
Os valores #define do ODBC 2.xFieldIdentifiers SQL_COLUMN_LENGTH, SQL_COLUMN_PRECISION e SQL_COLUMN_SCALE são diferentes dos valores #define do ODBC 3.xFieldIdentifiers SQL_DESC_PRECISION, SQL_DESC_SCALE e SQL_DESC_LENGTH. Um ODBC 2.x driver só precisa suportar o ODBC 2.x valores. Um ODBC 3.x driver deve suportar os valores "SQL_COLUMN" e "SQL_DESC" para esses três FieldIdentifiers. Esses valores são diferentes porque a precisão, a escala e o comprimento são definidos de forma diferente no ODBC 3.x do que no ODBC 2.x. Para obter mais informações, consulte Tamanho da coluna, Dígitos decimais, Comprimento do octeto de transferência e Tamanho de exibição.
Se o valor #define do ODBC 2.xFieldIdentifier é diferente do valor #define do ODBC 3.xFieldIdentifier, como ocorre com os valores COUNT, NAME e NULLABLE, o valor na chamada de função é mapeado para o valor correspondente. Por exemplo, SQL_COLUMN_COUNT é mapeado para SQL_DESC_COUNT e SQL_DESC_COUNT é mapeado para SQL_COLUMN_COUNT, dependendo da direção do mapeamento.
Se FieldIdentifier é um novo valor no ODBC 3.x, para o qual não havia valor correspondente no ODBC 2.x, ele não será mapeado quando um ODBC 3.x aplicativo o usa em uma chamada para SQLColAttribute em um ODBC 2.x driver e a chamada retornará SQLSTATE HY091 (identificador de campo descritor inválido).
A tabela a seguir lista os tipos de descritor retornados por SQLColAttribute. O tipo para valores de NumericAttributePtr é SQLLEN *.
FieldIdentifier | Informação retornou em |
Descrição |
---|---|---|
SQL_DESC_AUTO_UNIQUE_VALUE (ODBC 1.0) | NumericAttributePtr | SQL_TRUE se a coluna for uma coluna de incremento automático. SQL_FALSE se a coluna não for uma coluna de incremento automático ou não for numérica. Este campo é válido apenas para colunas de tipo de dados numéricos. Um aplicativo pode inserir valores em uma linha que contém uma coluna de autoincremento, mas normalmente não pode atualizar valores na coluna. Quando uma inserção é feita em uma coluna de incremento automático, um valor exclusivo é inserido na coluna no momento da inserção. O incremento não está definido, mas é específico da fonte de dados. Um aplicativo não deve assumir que uma coluna de incremento automático começa em qualquer ponto específico ou incrementa por qualquer valor específico. |
SQL_DESC_BASE_COLUMN_NAME (ODBC 3.0) | CharacterAttributePtr | O nome da coluna base para a coluna do conjunto de resultados. Se um nome de coluna base não existir (como no caso de colunas que são expressões), essa variável conterá uma cadeia de caracteres vazia. Essas informações são retornadas do campo de registro SQL_DESC_BASE_COLUMN_NAME do IRD, que é um campo somente leitura. |
SQL_DESC_BASE_TABLE_NAME (ODBC 3.0) | CharacterAttributePtr | O nome da tabela base que contém a coluna. Se o nome da tabela base não puder ser definido ou não for aplicável, essa variável conterá uma cadeia de caracteres vazia. Essas informações são retornadas do campo de registro SQL_DESC_BASE_TABLE_NAME do IRD, que é um campo somente leitura. |
SQL_DESC_CASE_SENSITIVE (ODBC 1.0) | NumericAttributePtr | SQL_TRUE se a coluna for tratada como sensível a maiúsculas e minúsculas para agrupamentos e comparações. SQL_FALSE se a coluna não diferenciar maiúsculas de minúsculas para agrupamentos e comparações ou não tiver caracteres. |
SQL_DESC_CATALOG_NAME (ODBC 2.0) | CharacterAttributePtr | O catálogo da tabela que contém a coluna. O valor retornado é definido pela implementação se a coluna for uma expressão ou se a coluna fizer parte de um modo de exibição. Se a fonte de dados não oferecer suporte a catálogos ou o nome do catálogo não puder ser determinado, uma cadeia de caracteres vazia será retornada. Este campo de registo VARCHAR não está limitado a 128 caracteres. |
SQL_DESC_CONCISE_TYPE (ODBC 1.0) | NumericAttributePtr | O tipo de dados conciso. Para os tipos de dados datetime e interval, este campo retorna o tipo de dados conciso; por exemplo, SQL_TYPE_TIME ou SQL_INTERVAL_YEAR. (Para obter mais informações, consulte de identificadores e descritores de tipo de dados no Apêndice D: Tipos de dados.) Esta informação é devolvida a partir do campo de registo SQL_DESC_CONCISE_TYPE do IRD. |
SQL_DESC_COUNT (ODBC 1.0) | NumericAttributePtr | O número de colunas disponíveis no conjunto de resultados. Isso retornará 0 se não houver colunas no conjunto de resultados. O valor no argumento Essas informações são retornadas do campo de cabeçalho SQL_DESC_COUNT do IRD. |
SQL_DESC_DISPLAY_SIZE (ODBC 1.0) | NumericAttributePtr | Número máximo de caracteres necessários para exibir dados da coluna. Para obter mais informações sobre o tamanho da tela, consulte Tamanho da coluna, Dígitos decimais, Comprimento do octeto de transferência e Tamanho da tela no Apêndice D: Tipos de dados. |
SQL_DESC_FIXED_PREC_SCALE (ODBC 1.0) | NumericAttributePtr | SQL_TRUE se a coluna tiver uma precisão fixa e uma escala diferente de zero que sejam específicas da fonte de dados. SQL_FALSE se a coluna não tiver uma precisão fixa e uma escala diferente de zero que sejam específicas da fonte de dados. |
SQL_DESC_LABEL (ODBC 2.0) | CharacterAttributePtr | O rótulo ou título da coluna. Por exemplo, uma coluna chamada EmpName pode ser rotulada como Nome do funcionário ou pode ser rotulada com um alias. Se uma coluna não tiver um rótulo, o nome da coluna será retornado. Se a coluna não estiver rotulada e sem nome, uma cadeia de caracteres vazia será retornada. |
SQL_DESC_LENGTH (ODBC 3.0) | NumericAttributePtr | Um valor numérico que é o comprimento máximo ou real de caracteres de uma cadeia de caracteres ou tipo de dados binários. É o comprimento máximo de caracteres para um tipo de dados de comprimento fixo ou o comprimento real de caracteres para um tipo de dados de comprimento variável. Seu valor sempre exclui o byte de terminação nula que termina a cadeia de caracteres. Essas informações são retornadas do campo de registro SQL_DESC_LENGTH do IRD. Para obter mais informações sobre comprimento, consulte Tamanho da coluna, dígitos decimais, Comprimento do octeto de transferência e Tamanho da exibição no Apêndice D: Tipos de dados. |
SQL_DESC_LITERAL_PREFIX (ODBC 3.0) | CharacterAttributePtr | Este campo de registo VARCHAR(128) contém o caractere ou caracteres que o driver reconhece como um prefixo para um literal desse tipo de dados. Este campo contém uma cadeia de caracteres vazia para um tipo de dados para o qual um prefixo literal não é aplicável. Para obter mais informações, consulte Prefixos e sufixos literais. |
SQL_DESC_LITERAL_SUFFIX (ODBC 3.0) | CharacterAttributePtr | Este campo de registro VARCHAR(128) contém o caractere ou caracteres que o driver reconhece como um sufixo para um literal desse tipo de dados. Este campo contém uma cadeia de caracteres vazia para um tipo de dados para o qual um sufixo literal não é aplicável. Para obter mais informações, consulte Prefixos e sufixos literais. |
SQL_DESC_LOCAL_TYPE_NAME (ODBC 3.0) | CharacterAttributePtr | Este campo de registo VARCHAR(128) contém qualquer nome localizado (idioma nativo) para o tipo de dados que possa ser diferente do nome normal do tipo de dados. Se não houver um nome localizado, uma cadeia de caracteres vazia será retornada. Este campo é apenas para fins de exibição. O conjunto de caracteres da cadeia de caracteres depende da localidade e normalmente é o conjunto de caracteres padrão do servidor. |
SQL_DESC_NAME (ODBC 3.0) | CharacterAttributePtr | O alias da coluna, se aplicável. Se o alias da coluna não se aplicar, o nome da coluna será retornado. Em ambos os casos, SQL_DESC_UNNAMED é definido como SQL_NAMED. Se não houver um nome de coluna ou um alias de coluna, uma cadeia de caracteres vazia será retornada e SQL_DESC_UNNAMED será definida como SQL_UNNAMED. Essas informações são retornadas do campo de registro SQL_DESC_NAME do IRD. |
SQL_DESC_NULLABLE (ODBC 3.0) | NumericAttributePtr | SQL_ NULLABLE se a coluna puder ter valores NULL; SQL_NO_NULLS se a coluna não tiver valores NULL; ou SQL_NULLABLE_UNKNOWN se não se sabe se a coluna aceita valores NULL. Essas informações são retornadas do campo de registro de SQL_DESC_NULLABLE do IRD. |
SQL_DESC_NUM_PREC_RADIX (ODBC 3.0) | NumericAttributePtr | Se o tipo de dados no campo SQL_DESC_TYPE for um tipo de dados numérico aproximado, esse campo SQLINTEGER conterá um valor 2 porque o campo SQL_DESC_PRECISION contém o número de bits. Se o tipo de dados no campo SQL_DESC_TYPE for um tipo de dados numérico exato, esse campo conterá um valor de 10 porque o campo SQL_DESC_PRECISION contém o número de dígitos decimais. Este campo é definido como 0 para todos os tipos de dados não numéricos. |
SQL_DESC_OCTET_LENGTH (ODBC 3.0) | NumericAttributePtr | O comprimento, em bytes, de uma cadeia de caracteres ou tipo de dados binários. Para caracteres de comprimento fixo ou tipos binários, este é o comprimento real em bytes. Para caracteres de comprimento variável ou tipos binários, este é o comprimento máximo em bytes. Esse valor não inclui o terminador nulo. Essas informações são retornadas do campo de registro SQL_DESC_OCTET_LENGTH do IRD. Para obter mais informações sobre comprimento, consulte Tamanho da coluna, dígitos decimais, Comprimento do octeto de transferência e Tamanho da exibição no Apêndice D: Tipos de dados. |
SQL_DESC_PRECISION (ODBC 3.0) | NumericAttributePtr | Um valor numérico que, para um tipo de dados numéricos, denota a precisão aplicável. Para os tipos de dados SQL_TYPE_TIME, SQL_TYPE_TIMESTAMP e todos os tipos de dados de intervalo que representam um intervalo de tempo, seu valor é a precisão aplicável do componente de segundos fracionários. Essas informações são retornadas do campo de registro SQL_DESC_PRECISION do IRD. |
SQL_DESC_SCALE (ODBC 3.0) | NumericAttributePtr | Um valor numérico que é a escala aplicável para um tipo de dados numéricos. Para os tipos de dados DECIMAL e NUMÉRICO, esta é a escala definida. É indefinido para todos os outros tipos de dados. Essas informações são retornadas do campo de registro SCALE do IRD. |
SQL_DESC_SCHEMA_NAME (ODBC 2.0) | CharacterAttributePtr | O esquema da tabela que contém a coluna. O valor retornado é definido pela implementação se a coluna for uma expressão ou se a coluna fizer parte de um modo de exibição. Se a fonte de dados não oferecer suporte a esquemas ou o nome do esquema não puder ser determinado, uma cadeia de caracteres vazia será retornada. Este campo de registo VARCHAR não está limitado a 128 caracteres. |
SQL_DESC_SEARCHABLE (ODBC 1.0) | NumericAttributePtr | SQL_PRED_NONE se a coluna não puder ser utilizada numa cláusula WHERE. (Este é o mesmo que o valor SQL_UNSEARCHABLE no ODBC 2.x.) SQL_PRED_CHAR se a coluna pode ser usada em uma cláusula WHERE, mas apenas com o predicado LIKE. (Este é o mesmo que o valor SQL_LIKE_ONLY no ODBC 2.x.) SQL_PRED_BASIC se a coluna pode ser usada em uma cláusula WHERE com todos os operadores de comparação, exceto LIKE. (Este é o mesmo que o valor de SQL_EXCEPT_LIKE no ODBC 2.x.) SQL_PRED_SEARCHABLE se a coluna pode ser usada em uma cláusula WHERE com qualquer operador de comparação. Colunas do tipo SQL_LONGVARCHAR e SQL_LONGVARBINARY geralmente retornam SQL_PRED_CHAR. |
SQL_DESC_TABLE_NAME (ODBC 2.0) | CharacterAttributePtr | O nome da tabela que contém a coluna. O valor retornado é definido pela implementação se a coluna for uma expressão ou se a coluna fizer parte de um modo de exibição. Se o nome da tabela não puder ser determinado, uma cadeia de caracteres vazia será retornada. |
SQL_DESC_TYPE (ODBC 3.0) | NumericAttributePtr | Um valor numérico que especifica o tipo de dados SQL. Quando ColumnNumber é igual a 0, SQL_BINARY é retornado para marcadores de comprimento variável e SQL_INTEGER é retornado para marcadores de comprimento fixo. Para os tipos de dados datetime e interval, este campo retorna o tipo de dados detalhado: SQL_DATETIME ou SQL_INTERVAL. (Para obter mais informações, consulte Identificadores e Descritores de Tipo de Dados no Apêndice D: Tipos de dados. Essas informações são retornadas do campo de registro SQL_DESC_TYPE do IRD. Nota: Para trabalhar contra ODBC 2.x drivers, use SQL_DESC_CONCISE_TYPE em vez disso. |
SQL_DESC_TYPE_NAME (ODBC 1.0) | CharacterAttributePtr | Nome do tipo de dados dependente da fonte de dados; por exemplo, "CHAR", "VARCHAR", "MONEY", "LONG VARBINARY" ou "CHAR ( ) FOR BIT DATA". Se o tipo for desconhecido, uma cadeia de caracteres vazia será retornada. |
SQL_DESC_UNNAMED (ODBC 3.0) | NumericAttributePtr | SQL_NAMED ou SQL_UNNAMED. Se o campo SQL_DESC_NAME do IRD contiver um alias de coluna ou um nome de coluna, SQL_NAMED será retornado. Se não houver um nome de coluna ou alias de coluna, SQL_UNNAMED será retornado. Essas informações são retornadas do campo de registro de SQL_DESC_UNNAMED do IRD. |
SQL_DESC_UNSIGNED (ODBC 1.0) | NumericAttributePtr | SQL_TRUE se a coluna não estiver assinada (ou não for numérica). SQL_FALSE se a coluna estiver assinada. |
SQL_DESC_UPDATABLE (ODBC 1.0) | NumericAttributePtr | A coluna é descrita pelos valores das constantes definidas: SQL_ATTR_READONLY SQL_ATTR_WRITE SQL_ATTR_READWRITE_UNKNOWN SQL_DESC_UPDATABLE descreve a updatability da coluna no conjunto de resultados, não a coluna na tabela base. A capacidade de atualização da coluna base na qual a coluna do conjunto de resultados se baseia pode ser diferente do valor neste campo. Se uma coluna é atualizável pode ser baseada no tipo de dados, nos privilégios do usuário e na própria definição do conjunto de resultados. Se não estiver claro se uma coluna é atualizável, SQL_ATTR_READWRITE_UNKNOWN deve ser retornada. |
SQLColAttribute é uma alternativa extensível ao SQLDescribeCol. SQLDescribeCol retorna um conjunto fixo de informações de descritor com base em ANSI-89 SQL. SQLColAttribute permite o acesso ao conjunto mais extenso de informações do descritor disponíveis nas extensões de fornecedor ANSI, SQL-92 e DBMS.
Funções relacionadas
Para obter informações sobre | Ver |
---|---|
Vinculando um buffer a uma coluna em um conjunto de resultados | da função SQLBindCol |
Cancelamento do processamento de instruções | da função SQLCancel |
Retornando informações sobre uma coluna em um conjunto de resultados | Função SQLDescribeCol |
Buscar um bloco de dados ou rolar por um conjunto de resultados | Função SQLFetchScroll |
Obtenção de várias linhas de dados | Função SQLFetch |
Exemplo
O código de exemplo a seguir não libera identificadores e conexões. Consulte de função SQLFreeHandle , de programa ODBC de exemplo e de função SQLFreeStmt para obter exemplos de código para identificadores e instruções gratuitos.
// SQLColAttibute.cpp
// compile with: user32.lib odbc32.lib
#define UNICODE
#include <windows.h>
#include <sqlext.h>
#include <strsafe.h>
struct DataBinding {
SQLSMALLINT TargetType;
SQLPOINTER TargetValuePtr;
SQLINTEGER BufferLength;
SQLLEN StrLen_or_Ind;
};
void printStatementResult(SQLHSTMT hstmt) {
int bufferSize = 1024, i;
SQLRETURN retCode;
SQLSMALLINT numColumn = 0, bufferLenUsed;
retCode = SQLNumResultCols(hstmt, &numColumn);
SQLPOINTER* columnLabels = (SQLPOINTER *)malloc( numColumn * sizeof(SQLPOINTER*) );
struct DataBinding* columnData = (struct DataBinding*)malloc( numColumn * sizeof(struct DataBinding) );
printf( "Columns from that table:\n" );
for ( i = 0 ; i < numColumn ; i++ ) {
columnLabels[i] = (SQLPOINTER)malloc( bufferSize*sizeof(char) );
retCode = SQLColAttribute(hstmt, (SQLUSMALLINT)i + 1, SQL_DESC_LABEL, columnLabels[i], (SQLSMALLINT)bufferSize, &bufferLenUsed, NULL);
wprintf( L"Column %d: %s\n", i, (wchar_t*)columnLabels[i] );
}
// allocate memory for the binding
for ( i = 0 ; i < numColumn ; i++ ) {
columnData[i].TargetType = SQL_C_CHAR;
columnData[i].BufferLength = (bufferSize+1);
columnData[i].TargetValuePtr = malloc( sizeof(unsigned char)*columnData[i].BufferLength );
}
// setup the binding
for ( i = 0 ; i < numColumn ; i++ ) {
retCode = SQLBindCol(hstmt, (SQLUSMALLINT)i + 1, columnData[i].TargetType,
columnData[i].TargetValuePtr, columnData[i].BufferLength, &(columnData[i].StrLen_or_Ind));
}
printf( "Data from that table:\n" );
// fetch the data and print out the data
for ( retCode = SQLFetch(hstmt) ; retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO ; retCode = SQLFetch(hstmt) ) {
int j;
for ( j = 0 ; j < numColumn ; j++ )
wprintf( L"%s: %hs\n", columnLabels[j], columnData[j].TargetValuePtr );
printf( "\n" );
}
printf( "\n" );
}
int main() {
int bufferSize = 1024, i, count = 1, numCols = 5;
wchar_t firstTableName[1024], * dbName = (wchar_t *)malloc( sizeof(wchar_t)*bufferSize ), * userName = (wchar_t *)malloc( sizeof(wchar_t)*bufferSize );
HWND desktopHandle = GetDesktopWindow(); // desktop's window handle
SQLWCHAR connStrbuffer[1024];
SQLSMALLINT connStrBufferLen, bufferLen;
SQLRETURN retCode;
SQLHENV henv = NULL; // Environment
SQLHDBC hdbc = NULL; // Connection handle
SQLHSTMT hstmt = NULL; // Statement handle
struct DataBinding* catalogResult = (struct DataBinding*) malloc( numCols * sizeof(struct DataBinding) );
SQLWCHAR* selectAllQuery = (SQLWCHAR *)malloc( sizeof(SQLWCHAR) * bufferSize );
// connect to database
retCode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
retCode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLCHAR *)(void*)SQL_OV_ODBC3, -1);
retCode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
retCode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)10, 0);
retCode = SQLDriverConnect(hdbc, desktopHandle, L"Driver={SQL Server}", SQL_NTS, connStrbuffer, 1025, &connStrBufferLen, SQL_DRIVER_PROMPT);
retCode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
// display the database information
retCode = SQLGetInfo(hdbc, SQL_DATABASE_NAME, dbName, (SQLSMALLINT)bufferSize, (SQLSMALLINT *)&bufferLen);
retCode = SQLGetInfo(hdbc, SQL_USER_NAME, userName, (SQLSMALLINT)bufferSize, &bufferLen);
for ( i = 0 ; i < numCols ; i++ ) {
catalogResult[i].TargetType = SQL_C_CHAR;
catalogResult[i].BufferLength = (bufferSize + 1);
catalogResult[i].TargetValuePtr = malloc( sizeof(unsigned char)*catalogResult[i].BufferLength );
}
// Set up the binding. This can be used even if the statement is closed by closeStatementHandle
for ( i = 0 ; i < numCols ; i++ )
retCode = SQLBindCol(hstmt, (SQLUSMALLINT)i + 1, catalogResult[i].TargetType, catalogResult[i].TargetValuePtr, catalogResult[i].BufferLength, &(catalogResult[i].StrLen_or_Ind));
retCode = SQLTables( hstmt, (SQLWCHAR*)SQL_ALL_CATALOGS, SQL_NTS, L"", SQL_NTS, L"", SQL_NTS, L"", SQL_NTS );
retCode = SQLFreeStmt(hstmt, SQL_CLOSE);
retCode = SQLTables( hstmt, dbName, SQL_NTS, userName, SQL_NTS, L"%", SQL_NTS, L"TABLE", SQL_NTS );
for ( retCode = SQLFetch(hstmt) ; retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO ; retCode = SQLFetch(hstmt), ++count )
if ( count == 1 )
StringCchPrintfW( firstTableName, 1024, L"%hs", catalogResult[2].TargetValuePtr );
retCode = SQLFreeStmt(hstmt, SQL_CLOSE);
wprintf( L"Select all data from the first table (%s)\n", firstTableName );
StringCchPrintfW( selectAllQuery, bufferSize, L"SELECT * FROM %s", firstTableName );
retCode = SQLExecDirect(hstmt, selectAllQuery, SQL_NTS);
printStatementResult(hstmt);
}
Ver também
de referência da API ODBC
Arquivos de cabeçalho ODBC
de programa ODBC de exemplo