Função SQLColumns

Conformidade
Versão Introduzida: Conformidade com os Padrões ODBC 1.0: Open Group

Summary
SQLColumns retorna a lista de nomes de colunas em tabelas específicas. O driver retorna essas informações como um conjunto de resultados no StatementHandle especificado.

Sintaxe

  
SQLRETURN SQLColumns(  
     SQLHSTMT       StatementHandle,  
     SQLCHAR *      CatalogName,  
     SQLSMALLINT    NameLength1,  
     SQLCHAR *      SchemaName,  
     SQLSMALLINT    NameLength2,  
     SQLCHAR *      TableName,  
     SQLSMALLINT    NameLength3,  
     SQLCHAR *      ColumnName,  
     SQLSMALLINT    NameLength4);  

Argumentos

Identificador de declaração
[Entrada] Identificador de instrução.

Catalogname
[Entrada] Nome do catálogo. Se um driver suporta catálogos para algumas tabelas, mas não para outras, como quando o driver recupera dados de diferentes DBMSs, uma string vazia ("") indica aquelas tabelas que não possuem catálogos. CatalogName não pode conter um padrão de busca em string.

Note

Se o atributo da instrução SQL_ATTR_METADATA_ID for definido como SQL_TRUE, CatalogName é tratado como um identificador e seu caso não é significativo. Se for SQL_FALSE, Nome do Catálogo é um argumento comum; É tratado literalmente, e seu caso é significativo. Para obter mais informações, confira Argumentos em funções de catálogo.

NameLength1
[Entrada] Comprimento em caracteres de *NomeDeCatálogo.

Nome do esquema
[Entrada] Padrão de busca em string para nomes de esquemas. Se um driver suporta esquemas para algumas tabelas, mas não para outras, como quando o driver recupera dados de diferentes DBMSs, uma string vazia ("") indica aquelas tabelas que não possuem esquemas.

Note

Se o atributo da instrução SQL_ATTR_METADATA_ID for definido como SQL_TRUE, SchemaName é tratado como um identificador e seu caso não é significativo. Se for SQL_FALSE, NomeEsquema é um argumento de valor de padrão; É tratado literalmente, e seu caso é significativo.

NameLength2
[Entrada] Comprimento em caracteres de *NomeEsquema.

TableName
[Entrada] Padrão de busca de cadeias para nomes de tabelas.

Note

Se o atributo da instrução SQL_ATTR_METADATA_ID for definido como SQL_TRUE, TableName é tratado como um identificador e seu caso não é significativo. Se for SQL_FALSE, TableName é um argumento de valor de padrão; É tratado literalmente, e seu caso é significativo.

NameLength3
[Entrada] Comprimento em caracteres de *NomeTaula.

ColumnName
[Entrada] Padrão de busca de string para nomes de colunas.

Note

Se o atributo da instrução SQL_ATTR_METADATA_ID for definido como SQL_TRUE, NomeColuna é tratado como identificador e seu caso não é significativo. Se for SQL_FALSE, Nome da Coluna é um argumento de valor de padrão; É tratado literalmente, e seu caso é significativo.

NomeComprimento4
[Entrada] Comprimento em caracteres de *NomeColuna.

Returns

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR ou SQL_INVALID_HANDLE.

Diagnostics

Quando SQLColumns retorna SQL_ERROR ou SQL_SUCCESS_WITH_INFO, um valor SQLSTATE associado pode ser obtido chamando SQLGetDiagRec com um HandleType de SQL_HANDLE_STMT e um Handle de StatementHandle. A tabela a seguir lista os valores SQLSTATE normalmente retornados pelo SQLColumns e explica cada um no contexto dessa função; a notação "(DM)" precede as descrições dos SQLSTATEs retornadas pelo Gerenciador de Drivers. O código de retorno associado a cada valor SQLSTATE é SQL_ERROR, a menos que indicado de outra forma.

