SQLColAttribute 関数

準拠
導入されたバージョン: ODBC 3.0 Standards Compliance: ISO 92

まとめ
SQLColAttribute は、結果セット内の列の記述子情報を返します。 記述子情報は、文字列、記述子に依存する値、または整数値として返されます。

Note

ODBC 3 の場合にドライバー マネージャーによってこの関数がマップされる内容の詳細については、次を参照してください。x アプリケーションは ODBC 2 で動作しています。x ドライバーについては、「 アプリケーションの下位互換性のための置換関数のマッピング」を参照してください。

構文

  
SQLRETURN SQLColAttribute (  
      SQLHSTMT        StatementHandle,  
      SQLUSMALLINT    ColumnNumber,  
      SQLUSMALLINT    FieldIdentifier,  
      SQLPOINTER      CharacterAttributePtr,  
      SQLSMALLINT     BufferLength,  
      SQLSMALLINT *   StringLengthPtr,  
      SQLLEN *        NumericAttributePtr);  

引数

StatementHandle
[入力]ステートメント ハンドル。

ColumnNumber
[入力]フィールド値の取得元となる IRD 内のレコードの番号。 この引数は、1 から始まる列の順序で順番に並べ替えられた結果データの列番号に対応します。 列は任意の順序で記述できます。

この引数では列 0 を指定できますが、SQL_DESC_TYPEとSQL_DESC_OCTET_LENGTHを除くすべての値は未定義の値を返します。

FieldIdentifier
[入力]記述子ハンドル。 このハンドルは、IRD のどのフィールドに対してクエリを実行するかを定義します (たとえば、SQL_COLUMN_TABLE_NAME)。

CharacterAttributePtr
[出力]フィールドが文字列の場合、IRD の ColumnNumber 行の FieldIdentifier フィールドの値を返すバッファーへのポインター。 それ以外の場合、フィールドは使用されません。

CharacterAttributePtr が NULL の場合でも、StringLengthPtrCharacterAttributePtr が指すバッファーで返すことができる合計バイト数 (文字データの null 終端文字を除く) を返します。

BufferLength
[入力] FieldIdentifier が ODBC で定義されたフィールドで 、CharacterAttributePtr が 文字列またはバイナリ バッファーを指している場合、この引数は *CharacterAttributePtr の長さである必要があります。 FieldIdentifier が ODBC で定義されたフィールドで、*CharacterAttributePtr が整数の場合、このフィールドは無視されます。 *CharacterAttributePtr が Unicode 文字列の場合 (SQLColAttributeW を呼び出すとき)、BufferLength 引数は偶数である必要があります。 FieldIdentifier がドライバー定義フィールドの場合、アプリケーションは BufferLength 引数を設定することによって、ドライバー マネージャーにフィールドの性質を示します。 BufferLength には、次の値を指定できます。

  • CharacterAttributePtr がポインターへのポインターである場合、BufferLength には値SQL_IS_POINTERが必要です。

  • CharacterAttributePtr が文字列へのポインターである場合、BufferLength はバッファーの長さです。

  • CharacterAttributePtr がバイナリ バッファーへのポインターである場合、アプリケーションは bufferLength に SQL_LEN_BINARY_ATTR(length) マクロの結果を配置します。 これにより、 BufferLength に負の値が設定されます。

  • CharacterAttributePtr が固定長データ型へのポインターである場合、BufferLength は、SQL_IS_INTEGER、SQL_IS_UINTEGER、SQL_IS_SMALLINT、またはSQL_IS_USMALLINTのいずれかである必要があります。

StringLengthPtr
[出力]*CharacterAttributePtr で返すことができる合計バイト数 (文字データの null 終了バイトを除く) を返すバッファーへのポインター。

文字データの場合、返されるバイト数が BufferLength 以上の場合、*CharacterAttributePtr 内の記述子情報は BufferLength から null 終端文字の長さを引いた値に切り捨てられ、ドライバーによって null で終了されます。

他のすべての種類のデータでは、 BufferLength の値は無視され、ドライバーは *CharacterAttributePtr のサイズが 32 ビットであると想定しています。

