SQLColumns 函数

一致性
引入的版本:ODBC 1.0 标准合规性:开放组

摘要
SQLColumns 返回指定表中的列名列表。 驱动程序将此信息作为指定 StatementHandle 上的结果集返回。

语法

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

参数

StatementHandle
[输入]语句句柄。

CatalogName
[输入]目录名称。 如果驱动程序支持某些表的目录,但不支持其他表的目录(例如,当驱动程序从不同的 DBMS 检索数据时),则空字符串 (“”) 指示那些没有目录的表。 CatalogName 不能包含字符串搜索模式。

注意

如果 SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE, 则 CatalogName 被视为标识符,其大小写并不重要。 如果为SQL_FALSE, 则 CatalogName 是一个普通参数;它按字面处理,其大小写很重要。 有关详细信息,请参阅 目录函数中的参数

NameLength1
[输入]*CatalogName 的长度(以字符为单位)。

SchemaName
[输入]架构名称的字符串搜索模式。 如果驱动程序支持某些表的架构,但不支持其他表的架构(例如,当驱动程序从不同的 DBMS 检索数据时),则空字符串 (“”) 指示那些没有架构的表。

注意

如果 SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE, 则 SchemaName 被视为标识符,其大小写并不重要。 如果它是SQL_FALSE, 则 SchemaName 是模式值参数;它按字面处理,其大小写很重要。

NameLength2
[输入]*SchemaName 的长度(以字符为单位)。

TableName
[输入]表名称的字符串搜索模式。

注意

如果 SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE, 则 TableName 被视为标识符,其大小写并不重要。 如果SQL_FALSE, 则 TableName 是模式值参数;它按字面处理,其大小写很重要。

NameLength3
[输入]*TableName 的长度(以字符为单位)。

ColumnName
[输入]列名的字符串搜索模式。

注意

如果 SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE, 则 ColumnName 被视为标识符,其大小写并不重要。 如果SQL_FALSE, 则 ColumnName 是模式值参数;它按字面处理,其大小写很重要。

NameLength4
[输入]*ColumnName 的长度(以字符为单位)。

返回

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR或SQL_INVALID_HANDLE。

诊断

SQLColumns 返回SQL_ERROR或SQL_SUCCESS_WITH_INFO时,可以通过使用 handleType 为 SQL_HANDLE_STMT 和 Handle ofStatementHandle 调用 SQLGetDiagRec 来获取关联的 SQLSTATE 值。 下表列出了通常由 SQLColumns 返回的 SQLSTATE 值,并对此函数的上下文中的每个值进行了说明:表示法“ (DM) ”位于驱动程序管理器返回的 SQLSTATE 说明之前。 与每个 SQLSTATE 值关联的返回代码SQL_ERROR,除非另有说明。

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。 (函数返回 SQL_SUCCESS_WITH_INFO.)
08S01 通信链接失败 在函数完成处理之前,驱动程序与所连接的数据源之间的通信链接失败。
24000 游标状态无效 在 StatementHandle 上打开了游标,并且已调用 SQLFetchSQLFetchScroll。 如果 SQLFetch 或 SQLFetchScroll 未返回SQL_NO_DATA,则驱动程序管理器将返回此错误;如果 SQLFetch 或 SQLFetchScroll 已返回SQL_NO_DATA,则驱动程序返回此错误。

在 StatementHandle 上打开了游标,但尚未调用 SQLFetchSQLFetchScroll
40001 序列化失败 由于与另一个事务发生资源死锁,事务已回滚。
40003 语句完成未知 在执行此函数期间,关联的连接失败,并且无法确定事务的状态。
HY000 常规错误 发生错误,其中没有特定的 SQLSTATE,也没有定义特定于实现的 SQLSTATE。 SQLGetDiagRec*MessageText 缓冲区中返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY008 操作已取消 已为 StatementHandle 启用异步处理。 调用了函数,在它完成执行之前,在 StatementHandle 上调用了 SQLCancel 或 SQLCancelHandle 然后,在 StatementHandle 上再次调用函数。