SQLSTATE Erro DESCRIÇÃO
01000 Aviso geral Mensagem informativa específica do driver. (A função retorna SQL_SUCCESS_WITH_INFO.)
08S01 Falha no link de comunicação O link de comunicação entre o driver e a fonte de dados à qual o driver estava conectado falhou antes que a função concluísse o processamento.
24000 Estado de cursor inválido Um cursor estava aberto no StatementHandle, e SQLFetch ou SQLFetchScroll haviam sido chamados. Esse erro será retornado pelo Gerenciador de Driver se SQLFetch ou SQLFetchScroll não tiver retornado SQL_NO_DATA e será retornado pelo driver se SQLFetch ou SQLFetchScroll tiver retornado SQL_NO_DATA.

Um cursor estava aberto no HandleStatement , mas SQLFetch ou SQLFetchScroll não haviam sido chamados.
40001 Falha de serialização A transação foi revertida devido a um deadlock de recursos com outra transação.
40003 Conclusão da instrução desconhecida A conexão associada falhou durante a execução dessa função e o estado da transação não pode ser determinado.
HY000 Erro geral Ocorreu um erro para o qual não havia SQLSTATE específico e para o qual nenhum SQLSTATE específico da implementação foi definido. A mensagem de erro retornada por SQLGetDiagRec no buffer *MessageText 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 dar suporte à 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 chamado no StatementHandle. Em seguida, a função foi chamada novamente no StatementHandle.

A função foi chamada e, antes de concluir a execução, SQLCancel ou SQLCancelHandle foi chamado no StatementHandle de um thread diferente em um aplicativo multithread.
HY009 Uso inválido de ponteiro nulo O atributo da instrução SQL_ATTR_METADATA_ID foi definido como SQL_TRUE, o argumento CatalogName era um ponteiro nulo, e o SQL_CATALOG_NAME InfoType retorna que nomes de catálogo são suportados.

(DM) O atributo da SQL_ATTR_METADATA_ID instrução era definido como SQL_TRUE, e o argumento NomeEsquema, NomeTabela ou Nome da Coluna era um ponteiro nulo.
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 a função SQLColumns foi chamada.

(DM) SQLExecute, SQLExecDirect ou SQLMoreResults foi chamado para o StatementHandle e retornado SQL_PARAM_DATA_AVAILABLE. Essa função foi chamada antes que os dados fossem recuperados para todos os parâmetros transmitidos.