NumericAttributePtr
[出力]フィールドがSQL_DESC_COLUMN_LENGTHなどの数値記述子型の場合、IRD の ColumnNumber 行の FieldIdentifier フィールドの値を返す整数バッファーへのポインター。 それ以外の場合、フィールドは使用されません。 一部のドライバーでは、下位の 32 ビットまたは 16 ビットのバッファーのみを書き込み、上位ビットを変更しない場合があることに注意してください。 そのため、アプリケーションでは、この関数を呼び出す前に値を 0 に初期化する必要があります。

戻り値

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR、またはSQL_INVALID_HANDLE。

診断

SQLColAttribute が SQL_ERROR または SQL_SUCCESS_WITH_INFO を返す場合、関連付けられている SQLSTATE 値は、SQL_HANDLE_STMTの HandleTypeStatementHandleHandle を使用して SQLGetDiagRec を呼び出すことによって取得できます。 次の表に、 SQLColAttribute によって一般的に返される SQLSTATE 値の一覧を示し、この関数のコンテキストでそれぞれについて説明します。表記 "(DM)" は、ドライバー マネージャーによって返される SQLSTATEs の説明の前にあります。 特に明記されていない限り、各 SQLSTATE 値に関連付けられている戻りコードはSQL_ERRORされます。

SQLSTATE エラー 説明
01000 一般的な警告 ドライバー固有の情報メッセージ。 (関数はSQL_SUCCESS_WITH_INFOを返します。
01004 文字列データ、右切り捨て バッファー *CharacterAttributePtr は、文字列値全体を返すには十分な大きさではなかったため、文字列値が切り捨てられました。 *StringLengthPtr では、文字列値の長さが返されます。 (関数はSQL_SUCCESS_WITH_INFOを返します。
07005 カーソル指定ではない準備済みステートメント StatementHandle に関連付けられたステートメントは結果セットを返せず、FieldIdentifier はSQL_DESC_COUNTされませんでした。 説明する列がありませんでした。
07009 記述子インデックスが無効です (DM) ColumnNumber に指定された値が 0 で、SQL_ATTR_USE_BOOKMARKS ステートメント属性がSQL_UB_OFFされました。

引数 ColumnNumber に指定された値が、結果セット内の列数を超えています。
HY000 一般的なエラー 特定の SQLSTATE がなく、実装固有の SQLSTATE が定義されていないエラーが発生しました。 診断データ構造から SQLGetDiagField によって返されるエラー メッセージは、エラーとその原因を説明します。
HY001 メモリ割り当てエラー ドライバーは、関数の実行または完了をサポートするために必要なメモリを割り当てることができませんでした。
HY008 操作が取り消されました StatementHandle に対して非同期処理が有効になりました。 関数が呼び出され、実行が完了する前に、 SQLCancel または SQLCancelHandleStatementHandle で呼び出されました。 その後、 StatementHandle で関数が再度呼び出されました。

関数が呼び出され、実行が完了する前に、マルチスレッド アプリケーション内の別のスレッドから StatementHandleSQLCancel または SQLCancelHandle が呼び出されました。
HY010 関数シーケンス エラー (DM) StatementHandle に関連付けられている接続ハンドルに対して非同期実行関数が呼び出されました。 SQLColAttribute が呼び出されたときに、この非同期関数はまだ実行されていました。

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

(DM) 関数は、 SqlPrepareSQLExecDirect、または StatementHandle のカタログ関数を呼び出す前に呼び出されました。

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

(DM) StatementHandle に対して SQLExecuteSQLExecDirectSQLBulkOperations、または SQLSetPos が呼び出され、SQL_NEED_DATA返されました。 この関数は、すべての実行時データ パラメーターまたは列に対してデータが送信される前に呼び出されました。
HY013 メモリ管理エラー メモリ不足の可能性があるため、基になるメモリ オブジェクトにアクセスできなかったため、関数呼び出しを処理できませんでした。
HY090 文字列またはバッファーの長さが無効です (DM) *CharacterAttributePtr は文字列であり、 BufferLength は 0 未満ですが、SQL_NTSと等しくありません。
HY091 記述子フィールド識別子が無効です 引数 FieldIdentifier に指定された値は、定義された値の 1 つではなく、実装で定義された値でなかった。
HY117 トランザクションの状態が不明なため、接続が中断されます。 切断と読み取り専用の関数のみが許可されます。 (DM) 中断状態の詳細については、「 SQLEndTran 関数」を参照してください。
HYC00 ドライバーに対応していません 引数 FieldIdentifier に指定された値は、ドライバーでサポートされていませんでした。
HYT01 接続のタイムアウト データ ソースが要求に応答する前に、接続タイムアウト期間の有効期限が切れています。 接続タイムアウト期間は、 SQLSetConnectAttr (SQL_ATTR_CONNECTION_TIMEOUT) によって設定されます。
IM001 ドライバーは、この関数をサポートしていません (DM) StatementHandle に関連付けられているドライバーは、 関数をサポートしていません。
IM017 非同期通知モードでポーリングが無効になっている 通知モデルが使用されるたびに、ポーリングは無効になります。
IM018 SQLCompleteAsync は、このハンドルで前の非同期操作を完了するために呼び出されていません。 ハンドルの前の関数呼び出しがSQL_STILL_EXECUTINGを返し、通知モードが有効になっている場合は、処理後に処理を実行して操作を完了するために、 SQLCompleteAsync をハンドルで呼び出す必要があります。

SQLPrepare の後と SQLExecute の前に呼び出されると、SQLColAttribute は、データ ソースが StatementHandle に関連付けられている SQL ステートメントを評価するタイミングに応じて、SQLPrepare または SQLExecute によって返される任意の SQLSTATE を返すことができます。

パフォーマンス上の理由から、アプリケーションはステートメントを実行する前に SQLColAttribute を呼び出さないでください。

説明

アプリケーションで SQLColAttribute によって返される情報の使用方法については、「結果セット メタデータ」を参照してください。

SQLColAttribute は、*NumericAttributePtr または *CharacterAttributePtr で情報を返します。 整数情報は、SQLLEN 値として *NumericAttributePtr で返されます。その他のすべての形式の情報は、*CharacterAttributePtr で返されます。 *NumericAttributePtr で情報が返されると、ドライバーは CharacterAttributePtrBufferLengthおよび StringLengthPtr を無視します。 *CharacterAttributePtr で情報が返されると、ドライバーは NumericAttributePtr を無視します

SQLColAttribute は、IRD の記述子フィールドから値を返します。 関数は、記述子ハンドルではなくステートメント ハンドルを使用して呼び出されます。 このセクションで後述する FieldIdentifier 値に対して SQLColAttribute によって返される値は、適切な IRD ハンドルを使用して SQLGetDescField を呼び出すことでも取得できます。

現在定義されている記述子フィールド、それらが導入された ODBC のバージョン、および情報が返される引数については、このセクションの後半で示します。異なるデータ ソースを利用するために、より多くの記述子の種類をドライバーによって定義できます。

ODBC 3。x ドライバーは、各記述子フィールドの値を返す必要があります。 記述子フィールドがドライバーまたはデータ ソースに適用されず、特に明記されていない限り、ドライバーは *StringLengthPtr で 0 を返すか、*CharacterAttributePtr に空の文字列を返します。

Backward Compatibility

ODBC 3。x 関数 SQLColAttribute は、非推奨の ODBC 2 を置き換えます。x 関数 SQLColAttributesSQLColAttributesSQLColAttribute にマッピングする場合 (ODBC 2 の場合)。x アプリケーションは ODBC 3 で動作しています。x ドライバー)、または SQLColAttributeSQLColAttributes にマッピングする (ODBC 3 の場合)。x アプリケーションは ODBC 2 で動作しています。x ドライバー)、ドライバー マネージャーは、FieldIdentifier の値を渡すか、新しい値にマップするか、次のようにエラーを返します。