函数已调用,在它完成执行之前,在 StatementHandle 上从多线程应用程序中的不同线程调用 SQLCancel 或 SQLCancelHandle
HY009 null 指针的使用无效 SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE, CatalogName 参数为 null 指针, infoType SQL_CATALOG_NAME 返回目录名称受支持。

(DM) SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE, SchemaNameTableNameColumnName 参数为 null 指针。
HY010 函数序列错误 (DM) 为与 StatementHandle 关联的连接句柄调用了异步执行的函数。 调用 SQLColumns 函数时,此异步函数仍在执行。

(DM) SQLExecuteSQLExecDirectSQLMoreResults 已为 StatementHandle 调用并返回SQL_PARAM_DATA_AVAILABLE。 此函数是在检索所有流参数的数据之前调用的。

(DM) 为 StatementHandle 调用了异步执行的函数, (不是此函数) ,在调用此函数时仍在执行。

(DM) SQLExecuteSQLExecDirectSQLBulkOperationsSQLSetPos 已为 StatementHandle 调用,并返回SQL_NEED_DATA。 在针对所有数据执行参数或列发送数据之前调用了此函数。
HY013 内存管理错误 无法处理函数调用,因为无法访问基础内存对象,可能是由于内存不足。
HY090 无效的字符串或缓冲区长度 (DM) 名称长度参数之一的值小于 0 但不等于SQL_NTS。
其中一个名称长度参数的值超过了相应目录或名称的最大长度值。 可以通过使用 InfoType 值调用 SQLGetInfo 来获取每个目录或名称的最大长度。 (请参阅“注释”。)
HY117 由于未知的事务状态,连接已挂起。 仅允许断开连接和只读函数。 (DM) 有关挂起状态的详细信息,请参阅 SQLEndTran 函数
HYC00 未实现可选功能 指定了目录名称,驱动程序或数据源不支持目录。

指定了架构名称,驱动程序或数据源不支持架构。

为架构名称、表名或列名指定了字符串搜索模式,并且数据源不支持其中一个或多个参数的搜索模式。

驱动程序或数据源不支持SQL_ATTR_CONCURRENCY和 SQL_ATTR_CURSOR_TYPE 语句属性的当前设置组合。

SQL_ATTR_USE_BOOKMARKS 语句属性设置为 SQL_UB_VARIABLE,SQL_ATTR_CURSOR_TYPE 语句属性设置为驱动程序不支持书签的游标类型。
HYT00 超时时间已到 查询超时期限在数据源返回结果集之前过期。 超时期限是通过 SQLSetStmtAttr SQL_ATTR_QUERY_TIMEOUT设置的。
HYT01 超过连接超时时间 在数据源响应请求之前,连接超时期限已过期。 连接超时期限是通过 SQLSetConnectAttr SQL_ATTR_CONNECTION_TIMEOUT设置的。
IM001 驱动程序不支持此函数 (DM) 与 StatementHandle 关联的驱动程序不支持 函数。
IM017 在异步通知模式下禁用轮询 每当使用通知模型时,轮询都将被禁用。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上的上一个异步操作。 如果句柄上的上一个函数调用返回SQL_STILL_EXECUTING并且启用了通知模式,则必须在句柄上调用 SQLCompleteAsync 以执行后期处理并完成操作。

注释

此函数通常在语句执行之前用于从数据源的目录中检索有关表或表的列的信息。 SQLColumns 可用于检索 SQLTable 返回的所有类型的项的数据。 除了基表,这可能还包括 (但不限于) 视图、同义词、系统表等。 相比之下,函数 SQLColAttributeSQLDescribeCol 描述结果集中的列,函数 SQLNumResultCols 返回结果集中的列数。 有关详细信息,请参阅 目录数据的使用

注意

有关 ODBC 目录函数的常规用法、参数和返回数据的详细信息,请参阅 目录函数

