SQLColumns 関数

準拠
導入されたバージョン: ODBC 1.0 Standards Compliance: Open Group

まとめ
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 に文字列検索パターンを含めることはできません。

Note

SQL_ATTR_METADATA_ID ステートメント属性が SQL_TRUE に設定されている場合、 CatalogName は識別子として扱われ、大文字と小文字は区別されません。 SQL_FALSEの場合、 CatalogName は通常の引数です。それは文字通り扱われ、そのケースは重要です。 詳細については、「 Catalog Functions の引数」を参照してください。

NameLength1
[入力]*CatalogName の文字数。

Schemaname
[入力]スキーマ名の文字列検索パターン。 ドライバーが一部のテーブルのスキーマをサポートしているが、他のテーブルではサポートされていない場合 (ドライバーが異なる DBMS からデータを取得する場合など)、空の文字列 ("") はスキーマを持たないテーブルを示します。

Note

SQL_ATTR_METADATA_ID ステートメント属性が SQL_TRUE に設定されている場合、 SchemaName は識別子として扱われ、大文字と小文字は区別されません。 SQL_FALSEの場合、 SchemaName はパターン値引数です。それは文字通り扱われ、そのケースは重要です。

NameLength2
[入力]*SchemaName の文字数。

TableName
[入力]テーブル名の文字列検索パターン。

Note

SQL_ATTR_METADATA_ID ステートメント属性が SQL_TRUE に設定されている場合、 TableName は識別子として扱われ、大文字と小文字は区別されません。 SQL_FALSEの場合、 TableName はパターン値引数です。それは文字通り扱われ、そのケースは重要です。

NameLength3
[入力]*TableName の文字数。

[ColumnName]
[入力]列名の文字列検索パターン。

Note

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を返す場合、関連付けられた SQLSTATE 値を取得するには、SQL_HANDLE_STMTの HandleTypeStatementHandleHandle を指定して SQLGetDiagRec を呼び出します。 次の表に、 SQLColumns によって通常返される SQLSTATE 値の一覧を示し、この関数のコンテキストでそれぞれについて説明します。表記 "(DM)" は、ドライバー マネージャーによって返される SQLSTATEs の説明の前にあります。 特に明記されていない限り、各 SQLSTATE 値に関連付けられている戻りコードはSQL_ERRORされます。

SQLSTATE エラー 説明
01000 一般的な警告 ドライバー固有の情報メッセージ。 (関数はSQL_SUCCESS_WITH_INFOを返します。
08S01 通信リンクエラー ドライバーとドライバーが接続されたデータ ソース間の通信リンクは、関数の処理が完了する前に失敗しました。
24000 カーソル状態が無効 StatementHandle でカーソルが開き、SQLFetch または SQLFetchScroll が呼び出されました。 このエラーは、SQLFetch または SQLFetchScroll がSQL_NO_DATAを返していない場合にドライバー マネージャーによって返され、SQLFetch または SQLFetchScroll がSQL_NO_DATAを返した場合にドライバーによって返されます。

StatementHandle でカーソルが開いていましたが、SQLFetch または SQLFetchScroll が呼び出されませんでした。
40001 シリアル化エラー 別のトランザクションでリソースのデッドロックが発生したため、トランザクションがロールバックされました。
40003 ステートメントの完了が不明です この関数の実行中に関連付けられた接続が失敗し、トランザクションの状態を特定できません。
HY000 一般的なエラー 特定の SQLSTATE がなく、実装固有の SQLSTATE が定義されていないエラーが発生しました。 *MessageText バッファー内の SQLGetDiagRec によって返されるエラー メッセージは、エラーとその原因を説明します。
HY001 メモリ割り当てエラー ドライバーは、関数の実行または完了をサポートするために必要なメモリを割り当てることができませんでした。
HY008 操作が取り消されました StatementHandle に対して非同期処理が有効になりました。 関数が呼び出され、実行が完了する前に、 SQLCancel または SQLCancelHandleStatementHandle で呼び出されました。 その後、 StatementHandle で関数が再度呼び出されました。

関数が呼び出され、実行が完了する前に、マルチスレッド アプリケーション内の別のスレッドから StatementHandleSQLCancel または SQLCancelHandle が呼び出されました。
HY009 null ポインターの使用が無効です SQL_ATTR_METADATA_ID ステートメント属性が SQL_TRUE に設定され、 CatalogName 引数が null ポインターであり、SQL_CATALOG_NAME InfoType はカタログ名がサポートされていることを返します。

(DM) SQL_ATTR_METADATA_ID ステートメント属性が SQL_TRUE に設定され、 SchemaNameTableName、または ColumnName 引数が null ポインターでした。
HY010 関数シーケンス エラー (DM) StatementHandle に関連付けられている接続ハンドルに対して非同期実行関数が呼び出されました。 この非同期関数は、 SQLColumns 関数が呼び出されたときにも実行されていました。

(DM) StatementHandle に対して SQLExecuteSQLExecDirect、または SQLMoreResults が呼び出され、SQL_PARAM_DATA_AVAILABLE返されました。 この関数は、ストリーミングされたすべてのパラメーターのデータが取得される前に呼び出されました。

(DM) 非同期実行関数 (この関数ではなく) が StatementHandle に対して呼び出され、この関数が呼び出されたときにはまだ実行されていました。

(DM) StatementHandle に対して SQLExecuteSQLExecDirectSQLBulkOperations、または SQLSetPos が呼び出され、SQL_NEED_DATA返されました。 この関数は、すべての実行時データ パラメーターまたは列に対してデータが送信される前に呼び出されました。
HY013 メモリ管理エラー メモリ不足の可能性があるため、基になるメモリ オブジェクトにアクセスできなかったため、関数呼び出しを処理できませんでした。
HY090 文字列またはバッファーの長さが無効です (DM) 名前の長さの引数の 1 つの値が 0 未満でしたが、SQL_NTSと等しくありません。
名前長引数の 1 つの値が、対応するカタログまたは名前の最大長値を超えました。 各カタログまたは名前の最大長は、InfoType 値を使用して SQLGetInfo を呼び出すことによって取得できます。 (「コメント」を参照してください)。)
HY117 不明なトランザクション状態が原因で接続が中断されます。 切断関数と読み取り専用関数のみが許可されます。 (DM) 中断状態の詳細については、「 SQLEndTran 関数」を参照してください。
HYC00 省略可能な機能が実装されていません カタログ名が指定されており、ドライバーまたはデータ ソースがカタログをサポートしていません。