(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, SQLBulkOperations ou SQLSetPos foi chamado para o StatementHandle e retornado SQL_NEED_DATA. Essa função foi chamada antes que os dados fossem 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 memória baixa.
HY090 Cadeia de caracteres ou comprimento de buffer inválido (DM) O valor de um dos argumentos do comprimento do nome era menor que 0, mas não igual a SQL_NTS.
O valor de um dos argumentos de comprimento do nome excedia o valor máximo de comprimento para o catálogo ou nome correspondente. O comprimento máximo de cada catálogo ou nome pode ser obtido chamando SQLGetInfo com os valores InfoType . (Veja "Comentários".)
HY117 A conexão está suspensa devido ao estado desconhecido da transação. Somente 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 Recurso opcional não implementado Um nome de catálogo foi especificado, e o driver ou fonte de dados não suporta catálogos.

Um nome de esquema foi especificado, e o driver ou fonte de dados não suporta esquemas.

Um padrão de busca em cadeia foi especificado para o nome do esquema, nome da tabela ou nome da coluna, e a fonte de dados não suporta padrões de busca para um ou mais desses argumentos.

A combinação das configurações atuais dos atributos de instrução SQL_ATTR_CONCURRENCY e SQL_ATTR_CURSOR_TYPE não era compatível com o driver ou a fonte de dados.

O atributo de instrução SQL_ATTR_USE_BOOKMARKS foi definido como SQL_UB_VARIABLE e o atributo de instrução SQL_ATTR_CURSOR_TYPE foi definido como um tipo de cursor para o qual o driver não dá suporte a indicadores.
HYT00 Tempo limite expirado O período de tempo limite da consulta expirou antes que a fonte de dados retornasse o conjunto de resultados. O período de tempo limite é definido por meio de SQLSetStmtAttr, SQL_ATTR_QUERY_TIMEOUT.
HYT01 O tempo limite da conexão expirou O período de tempo limite da conexão expirou antes que a fonte de dados respondesse à solicitação. O período de tempo limite da conexão é definido por meio de SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT.
IM001 O driver não suporta esta função (DM) O driver associado ao StatementHandle não dá suporte à função.
IM017 A sondagem está desabilitada no modo de notificação assíncrona Sempre que o modelo de notificação é usado, a sondagem é desabilitada.
IM018 SQLCompleteAsync não foi chamado para concluir a operação assíncrona anterior nesse 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.

Comments

Essa função normalmente é usada antes da execução da instrução para recuperar informações sobre colunas para uma ou mais tabelas do catálogo da fonte de dados. O SQLColumns pode ser usado para recuperar dados de todos os tipos de itens retornados pelo SQLTables. Além das tabelas base, isso pode incluir (mas não se limita a) views, sinônimos, tabelas de sistema e assim por diante. Em contraste, as funções SQLColAttribute e SQLDescribeCol descrevem as colunas em um conjunto de resultados e a função SQLNumResultCols retorna o número de colunas em um conjunto de resultados. Para obter mais informações, consulte Usos de dados de catálogo.

Note

Para obter mais informações sobre o uso geral, argumentos e dados retornados de funções de catálogo ODBC, consulte Funções de Catálogo.

SQLColumns retorna os resultados como um conjunto padrão de resultados, ordenado por TABLE_CAT, TABLE_SCHEM, TABLE_NAME e ORDINAL_POSITION.

Note

Quando uma aplicação funciona com um ODBC 2. driver x , nenhuma coluna ORDINAL_POSITION é retornada no conjunto de resultados. Como resultado, ao trabalhar com ODBC 2. x , a ordem das colunas na lista de colunas retornada pelo SQLColumns não é necessariamente a mesma que a ordem das colunas retornadas quando o aplicativo executa uma instrução SELECT em todas as colunas dessa tabela.

Note

O SQLColumns pode não retornar todas as colunas. Por exemplo, um driver pode não retornar informações sobre pseudo-colunas, como Oracle ROWID. Aplicações podem usar qualquer coluna válida, seja ela retornada por SQLColumns.

Algumas colunas que podem ser retornadas por SQLStatistics não são retornadas por SQLColumns. Por exemplo, SQLColumns não retorna as colunas em um índice criado sobre uma expressão ou filtro, como SALÁRIO + BENEFÍCIOS ou DEPT = 0012.

Os comprimentos das colunas VARCHAR não são mostrados na tabela; Os comprimentos reais dependem da fonte de dados. Para determinar os comprimentos reais das colunas TABLE_CAT, TABLE_SCHEM, TABLE_NAME e COLUMN_NAME, uma aplicação pode chamar SQLGetInfo com as opções SQL_MAX_CATALOG_NAME_LEN, SQL_MAX_SCHEMA_NAME_LEN, SQL_MAX_TABLE_NAME_LEN e SQL_MAX_COLUMN_NAME_LEN.

As colunas a seguir foram renomeadas para ODBC 3.x. As mudanças no nome das colunas não afetam a compatibilidade retroativa porque as aplicações são vinculadas por número de coluna.

Coluna ODBC 2.0 ODBC 3.coluna x
QUALIFICADOR_DE_TABELA TABLE_CAT
PROPRIETÁRIO_DA_TABELA TABLE_SCHEM
PRECISION TAMANHO_DA_COLUNA
COMPRIMENTO BUFFER_LENGTH
ESCALA DÍGITOS_DECIMAIS
RADIX NUM_PREC_RADIX

As colunas a seguir foram adicionadas ao conjunto de resultados retornado pelo SQLColumns para o ODBC 3. x:

CHAR_OCTET_LENGTH
COLUMN_DEF

IS_NULLABLE
ORDINAL_POSITION

SQL_DATA_TYPE
SQL_DATETIME_SUB

A tabela a seguir lista as colunas no conjunto de resultados. Colunas adicionais além da coluna 18 (IS_NULLABLE) podem ser definidas pelo driver. Um aplicativo deve obter acesso a colunas específicas do driver contando o final do conjunto de resultados em vez de especificar uma posição ordinal explícita. Para obter mais informações, consulte Dados Retornados por Funções de Catálogo.

Nome da Coluna Coluna

number
Tipo de dados Comments
TABLE_CAT (ODBC 1.0) 1 Varchar Nome do catálogo; NULL se não aplicável à fonte de dados. Se um driver suporta catálogos para algumas tabelas, mas não para outras, como quando o driver recupera dados de diferentes DBMSs, ele retorna uma string vazia ("") para aquelas tabelas que não possuem catálogos.
TABLE_SCHEM (ODBC 1.0) 2 Varchar Nome do esquema; NULL se não aplicável à fonte de dados. Se um driver suporta esquemas para algumas tabelas, mas não para outras, como quando o driver recupera dados de diferentes DBMSs, ele retorna uma string vazia ("") para aquelas tabelas que não possuem esquemas.
TABLE_NAME (ODBC 1.0) 3 Varchar não é NULL Nome da tabela.
COLUMN_NAME (ODBC 1.0) 4 Varchar não é NULL Nome da coluna. O driver retorna uma string vazia para uma coluna que não tem nome.
DATA_TYPE (ODBC 1.0) 5 Smallint não NULL Tipo de dados SQL. Pode ser um tipo de dados SQL ODBC ou um tipo de dados SQL específico do driver. Para tipos de dados de data-hora e intervalo, esta coluna retorna o tipo de dado conciso (como SQL_TYPE_DATE ou SQL_INTERVAL_YEAR_TO_MONTH, em vez do tipo de dado não conciso como SQL_DATETIME ou SQL_INTERVAL). Para obter uma lista de tipos de dados SQL ODBC válidos, consulte Tipos de dados SQL no Apêndice D: Tipos de dados. Para informações sobre tipos de dados SQL específicos do driver, confira a documentação do driver.

Os tipos de dados retornados para o ODBC 3. x e ODBC 2. X aplicações podem ser diferentes. Para obter mais informações, consulte Compatibilidade com versões anteriores e conformidade com padrões.
TYPE_NAME (ODBC 1.0) 6 Varchar não é NULL Nome do tipo de dado dependente da fonte de dados; por exemplo, "CHAR", "VARCHAR", "MONEY", "LONG VARBINAR" ou "CHAR ( ) PARA DADOS DE BITS".
COLUMN_SIZE (ODBC 1.0) 7 Integer Se DATA_TYPE for SQL_CHAR ou SQL_VARCHAR, esta coluna contém o comprimento máximo em caracteres da coluna. Para tipos de dados data-hora, esse é o número total de caracteres necessários para exibir o valor quando ele é convertido em caracteres. Para tipos de dados numéricos, isso é o número total de dígitos ou o número total de bits permitidos na coluna, de acordo com a coluna NUM_PREC_RADIX. Para tipos de dados de intervalo, esse é o número de caracteres na representação do literal do intervalo (conforme definido pela precisão de abertura do intervalo, veja Comprimento do Tipo de Dado de Intervalo no Apêndice D: Tipos de Dados). Para obter mais informações, consulte Tamanho da coluna, Dígitos decimais, Comprimento do octeto de transferência e Tamanho de exibição no Apêndice D: Tipos de dados.
BUFFER_LENGTH (ODBC 1.0) 8 Integer O comprimento em bytes dos dados transferidos em uma operação SQLGetData, SQLFetch ou SQLFetchScroll, se SQL_C_DEFAULT for especificado. Para dados numéricos, esse tamanho pode diferir do tamanho dos dados armazenados na fonte de dados. Esse valor pode diferir de COLUMN_SIZE coluna para dados de caracteres. Para mais informações sobre o comprimento, veja Tamanho da Colunha, Dígitos Decimais, Comprimento do Octeto de Transferência e Tamanho de Exibição no Apêndice D: Tipos de Dados.
DECIMAL_DIGITS (ODBC 1.0) 9 Smallint O número total de dígitos significativos à direita da vírgula decimal. Para SQL_TYPE_TIME e SQL_TYPE_TIMESTAMP, esta coluna contém o número de dígitos no componente de frações de segundos. Para os outros tipos de dados, esses são os dígitos decimais da coluna da fonte de dados. Para tipos de dados de intervalo que contêm um componente temporal, esta coluna contém o número de dígitos à direita do ponto decimal (frações de segundos). Para tipos de dados de intervalo que não contêm um componente de tempo, esta coluna é 0. Para mais informações sobre dígitos decimais, veja Tamanho da Coluna, Dígitos Decimais, Comprimento do Octeto de Transferência e Tamanho de Exibição no Apêndice D: Tipos de Dados. NULL é retornado para tipos de dados onde DECIMAL_DIGITS não é aplicável.
NUM_PREC_RADIX (ODBC 1.0) 10 Smallint Para tipos de dados numéricos, 10 ou 2. Se for 10, os valores em COLUMN_SIZE e DECIMAL_DIGITS indicam o número de dígitos decimais permitidos para a coluna. Por exemplo, uma coluna DECIMAL(12,5) retornaria um NUM_PREC_RADIX de 10, um COLUMN_SIZE de 12 e um DECIMAL_DIGITS de 5; uma coluna FLOAT pode retornar um NUM_PREC_RADIX de 10, um COLUMN_SIZE de 15 e um DECIMAL_DIGITS de NULL.

Se for 2, os valores em COLUMN_SIZE e DECIMAL_DIGITS indicam o número de bits permitidos na coluna. Por exemplo, uma coluna FLOAT poderia devolver um RADIX de 2, um COLUMN_SIZE de 53 e um DECIMAL_DIGITS de NULL.

NULL é retornado para tipos de dados em que NUM_PREC_RADIX não é aplicável.
NULLABLE (ODBC 1.0) 11 Smallint não NULL SQL_NO_NULLS se a coluna não pudesse incluir valores NULL.

SQL_NULLABLE se a coluna aceitar valores NULL.

SQL_NULLABLE_UNKNOWN se não se sabe se a coluna aceita valores NULL.

O valor retornado para esta coluna difere do valor retornado para a coluna IS_NULLABLE. A coluna NULLABLE indica com certeza que uma coluna pode aceitar NULLs, mas não pode indicar com certeza que uma coluna não aceita NULLs. A coluna IS_NULLABLE indica com certeza que uma coluna não pode aceitar NULLs, mas não pode indicar com certeza que uma coluna aceita NULLs.
OBSERVAÇÕES (ODBC 1.0) 12 Varchar Uma descrição da coluna.
COLUMN_DEF (ODBC 3.0) 13 Varchar O valor padrão da coluna. O valor nesta coluna deve ser interpretado como uma string se estiver incluído entre aspas.

Se NULL tiver sido especificado como o valor padrão, essa coluna será a palavra NULL, não entre aspas. Se o valor padrão não puder ser representado sem truncamento, esta coluna contém TRUNCADO, sem incluir aspas simples. Se nenhum valor padrão tiver sido especificado, essa coluna será NULL.

O valor de COLUMN_DEF pode ser usado na geração de uma nova definição de coluna, exceto quando ela contém o valor TRUNCATED.
SQL_DATA_TYPE (ODBC 3.0) 14 Smallint não NULL Tipo de dado SQL, como aparece no campo de registro SQL_DESC_TYPE no IRD. Pode ser um tipo de dados SQL ODBC ou um tipo de dados SQL específico do driver. Esta coluna é a mesma que a coluna DATA_TYPE, exceto para tipos de dados datetime e interval. Esta coluna retorna o tipo de dado não conciso (como SQL_DATETIME ou SQL_INTERVAL), em vez do tipo de dado conciso (como SQL_TYPE_DATE ou SQL_INTERVAL_YEAR_TO_MONTH) para os tipos de data data-hora e intervalo. Se essa coluna devolver SQL_DATETIME ou SQL_INTERVAL, o tipo de dado específico pode ser determinado a partir da coluna SQL_DATETIME_SUB. Para obter uma lista de tipos de dados SQL ODBC válidos, consulte Tipos de dados SQL no Apêndice D: Tipos de dados. Para informações sobre tipos de dados SQL específicos do driver, confira a documentação do driver.

Os tipos de dados retornados para o ODBC 3. x e ODBC 2. X aplicações podem ser diferentes. Para obter mais informações, consulte Compatibilidade com versões anteriores e conformidade com padrões.
SQL_DATETIME_SUB (ODBC 3.0) 15 Smallint O código de subtipo para tipos de dados datetime e interval. Para outros tipos de dados, essa coluna retorna um NULL. Para mais informações sobre subcódigos de data-hora e intervalo, veja "SQL_DESC_DATETIME_INTERVAL_CODE" em SQLSetDescField.
CHAR_OCTET_LENGTH (ODBC 3.0) 16 Integer O comprimento máximo em bytes de uma coluna de tipo de dados binário ou caractere. Para todos os outros tipos de dados, essa coluna retorna um NULL.
ORDINAL_POSITION (ODBC 3.0) 17 Inteiro não NULL A posição ordinal da coluna na tabela. A primeira coluna da tabela é a número 1.
IS_NULLABLE (ODBC 3.0) 18 Varchar "NÃO" se a coluna não incluir NULLs.

"SIM" se a coluna pudesse incluir NULLs.

Esta coluna retorna uma cadeia de caracteres de comprimento zero se a possibilidade de nulidade for desconhecida.

As regras ISO são seguidas para determinar a possibilidade de nulidade. Um DBMS compatível com ISO SQL não pode retornar uma cadeia de caracteres vazia.

O valor retornado para esta coluna difere do valor retornado para a coluna NULLABLE. (Consulte a descrição da coluna NULLABLE.)

Exemplo de código

No exemplo a seguir, uma aplicação declara buffers para o conjunto de resultados retornado pelo SQLColumns. Ele chama SQLColumns para retornar um conjunto de resultados que descreve cada coluna na tabela EMPLOYEE. Em seguida, ele chama o SQLBindCol para vincular as colunas do conjunto de resultados aos buffers. Por fim, a aplicação busca cada linha de dados com SQLFetch e processa.

// SQLColumns_Function.cpp  
// compile with: ODBC32.lib  
#include <windows.h>  
#include <sqlext.h>  
#define STR_LEN 128 + 1  
#define REM_LEN 254 + 1  
  
// Declare buffers for result set data  
SQLCHAR szSchema[STR_LEN];  
SQLCHAR szCatalog[STR_LEN];  
SQLCHAR szColumnName[STR_LEN];  
SQLCHAR szTableName[STR_LEN];  
SQLCHAR szTypeName[STR_LEN];  
SQLCHAR szRemarks[REM_LEN];  
SQLCHAR szColumnDefault[STR_LEN];  
SQLCHAR szIsNullable[STR_LEN];  
  
SQLINTEGER ColumnSize;  
SQLINTEGER BufferLength;  
SQLINTEGER CharOctetLength;  
SQLINTEGER OrdinalPosition;  
  
SQLSMALLINT DataType;  
SQLSMALLINT DecimalDigits;  
SQLSMALLINT NumPrecRadix;  
SQLSMALLINT Nullable;  
SQLSMALLINT SQLDataType;  
SQLSMALLINT DatetimeSubtypeCode;  
  
SQLHSTMT hstmt = NULL;  
  
// Declare buffers for bytes available to return  
SQLINTEGER cbCatalog;  
SQLINTEGER cbSchema;  
SQLINTEGER cbTableName;  
SQLINTEGER cbColumnName;  
SQLINTEGER cbDataType;  
SQLINTEGER cbTypeName;  
SQLINTEGER cbColumnSize;  
SQLLEN cbBufferLength;  
SQLINTEGER cbDecimalDigits;  
SQLINTEGER cbNumPrecRadix;  
SQLINTEGER cbNullable;  
SQLINTEGER cbRemarks;  
SQLINTEGER cbColumnDefault;  
SQLINTEGER cbSQLDataType;  
SQLINTEGER cbDatetimeSubtypeCode;  
SQLINTEGER cbCharOctetLength;  
SQLINTEGER cbOrdinalPosition;  
SQLINTEGER cbIsNullable;  
  
int main() {  
   SQLHENV henv;  
   SQLHDBC hdbc;  
   SQLHSTMT hstmt = 0;  
   SQLRETURN retcode;  
  
   retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);  
   retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER*)SQL_OV_ODBC3, 0);   
   retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);   
   retcode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);  
   retcode = SQLConnect(hdbc, (SQLCHAR*) "Northwind", SQL_NTS, (SQLCHAR*) NULL, 0, NULL, 0);  
   retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);  
   retcode = SQLColumns(hstmt, NULL, 0, NULL, 0, (SQLCHAR*)"CUSTOMERS", SQL_NTS, NULL, 0);  
  
   if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {  
      // Bind columns in result set to buffers  
      SQLBindCol(hstmt, 1, SQL_C_CHAR, szCatalog, STR_LEN,&cbCatalog);  
      SQLBindCol(hstmt, 2, SQL_C_CHAR, szSchema, STR_LEN, &cbSchema);  
      SQLBindCol(hstmt, 3, SQL_C_CHAR, szTableName, STR_LEN,&cbTableName);  
      SQLBindCol(hstmt, 4, SQL_C_CHAR, szColumnName, STR_LEN, &cbColumnName);  
      SQLBindCol(hstmt, 5, SQL_C_SSHORT, &DataType, 0, &cbDataType);  
      SQLBindCol(hstmt, 6, SQL_C_CHAR, szTypeName, STR_LEN, &cbTypeName);  
      SQLBindCol(hstmt, 7, SQL_C_SLONG, &ColumnSize, 0, &cbColumnSize);  
      SQLBindCol(hstmt, 8, SQL_C_SLONG, &BufferLength, 0, &cbBufferLength);  
      SQLBindCol(hstmt, 9, SQL_C_SSHORT, &DecimalDigits, 0, &cbDecimalDigits);  
      SQLBindCol(hstmt, 10, SQL_C_SSHORT, &NumPrecRadix, 0, &cbNumPrecRadix);  
      SQLBindCol(hstmt, 11, SQL_C_SSHORT, &Nullable, 0, &cbNullable);  
      SQLBindCol(hstmt, 12, SQL_C_CHAR, szRemarks, REM_LEN, &cbRemarks);  
      SQLBindCol(hstmt, 13, SQL_C_CHAR, szColumnDefault, STR_LEN, &cbColumnDefault);  
      SQLBindCol(hstmt, 14, SQL_C_SSHORT, &SQLDataType, 0, &cbSQLDataType);  
      SQLBindCol(hstmt, 15, SQL_C_SSHORT, &DatetimeSubtypeCode, 0, &cbDatetimeSubtypeCode);  
      SQLBindCol(hstmt, 16, SQL_C_SLONG, &CharOctetLength, 0, &cbCharOctetLength);  
      SQLBindCol(hstmt, 17, SQL_C_SLONG, &OrdinalPosition, 0, &cbOrdinalPosition);  
      SQLBindCol(hstmt, 18, SQL_C_CHAR, szIsNullable, STR_LEN, &cbIsNullable);  
  
      while (SQL_SUCCESS == retcode) {  
         retcode = SQLFetch(hstmt);  
         /*  
         if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO)  
            0;   // show_error();  
         if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)  
            0;   // Process fetched data  
         else  
            break;  
        */  
      }  
   }  
}  
Para obter informações sobre Veja
Associando um buffer a uma coluna em um conjunto de resultados Função SQLBindCol
Cancelando o processamento de instruções Função SQLCancel
Retornando privilégios para uma ou mais colunas Função SQLColumnPrivileges
Buscando um bloco de dados ou rolando por um conjunto de resultados Função SQLFetchScroll
Buscando várias linhas de dados Função SQLFetch
Colunas retornando que identificam de forma única uma linha, ou colunas atualizadas automaticamente por uma transação Função SQLSpecialColumns
Retornando estatísticas e índices de tabelas Função SQLStatistics
Retornando uma lista de tabelas em uma fonte de dados Função SQLTables
Devolvendo privilégios para uma ou mais tabelas Função SQLTablePrivileges