Note

ODBC 3 の FieldIdentifier 値で使用されるプレフィックス。x は ODBC 2 で使用されているものから変更されています。x。 新しいプレフィックスは "SQL_DESC" です。古いプレフィックスは "SQL_COLUMN" でした。

  • ODBC 2 の #define 値の場合。xFieldIdentifier は、ODBC 3 の #define 値と同じです。xFieldIdentifier、関数呼び出しの値が渡されるだけです。

  • ODBC 2 の #define 値。xFieldIdentifiers SQL_COLUMN_LENGTH、SQL_COLUMN_PRECISION、SQL_COLUMN_SCALEは、ODBC 3 の #define 値とは異なります。xFieldIdentifiers SQL_DESC_PRECISION、SQL_DESC_SCALE、SQL_DESC_LENGTH。 ODBC 2。x ドライバーは ODBC 2 のみをサポートする必要があります。x 値。 ODBC 3。x ドライバーでは、これら 3 つの FieldIdentifiers の "SQL_COLUMN" と "SQL_DESC" の両方の値をサポートする必要があります。 ODBC 3 では有効桁数、小数点以下桁数、長さが異なるため、これらの値は異なります。x は ODBC 2 の場合よりも大きかった。x。 詳細については、「 列のサイズ」、「10 進数」、「オクテットの長さの転送」、および「表示サイズ」を参照してください

  • ODBC 2 の #define 値の場合。xFieldIdentifier は、ODBC 3 の #define 値とは異なります。xFieldIdentifier は、COUNT、NAME、および NULLABLE 値で発生するように、関数呼び出しの値が対応する値にマップされます。 たとえば、SQL_COLUMN_COUNTはSQL_DESC_COUNTにマップされ、マッピングの方向に応じてSQL_DESC_COUNTがSQL_COLUMN_COUNTにマップされます。

  • FieldIdentifier が ODBC 3 の新しい値である場合。x。ODBC 2 に対応する値が存在しなかった。x、 ODBC 3 の場合はマップされません。x アプリケーションは、ODBC 2 の SQLColAttribute の呼び出しでそれを使用します。x ドライバー、呼び出しは SQLSTATE HY091 (無効な記述子フィールド識別子) を返します。