スキーマ名が指定されており、ドライバーまたはデータ ソースでスキーマがサポートされていません。

スキーマ名、テーブル名、または列名に文字列検索パターンが指定されており、データ ソースは、これらの引数の 1 つ以上の検索パターンをサポートしていません。

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 を使用すると、 SQLTables によって返されるすべての種類のアイテムのデータを取得できます。 これには、ベース テーブルに加えて、ビュー、シノニム、システム テーブルなどが含まれます (ただし、これらに限定されません)。 これに対し、 SQLColAttribute 関数と SQLDescribeCol 関数 は結果セット内の列を記述し、関数 SQLNumResultCols は 結果セット内の列数を返します。 詳細については、「 カタログ データの使用」を参照してください。

Note

ODBC カタログ関数の一般的な使用方法、引数、および返されるデータの詳細については、「 カタログ関数」を参照してください。

SQLColumns は 、TABLE_CAT、TABLE_SCHEM、TABLE_NAME、およびORDINAL_POSITIONで並べ替えられた標準の結果セットとして結果を返します。

Note

アプリケーションが ODBC 2 で動作する場合。x ドライバー、結果セットにORDINAL_POSITION列は返されません。 その結果、ODBC 2 を使用する場合。x ドライバーでは、 SQLColumns によって返される列リスト内の列の順序は、アプリケーションがそのテーブル内のすべての列に対して SELECT ステートメントを実行するときに返される列の順序と必ずしも同じではありません。

Note

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) を超える追加の列は、ドライバーによって定義できます。 アプリケーションは、明示的な序数位置を指定する代わりに、結果セットの末尾からカウントダウンすることで、ドライバー固有の列にアクセスする必要があります。 詳細については、「 カタログ関数によって返されるデータ」を参照してください。

列名

number
データ型 コメント
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 not NULL テーブル名。
COLUMN_NAME (ODBC 1.0) 4 Varchar not NULL 列名。 ドライバーは、名前のない列の空の文字列を返します。
DATA_TYPE (ODBC 1.0) 5 Smallint (NULL 以外) SQL データ型。 ODBC SQL データ型またはドライバー固有の SQL データ型を指定できます。 datetime データ型と interval データ型の場合、この列は簡潔なデータ型 (SQL_DATETIMEやSQL_INTERVALなどの非コンサイズデータ型ではなく、SQL_TYPE_DATEやSQL_INTERVAL_YEAR_TO_MONTHなど) を返します。 有効な ODBC SQL データ型の一覧については、「付録 D: データ型」の「SQL データ型 」を参照してください。 ドライバー固有の SQL データ型の詳細については、ドライバーのドキュメントを参照してください。