SQLColumns 以标准结果集的形式返回结果,按TABLE_CAT、TABLE_SCHEM、TABLE_NAME和ORDINAL_POSITION排序。

注意

当应用程序使用 ODBC 2 时。x 驱动程序,结果集中不返回任何ORDINAL_POSITION列。 因此,在使用 ODBC 2 时。x 驱动程序, SQLColumns 返回的列列表中列的顺序不一定与应用程序对该表中的所有列执行 SELECT 语句时返回的列的顺序相同。

注意

SQLColumns 可能不会返回所有列。 例如,驱动程序可能不会返回有关伪列的信息,例如 Oracle ROWID。 应用程序可以使用任何有效的列,无论它是否由 SQLColumns 返回。

SQLStatistics 可以返回的某些列不由 SQLColumns 返回。 例如, SQLColumns 不会返回通过表达式或筛选器创建的索引中的列,例如 SALARY + BENEFITS 或 DEPT = 0012。

表中未显示 VARCHAR 列的长度;实际长度取决于数据源。 若要确定TABLE_CAT、TABLE_SCHEM、TABLE_NAME和COLUMN_NAME列的实际长度,应用程序可以使用SQL_MAX_CATALOG_NAME_LEN、SQL_MAX_SCHEMA_NAME_LEN、SQL_MAX_TABLE_NAME_LEN和SQL_MAX_COLUMN_NAME_LEN选项调用 SQLGetInfo

以下列已重命名为 ODBC 3。x. 列名称更改不会影响向后兼容性,因为应用程序按列号绑定。

ODBC 2.0 列 ODBC 3。x
TABLE_QUALIFIER TABLE_CAT
TABLE_OWNER TABLE_SCHEM
PRECISION COLUMN_SIZE
LENGTH BUFFER_LENGTH
SCALE DECIMAL_DIGITS
RADIX NUM_PREC_RADIX

以下列已添加到 ODBC 3 的 SQLColumns 返回的结果集中。x

CHAR_OCTET_LENGTH
COLUMN_DEF

IS_NULLABLE
ORDINAL_POSITION

SQL_DATA_TYPE
SQL_DATETIME_SUB

下表列出了结果集中的列。 驱动程序可以定义列 18 (IS_NULLABLE) 以外的其他列。 应用程序应通过从结果集末尾倒计时而不是指定显式序号位置来获取对特定于驱动程序的列的访问权限。 有关详细信息,请参阅 目录函数返回的数据

列名称

数字
数据类型 注释
TABLE_CAT (ODBC 1.0) 1 Varchar 目录名称;如果不适用于数据源,则为 NULL。 如果驱动程序支持某些表的目录,但不支持其他表的目录,例如,当驱动程序从不同的 DBMS 检索数据时,它将为没有目录的表返回空字符串 (“”) 。
TABLE_SCHEM (ODBC 1.0) 2 Varchar 架构名称;如果不适用于数据源,则为 NULL。 如果驱动程序支持某些表的架构,但不支持其他表的架构,例如,当驱动程序从不同的 DBMS 检索数据时,它将为没有架构的表返回空字符串 (“”) 。
TABLE_NAME (ODBC 1.0) 3 Varchar 不为 NULL 表名。
COLUMN_NAME (ODBC 1.0) 4 Varchar 不为 NULL 列名称。 驱动程序为没有名称的列返回空字符串。
DATA_TYPE (ODBC 1.0) 5 Smallint(非 NULL) SQL 数据类型。 这可以是 ODBC SQL 数据类型或特定于驱动程序的 SQL 数据类型。 对于 datetime 和 interval 数据类型,此列返回简洁的数据类型 ((如 SQL_TYPE_DATE 或 SQL_INTERVAL_YEAR_TO_MONTH),而不是不合一的数据类型(如 SQL_DATETIME 或 SQL_INTERVAL) )。 有关有效 ODBC SQL 数据类型的列表,请参阅附录 D:数据类型中的 SQL 数据类型。 有关特定于驱动程序的 SQL 数据类型的信息,请参阅驱动程序的文档。