次の表に、 SQLColAttribute によって返される記述子の型を示します。 NumericAttributePtr 値の型は SQLLEN * です

FieldIdentifier Information

で返される
説明
SQL_DESC_AUTO_UNIQUE_VALUE (ODBC 1.0) NumericAttributePtr 列が自動作成列の場合は、SQL_TRUEします。

列が自動作成列ではない場合、または数値でない場合にSQL_FALSEします。

このフィールドは、数値データ型の列に対してのみ有効です。 アプリケーションは、自動作成列を含む行に値を挿入できますが、通常は列の値を更新できません。

自動作成列に挿入を行うと、挿入時に一意の値が列に挿入されます。 増分は定義されていませんが、データ ソース固有です。 アプリケーションでは、autoincrement 列が特定の時点から開始されるか、特定の値だけインクリメントされると想定しないでください。
SQL_DESC_BASE_COLUMN_NAME (ODBC 3.0) CharacterAttributePtr 結果セット列のベース列名。 基本列名が存在しない場合 (式である列の場合と同様)、この変数には空の文字列が含まれます。

この情報は、IRD の SQL_DESC_BASE_COLUMN_NAME レコード フィールド (読み取り専用フィールド) から返されます。
SQL_DESC_BASE_TABLE_NAME (ODBC 3.0) CharacterAttributePtr 列を含むベース テーブルの名前。 ベース テーブル名を定義できない場合、または適用できない場合、この変数には空の文字列が含まれます。

この情報は、IRD の SQL_DESC_BASE_TABLE_NAME レコード フィールド (読み取り専用フィールド) から返されます。
SQL_DESC_CASE_SENSITIVE (ODBC 1.0) NumericAttributePtr 列が照合順序と比較で大文字と小文字が区別される場合にSQL_TRUEします。