ODBC 3 で返されるデータ型。x および ODBC 2。x アプリケーションが異なる場合があります。 詳細については、「 下位互換性と標準のコンプライアンス」を参照してください。
TYPE_NAME (ODBC 1.0) 6 Varchar not NULL データ ソースに依存するデータ型名。たとえば、"CHAR"、"VARCHAR"、"MONEY"、"LONG VARBINAR"、"CHAR ( ) FOR BIT DATA" などです。
COLUMN_SIZE (ODBC 1.0) 7 整数型 DATA_TYPEがSQL_CHARまたはSQL_VARCHARの場合、この列には列の最大文字数が含まれます。 datetime データ型の場合、値を文字に変換するときに表示するために必要な文字数の合計です。 数値データ型の場合、これは、NUM_PREC_RADIX列に従って、列で許可される合計桁数または合計ビット数です。 間隔データ型の場合、これは間隔リテラルの文字表現の文字数です (間隔の先頭の有効桁数で定義されます。「付録 D: データ 型の間隔データ型の長さ 」を参照してください)。 詳細については、「付録 D: データ型」の 「列サイズ、10 進数、転送オクテット長」、「表示サイズ 」を参照してください。
BUFFER_LENGTH (ODBC 1.0) 8 整数型 SQLGetData、SQLFetch、または SQLFetchScroll 操作で転送されるデータの長さ (バイト単位) (SQL_C_DEFAULTが指定されている場合)。 数値データの場合、このサイズはデータ ソースに格納されているデータのサイズと異なる場合があります。 この値は、文字データCOLUMN_SIZE列とは異なる場合があります。 長さの詳細については、「付録 D: データ型」の 「列サイズ、10 進数、転送オクテット長、および表示サイズ 」を参照してください。
DECIMAL_DIGITS (ODBC 1.0) 9 Smallint 小数点の右側にある有効桁数の合計。 SQL_TYPE_TIMEとSQL_TYPE_TIMESTAMPの場合、この列には秒の小数部の部分の桁数が含まれます。 他のデータ型の場合、これはデータ ソースの列の 10 進数です。 時間コンポーネントを含む間隔データ型の場合、この列には小数点の右側の桁数 (秒の小数部) が含まれます。 時間コンポーネントを含まない間隔データ型の場合、この列は 0 です。 10 進数の詳細については、「付録 D: データ型」の 「列のサイズ、10 進数、転送オクテットの長さ、および表示サイズ 」を参照してください。 DECIMAL_DIGITSが適用されないデータ型には NULL が返されます。
NUM_PREC_RADIX (ODBC 1.0) 10 Smallint 数値データ型の場合は、10 または 2。 10 の場合、COLUMN_SIZE と DECIMAL_DIGITS の値は、列に使用できる 10 進数の桁数を示します。 たとえば、DECIMAL(12,5) 列は、NUM_PREC_RADIX 10、COLUMN_SIZE 12、DECIMAL_DIGITS 5 を返します。FLOAT 列は、NUM_PREC_RADIX 10、COLUMN_SIZE 15、DECIMAL_DIGITS NULL を返すことができます。

2 の場合、COLUMN_SIZE と DECIMAL_DIGITS の値は、列で許可されるビット数を指定します。 たとえば、FLOAT 列は、基数 2、COLUMN_SIZE 53、DECIMAL_DIGITS NULL を返すことができます。

NUM_PREC_RADIXが適用されないデータ型には NULL が返されます。
NULLABLE (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 データ型を指定できます。 この列は、datetime データ型と interval データ型を除き、DATA_TYPE列と同じです。 この列は、datetime データ型と interval データ型の簡潔なデータ型 (SQL_TYPE_DATEやSQL_INTERVAL_YEAR_TO_MONTHなど) ではなく、非コンサイス データ型 (SQL_DATETIMEやSQL_INTERVALなど) を返します。 この列が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 整数型 文字またはバイナリ データ型の列の最大長 (バイト単位)。 その他のすべてのデータ型の場合、この列は NULL を返します。
ORDINAL_POSITION (ODBC 3.0) 17 Integer (NULL 以外) テーブル内の列の序数位置です。 テーブルの最初の列は数値 1 です。
IS_NULLABLE (ODBC 3.0) 18 Varchar 列に NULL が含まれていない場合は "NO" です。

列に NULL を含めることができる場合は "YES" です。

null 値の許容が不明な場合、この列は長さ 0 の文字列を返します。

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 関数
複数行のデータをフェッチする SQLFetch 関数
行を一意に識別する列、またはトランザクションによって自動的に更新される列を返す SQLSpecialColumns 関数
テーブルの統計とインデックスを返す SQLStatistics 関数
データ ソース内のテーブルの一覧を返す SQLTables 関数
テーブルまたはテーブルの特権を返す SQLTablePrivileges 関数

参照

ODBC API リファレンス
ODBC ヘッダー ファイル