为 ODBC 3 返回的数据类型。x 和 ODBC 2。x 应用程序可能不同。 有关详细信息,请参阅 向后兼容性和标准合规性
TYPE_NAME (ODBC 1.0) 6 Varchar 不为 NULL 数据源相关的数据类型名称;例如,“CHAR”、“VARCHAR”、“MONEY”、“LONG VARBINAR”或“CHAR ( ) FOR BIT DATA”。
COLUMN_SIZE (ODBC 1.0) 7 Integer 如果DATA_TYPE SQL_CHAR或SQL_VARCHAR,则此列包含列的最大长度(以字符为单位)。 对于 datetime 数据类型,这是将值转换为字符时显示该值所需的字符总数。 对于数值数据类型,根据NUM_PREC_RADIX列,这是列中允许的位数总数或总位数。 对于 interval 数据类型,这是由间隔前导精度定义的间隔文本 (字符表示形式的字符数,请参阅附录 D 中的 Interval 数据类型长度 :数据类型) 。 有关详细信息,请参阅附录 D:数据类型中的 列大小、十进制数字、传输八进制数长度和显示大小
BUFFER_LENGTH (ODBC 1.0) 8 Integer 如果指定了SQL_C_DEFAULT,则为在 SQLGetData、SQLFetch 或 SQLFetchScroll 操作上传输的数据的长度(以字节为单位)。 对于数值数据,此大小可能与数据源上存储的数据的大小不同。 此值可能与字符数据COLUMN_SIZE列不同。 有关长度的详细信息,请参阅附录 D:数据类型中的 列大小、十进制数字、传输八进制数长度和显示大小
DECIMAL_DIGITS (ODBC 1.0) 9 Smallint 小数点右侧有效位数的总数。 对于SQL_TYPE_TIME和SQL_TYPE_TIMESTAMP,此列包含秒小数部分的位数。 对于其他数据类型,这是数据源中列的十进制数字。 对于包含时间组件的间隔数据类型,此列包含小数点右侧的位数 (秒的小数部分) 。 对于不包含时间组件的间隔数据类型,此列为 0。 有关十进制数字的详细信息,请参阅附录 D:数据类型中的 列大小、十进制数字、传输八进制数长度和显示大小 。 对于不适用DECIMAL_DIGITS的数据类型,返回 NULL。
NUM_PREC_RADIX (ODBC 1.0) 10 Smallint 对于数值数据类型,可以是 10 或 2。 如果为 10,则COLUMN_SIZE 和 DECIMAL_DIGITS中的值提供列允许的小数位数。 例如,DECIMAL (12,5) 列将返回 10 的NUM_PREC_RADIX,COLUMN_SIZE为 12,DECIMAL_DIGITS为 5;FLOAT 列可以返回 10 的NUM_PREC_RADIX,COLUMN_SIZE为 15,DECIMAL_DIGITS NULL。

如果为 2,则 COLUMN_SIZE 和 DECIMAL_DIGITS中提供列中允许的位数。 例如,FLOAT 列可以返回 RADIX 为 2、COLUMN_SIZE为 53,DECIMAL_DIGITS为 NULL。

对于不适用NUM_PREC_RADIX的数据类型,返回 NULL。
可为 NULL (ODBC 1.0) 11 Smallint(非 NULL) 如果列不能包含 NULL 值,则SQL_NO_NULLS。

如果列接受 NULL 值,则SQL_NULLABLE。

如果不知道列是否接受 NULL 值,则SQL_NULLABLE_UNKNOWN。

为此列返回的值不同于为IS_NULLABLE列返回的值。 NULLABLE 列明确指示列可以接受 NULL,但不能确定列不接受 NULL。 IS_NULLABLE列明确指示列不能接受 NULL,但不能确定列接受 NULL。
备注 (ODBC 1.0) 12 Varchar 列的说明。
COLUMN_DEF (ODBC 3.0) 13 Varchar 列的默认值。 如果此列中的值用引号引起来,则应将其解释为字符串。