列が照合順序と比較で大文字と小文字が区別されない場合、または非文字である場合にSQL_FALSEします。
SQL_DESC_CATALOG_NAME (ODBC 2.0) CharacterAttributePtr 列を含むテーブルのカタログ。 列が式の場合、または列がビューの一部である場合、戻り値は実装で定義されます。 データ ソースがカタログをサポートしていない場合、またはカタログ名を特定できない場合は、空の文字列が返されます。 この VARCHAR レコード・フィールドは 128 文字に制限されません。
SQL_DESC_CONCISE_TYPE (ODBC 1.0) NumericAttributePtr 簡潔なデータ型。

datetime データ型と interval データ型の場合、このフィールドは簡潔なデータ型を返します。たとえば、SQL_TYPE_TIMEやSQL_INTERVAL_YEARなどです。 (詳細については、「付録 D: データ型」の「データ型識別子と記述子 」を参照してください)。

この情報は、IRD のSQL_DESC_CONCISE_TYPEレコード・フィールドから返されます。
SQL_DESC_COUNT (ODBC 1.0) NumericAttributePtr 結果セットで使用できる列の数。 結果セットに列がない場合は、0 が返されます。 ColumnNumber 引数の値は無視されます。

この情報は、IRD の SQL_DESC_COUNT ヘッダー フィールドから返されます。
SQL_DESC_DISPLAY_SIZE (ODBC 1.0) NumericAttributePtr 列のデータを表示するために必要な最大文字数。 表示サイズの詳細については、「付録 D: データ型」の 「列サイズ、10 進数、転送オクテット長、および表示サイズ 」を参照してください。
SQL_DESC_FIXED_PREC_SCALE (ODBC 1.0) NumericAttributePtr 列の有効桁数が固定で、データ ソース固有の小数点以下桁数が 0 以外の場合にSQL_TRUEします。

列にデータ ソース固有の固定有効桁数と 0 以外の小数点以下桁数がない場合にSQL_FALSEします。
SQL_DESC_LABEL (ODBC 2.0) CharacterAttributePtr 列のラベルまたはタイトル。 たとえば、EmpName という名前の列に [従業員名] というラベルが付いているか、別名でラベル付けされている場合があります。

列にラベルがない場合は、列名が返されます。 列がラベル付けされておらず、名前が付いていない場合は、空の文字列が返されます。
SQL_DESC_LENGTH (ODBC 3.0) NumericAttributePtr 文字列またはバイナリ データ型の最大または実際の文字長である数値。 固定長データ型の最大文字長、または可変長データ型の実際の文字長です。 その値は、文字列を終了する null 終了バイトを常に除外します。

この情報は、IRD の SQL_DESC_LENGTH レコード フィールドから返されます。

長さの詳細については、「付録 D: データ型」の 「列サイズ、10 進数、転送オクテット長、および表示サイズ 」を参照してください。
SQL_DESC_LITERAL_PREFIX (ODBC 3.0) CharacterAttributePtr この VARCHAR(128) レコード フィールドには、ドライバーがこのデータ型のリテラルのプレフィックスとして認識する文字または文字が含まれています。 このフィールドには、リテラル プレフィックスが適用されないデータ型の空の文字列が含まれています。 詳細については、「 リテラル プレフィックスとサフィックス」を参照してください。
SQL_DESC_LITERAL_SUFFIX (ODBC 3.0) CharacterAttributePtr この VARCHAR(128) レコード フィールドには、ドライバーがこのデータ型のリテラルのサフィックスとして認識する文字または文字が含まれています。 このフィールドには、リテラル サフィックスが適用されないデータ型の空の文字列が含まれています。 詳細については、「 リテラル プレフィックスとサフィックス」を参照してください。
SQL_DESC_LOCAL_TYPE_NAME (ODBC 3.0) CharacterAttributePtr この VARCHAR(128) レコード フィールドには、データ型の通常の名前とは異なる可能性があるデータ型のローカライズされた (ネイティブ言語) 名が含まれています。 ローカライズされた名前がない場合は、空の文字列が返されます。 このフィールドは表示のみを目的としています。 文字列の文字セットはロケールに依存し、通常はサーバーの既定の文字セットです。
SQL_DESC_NAME (ODBC 3.0) CharacterAttributePtr 列の別名 (該当する場合)。 列の別名が適用されない場合は、列名が返されます。 どちらの場合も、SQL_DESC_UNNAMEDは SQL_NAMED に設定されます。 列名または列の別名がない場合は、空の文字列が返され、SQL_DESC_UNNAMEDがSQL_UNNAMEDに設定されます。

