適合 性
導入されたバージョン: ODBC 1.0 標準コンプライアンス: ISO 92
Summary
SQLDescribeCol は結果セット内の1列に対して、列名、型、列サイズ、小数点数、nullabilityなどの記述子を返します。 この情報はIRDの分野でも利用可能です。
構文
SQLRETURN SQLDescribeCol(
SQLHSTMT StatementHandle,
SQLUSMALLINT ColumnNumber,
SQLCHAR * ColumnName,
SQLSMALLINT BufferLength,
SQLSMALLINT * NameLengthPtr,
SQLSMALLINT * DataTypePtr,
SQLULEN * ColumnSizePtr,
SQLSMALLINT * DecimalDigitsPtr,
SQLSMALLINT * NullablePtr);
引数
StatementHandle
[入力]ステートメント ハンドル。
列番号
[入力]結果データの列数は、列順に順番に並び、1から始まる。
ColumnNumberの引数は、ブックマークの列を表すために0に設定することもできます。
ColumnName
[出力]列名を返すためのnull終端バッファへのポインタ。 この値はIRDのSQL_DESC_NAMEフィールドから読み取られます。 列名が未定か、列名が判定できない場合、ドライバーは空の文字列を返します。
ColumnNameがNULLの場合、NameLengthPtr はColumnNameが指すバッファ内で返せる文字数(文字データのnull終端文字を除く)を返します。
BufferLength
[入力]*ColumnName バッファの長さ(文字数)。
NameLengthPtr
[出力]*ColumnNameで返せる文字数(null終端を除く)を返すバッファへのポインタ。 返せる文字数が BufferLength以上の場合、*ColumnName の列名は BufferLength からnull終端文字の長さを引いたものに切り詰められます。
DataTypePtr
[出力]カラムのSQLデータ型を返すためのバッファへのポインタ。 この値はIRDのSQL_DESC_CONCISE_TYPEフィールドから読み取られます。 これは SQLデータ型、またはドライバー固有のSQLデータ型のいずれかの値となります。 データ型が判別できない場合、ドライバーはSQL_UNKNOWN_TYPEを返します。
ODBC 3で。x、SQL_TYPE_DATE、SQL_TYPE_TIME、SQL_TYPE_TIMESTAMPは、それぞれ日付、時刻、またはタイムスタンプデータとして *DataTypePtr で返されます。ODBC 2に属しています。x、SQL_DATE、SQL_TIME、またはSQL_TIMESTAMPが返されます。 ドライバー マネージャーは、ODBC 2. 時に必要なマッピングを実行しますx アプリケーションが ODBC 3. で動作していますx ドライバーまたは ODBC 3.x アプリケーションは ODBC 2. で動作していますx ドライバー。
ColumnNumber が 0 (ブックマーク列の場合) に等しい場合、可変長ブックマークの*DataTypePtr でSQL_BINARYが返されます。 (ブックマークが ODBC 3. で使用されている場合、SQL_INTEGERが返されます。x ODBC 2. を使用するアプリケーションx ドライバーまたは ODBC 2.x ODBC 3. を使用するアプリケーションx ドライバー)。)
これらのデータ型の詳細については、付録Dの SQLデータ型 をご覧ください。 ドライバー固有の SQL データ型の詳細については、ドライバーのドキュメントを参照してください。
カラムサイズPtr
[出力]データソース上の列のサイズ(文字数)を返すためのバッファへのポインタ。 列サイズが判別できない場合、ドライバーは0を返します。 列サイズの詳細については、「付録 D: データ型」の「 列サイズ、10 進数、転送オクテット長、および表示サイズ を参照してください。
DecimalDigitsPtr
[出力]データソース上の列の小数点数を返すためのバッファへのポインタを表示します。 小数点の数が判別できない場合、または該当しない場合は、ドライバーは0を返します。 小数点数字の詳細については、付録Dのデータ型の「 列サイズ、小数点数字、転送オクテット長、表示サイズ 」をご覧ください。
NullablePtr
[出力]バッファへのポインタは、その列がNULL値を許容しているかどうかを示す値を返します。 この値はIRDのSQL_DESC_NULLABLEフィールドから読み取られます。 値は、次のいずれかになります。
SQL_NO_NULLS: この列はNULL値を許可していません。
SQL_NULLABLE:この列はNULLの値を許容します。
SQL_NULLABLE_UNKNOWN:ドライバーはその列がNULL値を許容しているかどうかを判断できません。
返品
SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR、またはSQL_INVALID_HANDLE。
Diagnostics
SQLDescribeColがSQL_ERRORまたはSQL_SUCCESS_WITH_INFOを返す場合、SQLGetDiagRecを呼び出してHandleTypeをSQL_HANDLE_STMT、HandleをStatementHandleで呼び出すことで、関連するSQLSTATE値を取得できます。 以下の表は 、SQLDescribeCol が一般的に返すSQLSTATEの値と、それぞれをこの関数の文脈で説明しています。「(DM)」という表記は、ドライバーマネージャーが返すSQLstateの記述の前に記載されます。 特に明記されていない限り、各 SQLSTATE 値に関連付けられている戻りコードはSQL_ERROR。
| SQLSTATE | エラー | Description |
|---|---|---|
| 01000 | 一般的な警告 | ドライバー固有の情報メッセージ。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
| 01004 | 文字列データ、右切り捨て | バッファ*ColumnName は列名全体を返すには大きさが足りなかったため、列名が切り詰められました。 切り詰められていない列名の長さは *NameLengthPtr. に返されます。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
| 07005 | カーソル仕様ではなく準備文 | StatementHandleに関連付けられた文は結果セットを返しませんでした。 記述する柱はありませんでした。 |
| 07009 | 無効な記述子インデックス | (DM) ColumnNumber という引数の値が0で、SQL_ATTR_USE_BOOKMARKS文オプションはSQL_UB_OFFでした。 ColumnNumberという引数に指定された値は、結果セット内の列数より大きくなりました。 |
| 08S01 | 通信リンクエラー | ドライバーとドライバーが接続されたデータ ソース間の通信リンクは、関数の処理が完了する前に失敗しました。 |
| HY000 | 一般的なエラー | 特定の SQLSTATE がなく、実装固有の SQLSTATE が定義されていないエラーが発生しました。 *MessageText バッファー内の SQLGetDiagRec によって返されるエラー メッセージには、エラーとその原因が記述されています。 |
| HY001 | メモリ割り当ての失敗 | ドライバーは、関数の実行または完了をサポートするために必要なメモリを割り当てませんでした。 |
| HY008 | 操作が取り消されました |
StatementHandle に対して非同期処理が有効になりました。 関数が呼び出され、実行が完了する前に、 SQLCancel または SQLCancelHandle が StatementHandle で呼び出されました。 その後、 StatementHandle で関数が再度呼び出されました。 関数が呼び出され、実行が完了する前に、 SQLCancel または SQLCancelHandle がマルチスレッド アプリケーション内の別のスレッドから StatementHandle で呼び出されました。 |
| HY010 | 関数シーケンス エラー | (DM) StatementHandle に関連付けられている接続ハンドルに対して非同期実行関数が呼び出されました。 この非同期関数は SQLDescribeCol が呼び出された時点でもまだ実行中でした。 (DM) SQLExecute、 SQLExecDirect、または SQLMoreResultsStatementHandle が呼び出され、SQL_PARAM_DATA_AVAILABLEが返されました。 この関数は、すべてのストリーミング パラメーターのデータが取得される前に呼び出されました。 (DM) 非同期実行関数 (この関数ではない) が StatementHandle に対して呼び出されこの関数が呼び出されたときにはまだ実行されていました。 (DM) 関数はSQLPrepare、 SQLExecute、または文ハンドル上のカタログ関数を呼び出す前に呼び出しられました。 (DM) SQLExecute、 SQLExecDirect、 SQLBulkOperations、または SQLSetPos が StatementHandle に対して呼び出され、SQL_NEED_DATAが返されました。 この関数は、すべての実行時データ パラメーターまたは列に対してデータが送信される前に呼び出されました。 |
| HY013 | メモリ管理エラー | メモリが不足している可能性があるため、基になるメモリ オブジェクトにアクセスできなかったため、関数呼び出しを処理できませんでした。 |
| HY090 | 文字列またはバッファーの長さが無効です | (DM) 引数 BufferLength に指定された値が 0 未満でした。 |
| HY117 | 不明なトランザクション状態のため、接続が中断されます。 切断関数と読み取り専用関数のみが許可されます。 | (DM) 中断状態の詳細については、「 SQLEndTran 関数を参照してください。 |
| HYT01 | 接続がタイムアウトしました | データ ソースが要求に応答する前に、接続タイムアウト期間の有効期限が切れています。 接続タイムアウト期間は、SQL_ATTR_CONNECTION_TIMEOUT SQLSetConnectAttr によって設定されます。 |
| IM001 | ドライバーは、この関数をサポートしていません | (DM) StatementHandle に関連付けられているドライバーは、関数をサポートしていません。 |
| IM017 | 非同期通知モードでポーリングが無効になっている | 通知モデルが使用されるたびに、ポーリングは無効になります。 |
| IM018 | SQLCompleteAsync は、このハンドルに対する前の非同期操作を完了するために呼び出されていません。 | ハンドルに対する前の関数呼び出しがSQL_STILL_EXECUTINGを返し、通知モードが有効になっている場合は、後処理を実行して操作を完了するために、 SQLCompleteAsync をハンドルで呼び出す必要があります。 |
SQLDescribeColは、データソースが文ハンドルに関連付けられたSQL文を評価するタイミングに応じて、SQLPrepareまたはSQLExecuteが呼び出す際に、SQLPrepareまたはSQLExecuteが返す任意のSQLSTATEを返すことができます。
パフォーマンスの理由から、アプリケーションは文を実行する前に SQLDescribeCol を呼び出すべきではありません。
Comments
アプリケーションは通常、SQLPrepareへの呼び出しの後、SQLExecuteへの呼びかけの前後にSQLDescribeColを呼び出します。 アプリケーションはSQLExecDirectへの呼び出し後にSQLDescribeColを呼び出すこともできます。 詳細については、「メタデータの結果セット」を参照してください。
SQLDescribeCol は SELECT 文によって生成される列名、型、長さを取得します。 列が式の場合、*ColumnName は空文字列かドライバー定義の名前のいずれかです。
Note
ODBCは拡張機能としてSQL_NULLABLE_UNKNOWNをサポートしていますが、Open GroupおよびSQL Access GroupのCall Level Interface仕様では SQLDescribeColのオプションは明記されていません。
関連関数
| ~についての情報 | 参照先 |
|---|---|
| 結果セット内の列へのバッファーのバインド | SQLBindCol |
| ステートメント処理の取り消し | SQLCancel |
| 結果セット内の列に関する情報を返す | SQLColAttribute |
| 複数行のデータをフェッチする | SQLFetch |
| 結果セットの列数を返す | SQLNumResultCols |
| 実行のためのステートメントの準備 | Sqlprepare |