如果将 NULL 指定为默认值,则此列为单词 NULL,而不是用引号引起来。 如果在不截断的情况下无法表示默认值,则此列包含 TRUNCATED,而不用单引号引起来。 如果未指定默认值,则此列为 NULL。

COLUMN_DEF 的值可用于生成新的列定义,但包含值 TRUNCATED 时除外。
SQL_DATA_TYPE (ODBC 3.0) 14 Smallint(非 NULL) SQL 数据类型,如在 IRD 的SQL_DESC_TYPE记录字段中显示的那样。 这可以是 ODBC SQL 数据类型或特定于驱动程序的 SQL 数据类型。 此列与DATA_TYPE列相同,但 datetime 和 interval 数据类型除外。 此列返回不合时宜的数据类型 ((如 SQL_DATETIME 或 SQL_INTERVAL) ),而不是针对 datetime 和 interval 数据类型的简洁数据类型 ((如 SQL_TYPE_DATE 或 SQL_INTERVAL_YEAR_TO_MONTH) )。 如果此列返回SQL_DATETIME或SQL_INTERVAL,则可以从SQL_DATETIME_SUB列确定特定的数据类型。 有关有效 ODBC SQL 数据类型的列表,请参阅附录 D:数据类型中的 SQL 数据类型。 有关特定于驱动程序的 SQL 数据类型的信息,请参阅驱动程序的文档。

为 ODBC 3 返回的数据类型。x 和 ODBC 2。x 应用程序可能不同。 有关详细信息,请参阅 向后兼容性和标准合规性
SQL_DATETIME_SUB (ODBC 3.0) 15 Smallint datetime 和 interval 数据类型的子类型代码。 对于其他数据类型,此列返回 NULL。 有关 datetime 和 interval 子代码的详细信息,请参阅 SQLSetDescField 中的“SQL_DESC_DATETIME_INTERVAL_CODE”。
CHAR_OCTET_LENGTH (ODBC 3.0) 16 Integer 字符或二进制数据类型列的最大长度(以字节为单位)。 对于所有其他数据类型,此列返回 NULL。
ORDINAL_POSITION (ODBC 3.0) 17 Integer(非 NULL) 列在表中的序号位置。 表中的第一列是数字 1。
IS_NULLABLE (ODBC 3.0) 18 Varchar 如果列不包含 NULL,则为“否”。

如果列可以包含 NULL,则为 “YES”。

如果为 Null 性为未知,该列将返回零长度字符串。

根据 ISO 规则确定为 Null 性。 遵从 ISO SQL 标准的 DBMS 不能返回空字符串。

为此列返回的值不同于为 NULLABLE 列返回的值。 (请参阅 NULLABLE 列的说明。)

代码示例

在以下示例中,应用程序为 SQLColumns 返回的结果集声明缓冲区。 它调用 SQLColumns 以返回描述 EMPLOYEE 表中每一列的结果集。 然后,它调用 SQLBindCol 将结果集中的列绑定到缓冲区。 最后,应用程序使用 SQLFetch 提取每行数据并对其进行处理。

// 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;  
        */  
      }  
   }  
}  
有关以下方面的信息 请参阅
将缓冲区绑定到结果集中的列 SQLBindCol 函数
取消语句处理 SQLCancel 函数
返回列或列的权限 SQLColumnPrivileges 函数
提取数据块或滚动浏览结果集 SQLFetchScroll Function(SQLFetchScroll 函数)
提取多行数据 SQLFetch 函数
返回唯一标识行的列,或事务自动更新的列 SQLSpecialColumns 函数
返回表统计信息和索引 SQLStatistics 函数
返回数据源中的表列表 SQLTables 函数
返回一个或多个表的权限 SQLTablePrivileges Function(SQLTablePrivileges 函数)

另请参阅

ODBC API 参考
ODBC 头文件