この情報は、IRD の SQL_DESC_NAME レコード フィールドから返されます。
SQL_DESC_NULLABLE (ODBC 3.0) NumericAttributePtr 列に NULL 値を含めることができる場合は、NULLABLE をSQL_します。列に NULL 値がない場合は、SQL_NO_NULLSします。または、列が NULL 値を受け入れるかどうかが不明な場合にSQL_NULLABLE_UNKNOWNします。

この情報は、IRD の SQL_DESC_NULLABLE レコード フィールドから返されます。
SQL_DESC_NUM_PREC_RADIX (ODBC 3.0) NumericAttributePtr SQL_DESC_TYPE フィールドのデータ型がおおよその数値データ型の場合、SQL_DESC_PRECISION フィールドにはビット数が含まれているため、この SQLINTEGER フィールドの値は 2 になります。 SQL_DESC_TYPE フィールドのデータ型が正確な数値データ型の場合、SQL_DESC_PRECISION フィールドには 10 進数の桁数が含まれているため、このフィールドの値は 10 です。 このフィールドは、数値以外のすべてのデータ型に対して 0 に設定されます。
SQL_DESC_OCTET_LENGTH (ODBC 3.0) NumericAttributePtr 文字列またはバイナリ データ型の長さ (バイト単位)。 固定長文字型またはバイナリ型の場合、これは実際の長さ (バイト単位) です。 可変長文字型またはバイナリ型の場合、これはバイト単位の最大長です。 この値には null 終端記号は含まれません。

この情報は、IRD のSQL_DESC_OCTET_LENGTHレコード・フィールドから戻されます。

長さの詳細については、「付録 D: データ型」の 「列サイズ、10 進数、転送オクテット長、および表示サイズ 」を参照してください。
SQL_DESC_PRECISION (ODBC 3.0) NumericAttributePtr 数値データ型に適用できる有効桁数を表す数値。 データ型SQL_TYPE_TIME、SQL_TYPE_TIMESTAMP、および時間間隔を表すすべての間隔データ型の場合、その値は秒の小数部のコンポーネントの適用可能な有効桁数です。

この情報は、IRD の SQL_DESC_PRECISION レコード フィールドから返されます。
SQL_DESC_SCALE (ODBC 3.0) NumericAttributePtr 数値データ型に適用できるスケールである数値。 DECIMAL および NUMERIC データ型の場合、これは定義されたスケールです。 他のすべてのデータ型では未定義です。

この情報は、IRD の SCALE レコード・フィールドから戻されます。
SQL_DESC_SCHEMA_NAME (ODBC 2.0) CharacterAttributePtr 列を含むテーブルのスキーマ。 列が式の場合、または列がビューの一部である場合、戻り値は実装定義です。 データ ソースがスキーマをサポートしていない場合、またはスキーマ名を特定できない場合は、空の文字列が返されます。 この VARCHAR レコード・フィールドは 128 文字に制限されません。
SQL_DESC_SEARCHABLE (ODBC 1.0) NumericAttributePtr 列を WHERE 句で使用できない場合は、SQL_PRED_NONEします。 (これは ODBC 2 のSQL_UNSEARCHABLE値と同じです。x.)

列を WHERE 句で使用できるが、LIKE 述語でのみ使用できるかどうかをSQL_PRED_CHARします。 (これは ODBC 2 のSQL_LIKE_ONLY値と同じです。x.)

列が LIKE を除くすべての比較演算子で WHERE 句で使用できるかどうかをSQL_PRED_BASICします。 (これは ODBC 2 のSQL_EXCEPT_LIKE値と同じです。x.)

