SQLColAttribute 関数

準拠
導入されたバージョン: ODBC 3.0 標準コンプライアンス: 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 の場合、StringLengthPtr は引き続き、CharacterAttributePtr が指すバッファーで返すことができる合計バイト数 (文字データの null 終端文字を除く) を返します。

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

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

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

  • CharacterAttributePtr がバイナリ バッファーへのポインターである場合、アプリケーションは SQL_LEN_BINARY_ATTR(length) マクロの結果を BufferLength に配置します。 これにより、 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 値を取得するには、HandleType SQL_HANDLE_STMT のSQLGetDiagRec を呼び出し、Handle StatementHandle を指定します。 次の表に、 SQLColAttribute によって一般的に返される SQLSTATE 値の一覧を示し、この関数のコンテキストでそれぞれについて説明します。表記 "(DM)" は、ドライバー マネージャーによって返される SQLSTATEs の説明の前にあります。 特に明記されていない限り、各 SQLSTATE 値に関連付けられている戻りコードはSQL_ERROR。

SQLSTATE エラー 説明
01000 一般的な警告 ドライバー固有の情報メッセージ。 (関数はSQL_SUCCESS_WITH_INFOを返します。
01004 文字列データ、右切り捨て バッファー *CharacterAttributePtr が文字列値全体を返すのに十分な大きさではなかったため、文字列値が切り捨てられました。 *StringLengthPtr で、文字列の長さが返されます。 (関数はSQL_SUCCESS_WITH_INFOを返します。
07005 prepared ステートメントが cursor-specification ではない 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 で関数が再度呼び出されました。

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

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

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

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

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

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

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

Comments

アプリケーションが SQLColAttributeによって返される情報をどのように使用するかについては、「 Result Set Metadata」を参照してください。

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

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

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

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

旧バージョンとの互換性

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値x FieldIdentifier は ODBC 3.#define値と同じですx FieldIdentifier 関数呼び出しの値が渡されるだけです。

  • ODBC 2.#define値x FieldIdentifiers SQL_COLUMN_LENGTH、SQL_COLUMN_PRECISION、およびSQL_COLUMN_SCALEは ODBC 3.#define値とは異なりますx FieldIdentifiers 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値x FieldIdentifier は ODBC 3.#define値とは異なりますx FieldIdentifier 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 情報

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

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

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

自動作成列に挿入を行うと、挿入時に一意の値が列に挿入されます。 増分は定義されていませんが、データ ソース固有です。 アプリケーションでは、自動作成列が特定の時点から開始するか、特定の値だけインクリメントされることを想定しないでください。
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: データ型」の「 Column Size、Decimal Digits、Transfer Octet Length、および Display Size を参照してください。
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: データ型」の「 Column Size、Decimal Digits、Transfer Octet Length、および Display Size を参照してください。
SQL_DESC_LITERAL_PREFIX (ODBC 3.0) CharacterAttributePtr この VARCHAR(128) レコード フィールドには、ドライバーがこのデータ型のリテラルのプレフィックスとして認識する文字が含まれています。 このフィールドには、リテラル プレフィックスが適用できないデータ型の空の文字列が含まれています。 詳細については、「 Literal プレフィックスとサフィックスを参照してください。
SQL_DESC_LITERAL_SUFFIX (ODBC 3.0) CharacterAttributePtr この VARCHAR(128) レコード フィールドには、ドライバーがこのデータ型のリテラルのサフィックスとして認識する文字が含まれています。 このフィールドには、リテラル サフィックスが適用されないデータ型の空の文字列が含まれています。 詳細については、「 Literal プレフィックスとサフィックスを参照してください。
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: データ型」の「 Column Size、Decimal Digits、Transfer Octet Length、および Display Size を参照してください。
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 関数Sample ODBC Program、および 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 のサンプル プログラム