列を WHERE 句で任意の比較演算子と共に使用できるかどうかをSQL_PRED_SEARCHABLEします。

SQL_LONGVARCHAR型とSQL_LONGVARBINARY型の列は、通常、SQL_PRED_CHARを返します。
SQL_DESC_TABLE_NAME (ODBC 2.0) CharacterAttributePtr 列を含むテーブルの名前です。 列が式の場合、または列がビューの一部である場合、戻り値は実装定義です。

テーブル名を特定できない場合は、空の文字列が返されます。
SQL_DESC_TYPE (ODBC 3.0) NumericAttributePtr SQL データ型を指定する数値。

ColumnNumber が 0 の場合、可変長ブックマークのSQL_BINARYが返され、固定長ブックマークのSQL_INTEGERが返されます。

datetime データ型と interval データ型の場合、このフィールドは詳細データ型 (SQL_DATETIME または SQL_INTERVAL) を返します。 (詳細については、「付録 D: データ型」の「データ型識別子と記述子 」を参照してください。

この情報は、IRD の SQL_DESC_TYPE レコード フィールドから返されます。 メモ: ODBC 2 に対して動作するため。x ドライバーでは、代わりに SQL_DESC_CONCISE_TYPE を使用してください。
SQL_DESC_TYPE_NAME (ODBC 1.0) CharacterAttributePtr データ ソースに依存するデータ型名。たとえば、"CHAR"、"VARCHAR"、"MONEY"、"LONG VARBINARY"、"CHAR ( ) FOR BIT DATA" などです。

型が不明な場合は、空の文字列が返されます。
SQL_DESC_UNNAMED (ODBC 3.0) NumericAttributePtr SQL_NAMEDまたはSQL_UNNAMED。 IRD のSQL_DESC_NAME フィールドに列の別名または列名が含まれている場合は、SQL_NAMEDが返されます。 列名または列の別名がない場合は、SQL_UNNAMEDが返されます。

この情報は、IRD のSQL_DESC_UNNAMEDレコード・フィールドから戻されます。
SQL_DESC_UNSIGNED (ODBC 1.0) NumericAttributePtr 列が符号なし (または数値ではない) の場合にSQL_TRUEします。

列が署名されているかどうかをSQL_FALSEします。
SQL_DESC_UPDATABLE (ODBC 1.0) NumericAttributePtr 列は、定義された定数の値によって記述されます。

SQL_ATTR_READONLY SQL_ATTR_WRITE SQL_ATTR_READWRITE_UNKNOWN

SQL_DESC_UPDATABLEでは、ベース テーブル内の列ではなく、結果セット内の列の更新可能性について説明します。 結果セット列の基になるベース列の更新可能性は、このフィールドの値と異なる場合があります。 列が更新可能かどうかは、データ型、ユーザー特権、および結果セット自体の定義に基づいて行うことができます。 列が更新可能かどうかが不明な場合は、SQL_ATTR_READWRITE_UNKNOWNを返す必要があります。

SQLColAttribute は、 SQLDescribeCol の拡張可能な代替手段です。 SQLDescribeCol は 、ANSI-89 SQL に基づいて固定された記述子情報のセットを返します。 SQLColAttribute を使用すると、ANSI SQL-92 および DBMS ベンダー拡張機能で利用できる、より広範な記述子情報にアクセスできます。

対象 解決方法については、
結果セット内の列へのバッファーのバインド SQLBindCol 関数
ステートメント処理の取り消し SQLCancel 関数
結果セット内の列に関する情報を返す SQLDescribeCol 関数
データブロックのフェッチまたは結果セットのスクロール SQLFetchScroll 関数
複数行のデータをフェッチする SQLFetch 関数

次のサンプル コードでは、ハンドルと接続は解放されません。 ハンドルとステートメントを解放するコード サンプルについては、「 SQLFreeHandle 関数」、「 サンプル ODBC プログラム」、「 SQLFreeStmt 関数 」を参照してください。

// 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);  
}  

参照

ODBC API リファレンス
ODBC ヘッダー ファイル
ODBC のサンプル プログラム