SQLSetDescField 関数

適合 性
導入バージョン:ODBC 3.0 規格準拠:ISO 92

まとめ
SQLSetDescField は、記述子レコードの単一のフィールドの値を設定します。

Syntax

SQLRETURN SQLSetDescField(  
     SQLHDESC      DescriptorHandle,  
     SQLSMALLINT   RecNumber,  
     SQLSMALLINT   FieldIdentifier,  
     SQLPOINTER    ValuePtr,  
     SQLINTEGER    BufferLength);  

引数

DescriptorHandle
[入力]ディスクリプターハンドル。

RecNumber
[入力]アプリケーションが設定しようとするフィールドを含むディスクリプタレコードを示します。 ディスクリプタレコードは0から番号付けされ、レコード番号0がブックマークレコードです。 RecNumberの引数はヘッダーフィールドでは無視されます。

FieldIdentifier
[入力]設定すべき記述子のフィールドを示します。 詳細については、「コメント」セクションの「フィールド識別子 引数」をご覧ください。

ValuePtr
[入力]記述子情報を含むバッファ、または整数値へのポインタ。 データ型は FieldIdentifierの値に依存します。 ValuePtrが整数の数値である場合、FieldIdentifier引数の値に応じて8バイト(SQLLEN)、4バイト(SQLINTEGER)、または2バイト(SQLSMALLINT)とみなすことができます。

BufferLength
[入力] FieldIdentifier がODBCで定義されたフィールドで、 ValuePtr が文字文字列またはバイナリバッファを指す場合、この引数は *ValuePtr の長さであるべきです。 文字文字列データの場合、この引数は文字列内のバイト数を含ませるべきです。

FieldIdentifierがODBCで定義されたフィールドで、ValuePtr が整数の場合、BufferLengthは無視されます。

FieldIdentifierがドライバー定義フィールドの場合、アプリケーションはBufferLength引数を設定してドライバーマネージャーにフィールドの性質を示します。 BufferLength は以下の値を持つことができます:

  • もし ValuePtr が文字文字列へのポインタであれば、 BufferLength はその文字列またはSQL_NTSの長さです。

  • もし ValuePtr がバイナリバッファへのポインタであれば、アプリケーションはSQL_LEN_BINARY_ATTR(length)マクロの結果を BufferLengthに配置します。 これにより BufferLengthに負の値が割り当てられます。

  • もし ValuePtr が文字文字列やバイナリ文字列以外の値へのポインタであれば、 BufferLength には値SQL_IS_POINTERが必要です。

  • ValuePtrが固定長の値を持つ場合、BufferLengthはSQL_IS_INTEGER、SQL_IS_UINTEGER、SQL_IS_SMALLINT、またはSQL_IS_USMALLINTのいずれかです。

返品

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR、またはSQL_INVALID_HANDLE。

Diagnostics

SQLSetDescFieldがSQL_ERRORまたはSQL_SUCCESS_WITH_INFOを返す場合、SQLGetDiagRecを呼び出し、HandleTypeをSQL_HANDLE_DESC、HandleDescriptorHandleとして呼び出すことで、関連するSQLSTATE値を取得できます。 以下の表は 、SQLSetDescField が一般的に返すSQLSTATEの値を一覧にし、それぞれをこの関数の文脈で説明しています。「(DM)」という表記は、ドライバーマネージャーが返すSQLstateの記述の前に記載されます。 特に明記されていない限り、各 SQLSTATE 値に関連付けられている戻りコードはSQL_ERROR。

SQLSTATE エラー Description
01000 一般的な警告 ドライバー固有の情報メッセージ。 (関数はSQL_SUCCESS_WITH_INFOを返します。
01S02 オプション値の変更 ドライバーは、ValuePtrがポインタであれば*ValuePtrで指定された値、整数値の場合はValuePtrの値をサポートせず、または実装上の動作条件のために*ValuePtr が無効だったため、ドライバーは類似の値を代替しました。 (関数はSQL_SUCCESS_WITH_INFOを返します。
07009 無効な記述子インデックス FieldIdentifierの引数はレコードフィールド、RecNumberの引数は0、DescriptorHandleの引数はIPDハンドルを参照していました。

RecNumberの引数は0未満で、DescriptorHandleの引数はARDまたはAPDを指していました。

RecNumberの引数はデータソースがサポートできる最大列数やパラメータ数を超えており、DescriptorHandle引数はAPDまたはARDを参照していました。

(DM) FieldIdentifier の引数はSQL_DESC_COUNTし、 *ValuePtr 引数は 0 未満でした。

RecNumberの引数は0に等しく、DescriptorHandleの引数は暗黙的に割り当てられたAPDを参照していました。 (このエラーは、明示的に割り当てられたアプリケーションディスクリプタでは発生しません。なぜなら、明示的に割り当てられたアプリケーションディスクリプタが実行時までAPDかARDかが分からないからです。)
08S01 通信リンクエラー ドライバーとドライバーが接続されたデータ ソース間の通信リンクは、関数の処理が完了する前に失敗しました。
22001 文字列データ、右切り捨て FieldIdentifierの引数はSQL_DESC_NAME、BufferLengthの引数はSQL_MAX_IDENTIFIER_LENより大きい値でした。
HY000 一般的なエラー 特定の SQLSTATE がなく、実装固有の SQLSTATE が定義されていないエラーが発生しました。 *MessageText バッファー内の SQLGetDiagRec によって返されるエラー メッセージには、エラーとその原因が記述されています。
HY001 メモリ割り当てエラー ドライバーは、関数の実行または完了をサポートするために必要なメモリを割り当てませんでした。
HY010 関数シーケンス エラー (DM) DescriptorHandle は、非同期実行関数(この関数ではありません)が呼び出しられ、その関数が呼び出された間も実行中だった StatementHandle に関連付けられていました。

(DM) SQLExecuteSQLExecDirectSQLBulkOperations、またはSQLSetPosがDescriptorHandleに関連付けられたStatementHandleを呼び出し、返SQL_NEED_DATA。 この関数は、すべての実行時データ パラメーターまたは列に対してデータが送信される前に呼び出されました。

(DM) DescriptorHandleに関連付けられた接続ハンドルに対して非同期実行関数が呼び出されました。 この非同期関数は SQLSetDescField 関数が呼び出された時点でまだ実行中でした。

(DM) SQLExecuteSQLExecDirect、または SQLMoreResultsDescriptorHandle に関連付けられた文ハンドルのいずれかを呼び出し、返SQL_PARAM_DATA_AVAILABLE。 この関数は、すべてのストリーミング パラメーターのデータが取得される前に呼び出されました。
HY013 メモリ管理エラー メモリが不足している可能性があるため、基になるメモリ オブジェクトにアクセスできなかったため、関数呼び出しを処理できませんでした。
HY016 実装行ディスクリプタを変更できません DescriptorHandleの引数はIRDに関連付けられており、FieldIdentifierの引数はSQL_DESC_ARRAY_STATUS_PTRやSQL_DESC_ROWS_PROCESSED_PTRではありませんでした。
HY021 記述子情報の不整合 SQL_DESC_TYPEフィールドとSQL_DESC_DATETIME_INTERVAL_CODEフィールドは有効なODBC SQL型、IPD用のドライバー固有のSQL型、APDやARD用の有効なODBC C型を形成しません。

一貫性チェックで確認されたディスクリプタ情報は一貫性がありませんでした。 ( SQLSetDescRecの「一貫性チェック」を参照してください。)
HY090 文字列またはバッファーの長さが無効です (DM) *ValuePtr は文字文字列であり、 BufferLength はゼロ未満でしたがSQL_NTSに等しくはありませんでした。

(DM) ドライバーはODBC 2*.x*ドライバで、ディスクリプタはARDで、 ColumnNumber の引数は0に設定されており、 BufferLength の値が4に等しくなかった。
HY091 無効なディスクリプタフィールド識別子 FieldIdentifier引数に指定された値は、ODBCで定義されたフィールドでも実装で定義された値でもありません。

FieldIdentifierの引数はDescriptorHandle引数に対して無効でした。

FieldIdentifierの引数は読み取り専用のODBC定義フィールドでした。
HY092 無効な属性/オプション識別子 *ValuePtrの値はFieldIdentifierの引数には有効ではありませんでした。

FieldIdentifierの引数はSQL_DESC_UNNAMED、ValuePtrはSQL_NAMEDでした。
HY105 パラメーターの型が無効です (DM) SQL_DESC_PARAMETER_TYPEフィールドに指定された値が無効でした。 (詳細はSQLBindParameterの「InputOutputType Argument」セクションを参照してください。)
HY117 不明なトランザクション状態のため、接続が中断されます。 切断関数と読み取り専用関数のみが許可されます。 (DM)停止状態に関する詳細は「 ODBC 3.8の最新情報」をご覧ください。
HYT01 接続がタイムアウトしました データ ソースが要求に応答する前に、接続タイムアウト期間の有効期限が切れています。 接続タイムアウト期間は、SQL_ATTR_CONNECTION_TIMEOUT SQLSetConnectAttr によって設定されます。
IM001 ドライバーは、この関数をサポートしていません (DM) DescriptorHandle に関連付けられたドライバーは、その関数をサポートしていません。

Comments

アプリケーションは SQLSetDescField を呼び出して、任意のディスクリプタフィールドを1つずつ設定できます。 SQLSetDescFieldへの1回の呼び出しで、単一のディスクリプタに単一のフィールドを設定します。 この関数は、フィールドが設定可能であれば、任意のディスクリプタ型の任意のフィールドを設定するために呼び出すことができます。 (この節の後半の表を参照してください。)

Note

SQLSetDescFieldへの呼び出しが失敗すると、RecNumber引数で識別されたディスクリプタレコードの内容は定義されていません。

他の関数は、関数の呼び出しで複数のディスクリプタフィールドを設定することができます。 SQLSetDescRec関数は、データ型に影響を与えるさまざまなフィールドを設定し、列やパラメータに割り当てられたバッファ(SQL_DESC_TYPE、SQL_DESC_DATETIME_INTERVAL_CODE、SQL_DESC_OCTET_LENGTH、SQL_DESC_PRECISION、SQL_DESC_SCALE、SQL_DESC_DATA_PTR、SQL_DESC_OCTET_LENGTH_PTR、SQL_DESC_INDICATOR_PTRフィールド)を設定します。 SQLBindCol または SQLBindParameter は、カラムやパラメータのバインディングに関する完全な仕様を作成するために使用できます。 これらの関数は、1つの関数呼び出しで特定の記述子フィールド群を設定します。

SQLSetDescField は、バインディングポインタにオフセット(SQL_DESC_DATA_PTR、SQL_DESC_INDICATOR_PTR、またはSQL_DESC_OCTET_LENGTH_PTR)を追加することでバインディングバッファを変更することができます。 これにより 、SQLBindColSQLBindParameterを呼び出さずにバインディングバッファを変更し、アプリケーションはSQL_DESC_DATA_PTR SQL_DESC_DATA_TYPEなど他のフィールドを変更せずにバインディングバッファを変更できます。

アプリケーションが SQLSetDescField を呼び出して、SQL_DESC_COUNT以外のフィールドやディファードフィールドSQL_DESC_DATA_PTR、SQL_DESC_OCTET_LENGTH_PTR、SQL_DESC_INDICATOR_PTR以外のフィールドを設定すると、そのレコードはバウンド解除されます。

ディスクリプタヘッダーフィールドは、適切なFieldIdentifierSQLSetDescFieldを呼び出して設定します。 多くのヘッダーフィールドは文属性でもあるため、 SQLSetStmtAttrの呼び出しで設定することも可能です。 これにより、アプリケーションはディスクリプタハンドルを取得せずにディスクリプタフィールドを設定できます。 ヘッダーフィールドを設定するために SQLSetDescField を呼び出すと、 RecNumber の引数は無視されます。

ブックマークフィールドを設定するには RecNumber が0です。

Note

SQLSetDescFieldを呼び出してブックマークフィールドを設定する前に、文属性SQL_ATTR_USE_BOOKMARKS必ず設定してください。 これは必須ではありませんが、強く推奨されます。

設定ディスクリプタフィールドの列

SQLSetDescFieldを呼び出してディスクリプタフィールドを設定する場合、アプリケーションは特定の順序に従う必要があります:

  1. アプリケーションはまずSQL_DESC_TYPE、SQL_DESC_CONCISE_TYPE、またはSQL_DESC_DATETIME_INTERVAL_CODEフィールドを設定しなければなりません。

  2. これらのフィールドのいずれかが設定されると、アプリケーションはデータ型の属性を設定でき、ドライバーはデータ型のデフォルト値にデータ型属性フィールドを設定します。 タイプ属性フィールドの自動デフォルト化により、アプリケーションがデータ型を指定した後にディスクリプタが常に使用可能であることを保証します。 アプリケーションが明示的にデータ型属性を設定する場合、デフォルト属性を上書きしています。

  3. ステップ1でリストされたフィールドのいずれかが設定され、データ型属性も設定された後、アプリケーションはSQL_DESC_DATA_PTRを設定できます。 これによりディスクリプタフィールドの整合性チェックが行われます。 アプリケーションがSQL_DESC_DATA_PTRフィールドを設定した後にデータ型や属性を変更すると、ドライバはSQL_DESC_DATA_PTRをヌルポインタに設定し、レコードのバインドを解除します。 これにより、ディスクリプタレコードが使用可能になる前に、アプリケーションは適切な手順を順番に完了することを強制します。

記述子フィールドの初期化

ディスクリプタが割り当てられると、そのディスクリプタ内のフィールドはデフォルト値で初期化することも、デフォルト値なしで初期化することも、またはディスクリプタの種類に対して非定義にすることができます。 以下の表は、各ディスクリプタの種類ごとにフィールドの初期化を示しており、「D」はデフォルトで初期化されていること、「ND」はデフォルトなしで初期化されていることを示します。 数字が表示された場合、フィールドのデフォルト値はその数字となります。 また、表はフィールドが読み書き(R/W)か読み取り専用(R)かも示します。

IRDのフィールドは、ステートメントの処理や記述子が割り当てられた後にのみデフォルト値を持ち、ステートメントハンドルやディスクリプタが割り当てられた時にはデフォルト値がありません。 IRDが入力されるまでは、IRDのフィールドにアクセスしようとする試みはエラーを返します。

一部のディスクリプタフィールドは、ARDやIRD、APDとIPDなど、1つ以上の記述子タイプに対して定義されていますが、すべてに対して定義されています。 ある種類のディスクリプタに対してフィールドが未定義の場合、そのディスクリプタを使用する関数は不要です。

SQLGetDescFieldでアクセス可能なフィールドは、必ずしもSQLSetDescFieldで設定できるわけではありません。 SQLSetDescFieldで設定可能なフィールドは以下の表に記載されています。

ヘッダーフィールドの初期化は以下の表に示されています。

ヘッダーフィールド名 タイプ R/W Default
SQL_DESC_ALLOC_TYPE SQLSMALLINT ARD: R APD: R IRD: R IPD: R ARD:暗黙SQL_DESC_ALLOC_AUTO、明示SQL_DESC_ALLOC_USER

APD:暗黙のものSQL_DESC_ALLOC_AUTO、明示的なものSQL_DESC_ALLOC_USER

IRD:SQL_DESC_ALLOC_AUTO

IPD:SQL_DESC_ALLOC_AUTO
SQL_DESC_ARRAY_SIZE SQLULEN ARD: R/W APD: R/W IRD: 未使用IPD: 未使用。 ARD:[1] APD:[1] IRD:未使用IPD:未使用
SQL_DESC_ARRAY_STATUS_PTR SQLUSMALLINT* ARD: R/W APD: R/W IRD: R/W IPD: R/W ARD: null ptr APD: null ptr IRD: null ptr IPD: null ptr
SQL_DESC_BIND_OFFSET_PTR SQLLEN* ARD: R/W APD: R/W IRD: 未使用IPD: 未使用。 ARD: null ptr APD: null ptr IRD: 未使用IPD: 未使用。
SQL_DESC_BIND_TYPE SQLINTEGER ARD: R/W APD: R/W IRD: 未使用IPD: 未使用。 アード:SQL_BIND_BY_COLUMN

APD:SQL_BIND_BY_COLUMN

IRD:未使用です

IPD:未使用
SQL_DESC_COUNT SQLSMALLINT ARD: R/W APD: R/W IRD: R IPD: R/W 急性呼吸症:0 APD:0 IRD:D IPD:0
SQL_DESC_ROWS_PROCESSED_PTR SQLULEN* ARD: 未使用APD: 未使用IRD: R/W IPD: R/W ARD: 未使用APD: 未使用IRD: null ptr IPD: null ptr

[1] これらのフィールドは、ドライバーがIPDを自動的に入力した場合にのみ定義されます。 そうでない場合は未定義です。 アプリケーションがこれらのフィールドを設定しようとすると、SQLSTATE HY091(無効なディスクリプタフィールド識別子)が返されます。

レコードフィールドの初期化は以下の表に示されています。

記録フィールド名 タイプ R/W Default
SQL_DESC_AUTO_UNIQUE_VALUE SQLINTEGER ARD: 未使用APD: 未使用 IRD: R IPD: 未使用 ARD: 未使用APD: 未使用 IRD: D IPD: 未使用
SQL_DESC_BASE_COLUMN_NAME SQLCHAR * ARD: 未使用APD: 未使用 IRD: R IPD: 未使用 ARD: 未使用APD: 未使用 IRD: D IPD: 未使用
SQL_DESC_BASE_TABLE_NAME SQLCHAR * ARD: 未使用APD: 未使用 IRD: R IPD: 未使用 ARD: 未使用APD: 未使用 IRD: D IPD: 未使用
SQL_DESC_CASE_SENSITIVE SQLINTEGER ARD: 未使用APD: 未使用 IRD: R IPD: R ARD: 未使用APD: 未使用 IRD: D IPD: D[1]
SQL_DESC_CATALOG_NAME SQLCHAR * ARD: 未使用APD: 未使用 IRD: R IPD: 未使用 ARD: 未使用APD: 未使用 IRD: D IPD: 未使用
SQL_DESC_CONCISE_TYPE SQLSMALLINT ARD: R/W APD: R/W IRD: R IPD: R/W ARD: SQL_C_ DEFAULT APD: SQL_C_ DEFAULT IRD: D IPD: ND
SQL_DESC_DATA_PTR SQLPOINTER ARD: R/W APD: R/W IRD: 未使用IPD: 未使用。 ARD: null ptr APD: null ptr IRD: 未使用IPD: 未使用[2]
SQL_DESC_日付時刻間隔コード SQLSMALLINT ARD: R/W APD: R/W IRD: R IPD: R/W ARD: ND, APD: ND, IRD: D, IPD: ND
SQL_DESC_DATETIME_INTERVAL_PRECISION SQLINTEGER ARD: R/W APD: R/W IRD: R IPD: R/W ARD: ND, APD: ND, IRD: D, IPD: ND
SQL_DESC_DISPLAY_SIZE SQLLEN ARD: 未使用APD: 未使用 IRD: R IPD: 未使用 ARD: 未使用APD: 未使用 IRD: D IPD: 未使用
SQL_DESC_FIXED_PREC_SCALE SQLSMALLINT ARD: 未使用APD: 未使用 IRD: R IPD: R ARD: 未使用APD: 未使用 IRD: D IPD: D[1]
SQL_DESC_INDICATOR_PTR SQLLEN * ARD: R/W APD: R/W IRD: 未使用IPD: 未使用。 ARD: null ptr APD: null ptr IRD: 未使用IPD: 未使用。
SQL_DESC_LABEL SQLCHAR * ARD: 未使用APD: 未使用 IRD: R IPD: 未使用 ARD: 未使用APD: 未使用 IRD: D IPD: 未使用
SQL_DESC_LENGTH SQLULEN ARD: R/W APD: R/W IRD: R IPD: R/W ARD: ND, APD: ND, IRD: D, IPD: ND
SQL_DESC_LITERAL_PREFIX SQLCHAR * ARD: 未使用APD: 未使用 IRD: R IPD: 未使用 ARD: 未使用APD: 未使用 IRD: D IPD: 未使用
SQL_DESC_LITERAL_SUFFIX SQLCHAR * ARD: 未使用APD: 未使用 IRD: R IPD: 未使用 ARD: 未使用APD: 未使用 IRD: D IPD: 未使用
SQL_DESC_LOCAL_TYPE_NAME SQLCHAR * ARD: 未使用APD: 未使用 IRD: R IPD: R ARD: 未使用APD: 未使用 IRD: D IPD: D[1]
SQL_DESC_NAME SQLCHAR * ARD: 未使用APD: 未使用IRD: R IPD: R/W ARD: ND, APD: ND, IRD: D, IPD: ND
SQL_DESC_NULLABLE SQLSMALLINT ARD: 未使用APD: 未使用 IRD: R IPD: R ARD: ND, APD: ND, IRD: D, IPD: ND
SQL_DESC_NUM_PREC_RADIX SQLINTEGER ARD: R/W APD: R/W IRD: R IPD: R/W ARD: ND, APD: ND, IRD: D, IPD: ND
SQL_DESC_OCTET_LENGTH SQLLEN ARD: R/W APD: R/W IRD: R IPD: R/W ARD: ND, APD: ND, IRD: D, IPD: ND
SQL_DESC_OCTET_LENGTH_PTR SQLLEN * ARD: R/W APD: R/W IRD: 未使用IPD: 未使用。 ARD: null ptr APD: null ptr IRD: 未使用IPD: 未使用。
SQL_DESC_PARAMETER_TYPE SQLSMALLINT ARD: 未使用APD: 未使用IRD: 未使用IPD: R/W ARD: 未使用APD: 未使用IRD: 未使用IPD: D=SQL_PARAM_INPUT
SQL_DESC_PRECISION SQLSMALLINT ARD: R/W APD: R/W IRD: R IPD: R/W ARD: ND, APD: ND, IRD: D, IPD: ND
SQL_DESC_ROWVER SQLSMALLINT ARD:未使用

APD:未使用

IRD:R

IPD:R
ARD:未使用

APD:未使用

IRD:ND

IPD:不明
SQL_DESC_SCALE SQLSMALLINT ARD: R/W APD: R/W IRD: R IPD: R/W ARD: ND, APD: ND, IRD: D, IPD: ND
SQL_DESC_SCHEMA_NAME SQLCHAR * ARD: 未使用APD: 未使用 IRD: R IPD: 未使用 ARD: 未使用APD: 未使用 IRD: D IPD: 未使用
SQL_DESC_SEARCHABLE SQLSMALLINT ARD: 未使用APD: 未使用 IRD: R IPD: 未使用 ARD: 未使用APD: 未使用 IRD: D IPD: 未使用
SQL_DESC_TABLE_NAME SQLCHAR * ARD: 未使用APD: 未使用 IRD: R IPD: 未使用 ARD: 未使用APD: 未使用 IRD: D IPD: 未使用
SQL_DESC_TYPE SQLSMALLINT ARD: R/W APD: R/W IRD: R IPD: R/W ARD:SQL_C_DEFAULT APD:SQL_C_DEFAULT IRD:D IPD:ND
SQL_DESC_TYPE_NAME SQLCHAR * ARD: 未使用APD: 未使用 IRD: R IPD: R ARD: 未使用APD: 未使用 IRD: D IPD: D[1]
SQL_DESC_UNNAMED SQLSMALLINT ARD: 未使用APD: 未使用IRD: R IPD: R/W ARD: ND, APD: ND, IRD: D, IPD: ND
SQL_DESC_UNSIGNED SQLSMALLINT ARD: 未使用APD: 未使用 IRD: R IPD: R ARD: 未使用APD: 未使用 IRD: D IPD: D[1]
SQL_DESC_UPDATABLE SQLSMALLINT ARD: 未使用APD: 未使用 IRD: R IPD: 未使用 ARD: 未使用APD: 未使用 IRD: D IPD: 未使用

[1] これらのフィールドは、ドライバーがIPDを自動的に入力した場合にのみ定義されます。 そうでない場合は未定義です。 アプリケーションがこれらのフィールドを設定しようとすると、SQLSTATE HY091(無効なディスクリプタフィールド識別子)が返されます。

[2] IPDのSQL_DESC_DATA_PTRフィールドは一貫性チェックを強制するように設定できます。 その後、 SQLGetDescField または SQLGetDescRecに呼び出す際、ドライバはSQL_DESC_DATA_PTRに設定された値を返す必要はありません。

FieldIdentifier 引数

FieldIdentifierの引数は設定するディスクリプタフィールドを示します。 ディスクリプタは、次のセクション「ヘッダーフィールド」で説明するヘッダーフィールドからなる ディスクリプタ ヘッダーと、「ヘッダーフィールド」セクションの次のセクションで記述されるレコードフィールドからなる0個以上の ディスクリプタレコード を含みます。

ヘッダーフィールド

各ディスクリプタには、以下のフィールドからなるヘッダーがあります:

SQL_DESC_ALLOC_TYPE [全員]
この読み取り専用のSQLSMALLINTヘッダーフィールドは、ディスクリプタがドライバーによって自動的に割り当てられたのか、アプリケーションによって明示的に割り当てられたのかを指定します。 アプリケーションはこのフィールドを取得することはできますが、変更することはできません。 ディスクリプタがドライバーによって自動的に割り当てられた場合、フィールドはドライバーによってSQL_DESC_ALLOC_AUTOに設定されます。 ディスクリプタがアプリケーションから明示的に割り当てられている場合、ドライバーによってSQL_DESC_ALLOC_USERに設定されます。

SQL_DESC_ARRAY_SIZE [アプリケーション記述子]
ARDでは、このSQLULENヘッダーフィールドは行セット内の行数を指定します。 これは SQLFetchSQLFetchScroll への呼び出し、または SQLBulkOperationsSQLSetPosへの呼び出しによって操作される行数です。

APDでは、このSQLULENヘッダーフィールドが各パラメータの値数を指定します。

このフィールドのデフォルト値は1です。 SQL_DESC_ARRAY_SIZEが1より大きい場合、APDまたはARDのSQL_DESC_DATA_PTR、SQL_DESC_INDICATOR_PTR、SQL_DESC_OCTET_LENGTH_PTRが配列を示しています。 各配列の濃度はこの場の値に等しい。

このARDのフィールドは、SQL_ATTR_ROW_ARRAY_SIZE属性で SQLSetStmtAttr を呼び出しることでも設定できます。 このAPDのフィールドは、SQL_ATTR_PARAMSET_SIZE属性で SQLSetStmtAttr を呼び出しることでも設定できます。

SQL_DESC_ARRAY_STATUS_PTR [全員]
各ディスクリプタタイプに対して、このSQLUSMALLINT *ヘッダーフィールドはSQLUSMALLINTの値の配列を示します。 これらの配列は、行状態配列(IRD)、パラメータ状態配列(IPD)、行操作配列(ARD)、パラメータ操作配列(APD)と呼ばれます。

IRDでは、このヘッダーフィールドは SQLBulkOperationsSQLFetchSQLFetchScroll、または SQLSetPosへの呼び出し後にステータス値を含む行ステータス配列を指しています。 配列は行集合の行数だけ要素を持ちます。 アプリケーションはSQLUSMALLINTの配列を割り当て、このフィールドを配列を指すように設定しなければなりません。 フィールドはデフォルトでnullポインタに設定されています。 ドライバーは配列を埋めますが、SQL_DESC_ARRAY_STATUS_PTRフィールドがnullポインタに設定されている場合はステータス値が生成されず、配列も入力されません。

Caution

アプリケーションがIRDのSQL_DESC_ARRAY_STATUS_PTRフィールドが指す行ステータス配列の要素を設定する場合、ドライバーの挙動は未定義となります。

配列は最初に SQLBulkOperationsSQLFetchSQLFetchScroll、または SQLSetPosへの呼び出しによって入力されます。 もし呼び出しがSQL_SUCCESSやSQL_SUCCESS_WITH_INFOを返さなければ、このフィールドが指す配列の内容は定義されていません。 配列内の要素は以下の値を含むことができます。

  • SQL_ROW_SUCCESS: その行は正常に取得され、前回取得された時から変更されていません。

  • SQL_ROW_SUCCESS_WITH_INFO:その行は正常に取得され、前回取得された時から変更されていません。 ただし、行に関する警告が返されました。

  • SQL_ROW_ERROR:行の取得中にエラーが発生しました。

  • SQL_ROW_UPDATED: その行は正常に取得され、最後に取得された時から更新されています。 再度その行が取得された場合、そのステータスはSQL_ROW_SUCCESSとなります。

  • SQL_ROW_DELETED:その行は最後に取得された時から削除されています。

  • SQL_ROW_ADDED: その行は SQLBulkOperationsによって挿入されました。 再度その行が取得された場合、そのステータスはSQL_ROW_SUCCESSとなります。

  • SQL_ROW_NOROW:行セットが結果セットの末尾と重複し、行の状態配列のこの要素に対応する行は返されませんでした。

このIRDのフィールドは、SQL_ATTR_ROW_STATUS_PTR属性で SQLSetStmtAttr を呼び出すことで設定することも可能です。

IRDのSQL_DESC_ARRAY_STATUS_PTR欄は、返SQL_SUCCESSまたはSQL_SUCCESS_WITH_INFOが返却された後にのみ有効です。 もしリターンコードがこれらのいずれかでなければ、SQL_DESC_ROWS_PROCESSED_PTRが指す場所は定義されていません。

IPDでは、このヘッダーフィールドは SQLExecute または SQLExecDirectを呼び出した後、各パラメータ値集合の状態情報を含むパラメータステータス配列を指し示します。 SQLExecuteSQLExecDirectへの呼び出しがSQL_SUCCESSやSQL_SUCCESS_WITH_INFOを返さなければ、このフィールドが指す配列の内容は定義されていません。 アプリケーションはSQLUSMALLINTの配列を割り当て、このフィールドを配列を指すように設定しなければなりません。 ドライバーは配列を埋めますが、SQL_DESC_ARRAY_STATUS_PTRフィールドがnullポインタに設定されている場合はステータス値が生成されず、配列も入力されません。 配列内の要素は以下の値を含むことができます。

  • SQL_PARAM_SUCCESS: このパラメータセットに対してSQL文は正常に実行されました。

  • SQL_PARAM_SUCCESS_WITH_INFO:このパラメータセットに対してSQL文が正常に実行されました。しかし、警告情報は診断データ構造内で利用可能です。

  • SQL_PARAM_ERROR: このパラメータセットの処理中にエラーが発生しました。 追加の誤差情報は、診断データ構造で利用可能です。

  • SQL_PARAM_UNUSED:このパラメータセットは未使用で、おそらく以前のパラメータセットがエラーを引き起こし、処理を中止したか、APDのSQL_DESC_ARRAY_STATUS_PTRフィールドで指定された配列内でそのパラメータセットに対してSQL_PARAM_IGNOREが設定されていたためです。

  • SQL_PARAM_DIAG_UNAVAILABLE:診断情報は利用できません。 例えば、ドライバがパラメータの配列を一つのユニットとして扱うため、このレベルの誤り情報を生成しない場合が挙げられます。

このIPDのフィールドは、SQL_ATTR_PARAM_STATUS_PTR属性で SQLSetStmtAttr を呼び出しることで設定することも可能です。

ARDでは、このヘッダーフィールドは行操作配列を示しており、アプリケーションが設定できる値の配列を示し、この行を SQLSetPos 操作で無視するかどうかを示します。 配列内の要素は以下の値を含むことができます。

  • SQL_ROW_PROCEED:この行は SQLSetPosを使ったバルク操作に含まれています。 (この設定では、その操作が行上で必ず行われるとは限りません。IRDの行ステータス配列にステータスSQL_ROW_ERRORがある場合、ドライバーはその行内で操作を行えない場合があります。)

  • SQL_ROW_IGNORE: SQLSetPosを用いて行をバルク操作から除外します。

配列の要素が設定されていない場合、すべての行がバルク操作に含まれます。 ARDのSQL_DESC_ARRAY_STATUS_PTRフィールドの値がヌルポインタであれば、すべての行はバルク操作に含まれます。解釈は、ポインタが有効な配列を指し示し、その配列のすべての要素がSQL_ROW_PROCEEDされた場合と同じです。 配列の要素がSQL_ROW_IGNOREに設定されている場合、無視された行の行ステータス配列の値は変更されません。

このARD内のフィールドは、SQL_ATTR_ROW_OPERATION_PTR属性で SQLSetStmtAttr を呼び出すことでも設定できます。

APDでは、このヘッダーフィールドはパラメータ操作配列を指し示しており、アプリケーションが設定できる値の配列を指し示し、 SQLExecute または SQLExecDirect を呼び出した際にこのパラメータセットを無視するかを示します。 配列内の要素は以下の値を含むことができます。

  • SQL_PARAM_PROCEED:パラメータの集合は SQLExecute または SQLExecDirect の呼び出しに含まれています。

  • SQL_PARAM_IGNORE:パラメータの集合は SQLExecute または SQLExecDirect 呼び出しから除外されます。

配列の要素が設定されていない場合、配列内のすべてのパラメータが SQLExecute または SQLExecDirect の呼び出しに使用されます。 APDのSQL_DESC_ARRAY_STATUS_PTRフィールドの値がヌルポインタであれば、すべてのパラメータセットが使用されます。解釈は、ポインタが有効な配列を指し示し、その配列のすべての要素がSQL_PARAM_PROCEEDされている場合と同じです。

APD内のこのフィールドは、SQL_ATTR_PARAM_OPERATION_PTR属性で SQLSetStmtAttr を呼び出すことで設定することも可能です。

SQL_DESC_BIND_OFFSET_PTR [アプリケーション記述子]
このSQLLEN *ヘッダーフィールドはバインディングオフセットを示しています。 デフォルトではnullポインタに設定されています。 このフィールドがnullポインタでない場合、ドライバーはポインタをデリファレンスし、デリファレンドされた値をデフェアされた各フィールド(SQL_DESC_DATA_PTR、SQL_DESC_INDICATOR_PTR、SQL_DESC_OCTET_LENGTH_PTR)にペッチ時に追加し、新しいポインタ値をバインディング時に使用します。

バインディングオフセットは常にSQL_DESC_DATA_PTR、SQL_DESC_INDICATOR_PTR、SQL_DESC_OCTET_LENGTH_PTRフィールドの値に直接加算されます。 オフセットが異なる値に変更されても、新しい値は各ディスクリプタフィールドの値に直接加算されます。 新しいオフセットはフィールド値に加えてそれ以前のオフセットを加えることはありません。

このフィールドは ディファードフィールドであり、設定時に使用されるのではなく、後でドライバーがデータバッファのアドレスを決定する際に使用します。

このARDのフィールドは、SQL_ATTR_ROW_BIND_OFFSET_PTR属性で SQLSetStmtAttr を呼び出しることでも設定できます。 このARDのフィールドは、SQL_ATTR_PARAM_BIND_OFFSET_PTR属性で SQLSetStmtAttr を呼び出しることでも設定できます。

詳細については、 SQLFetchScroll および SQLBindParameterの行ごとのバインディングの説明をご覧ください。

SQL_DESC_BIND_TYPE [アプリケーション記述子]
このSQLUINTEGERヘッダーフィールドは、列またはパラメータのいずれかをバインディングするためのバインディング向きを設定します。

ARDでは、このフィールドは関連する文ハンドルに対して SQLFetchScroll または SQLFetch が呼び出される際のバインディング向きを指定します。

列ごとにバインディングを選択するには、このフィールドをSQL_BIND_BY_COLUMN(デフォルト)に設定します。

このARDのフィールドは、SQL_ATTR_ROW_BIND_TYPE属性を使ってSQLSetStmtAttrを呼び出すことでも設定できます。

APDでは、このフィールドは動的パラメータに使うバインディングの向きを指定します。

パラメータの列ごとのバインディングを選択するには、このフィールドをSQL_BIND_BY_COLUMN(デフォルト)に設定します。

APD内のこのフィールドは、SQL_ATTR_PARAM_BIND_TYPE属性を使ってSQLSetStmtAttrを呼び出しることで設定することも可能です。

SQL_DESC_COUNT [全員]
このSQLSMALLINTヘッダーフィールドは、データを含む最も番号の大きいレコードの1ベースのインデックスを指定します。 ドライバーがディスクリプタのデータ構造を設定する際、SQL_DESC_COUNTフィールドにも重要レコード数を示す必要があります。 アプリケーションがこのデータ構造のインスタンスを割り当てる際、予約するレコード数を指定する必要はありません。 アプリケーションがレコードの内容を指定すると、ドライバはディスクリプタハンドルが適切なサイズのデータ構造を参照していることを確実にするための必要な操作を行います。

SQL_DESC_COUNTは、フィールドがARDに属している場合にバウンディングされているすべてのデータカラムや、フィールドがAPDにある場合にバウンディングされているすべてのパラメータの数ではなく、最も高い番号のレコード番号のカウントです。 最も高い番号の列またはパラメータがバウンドされていない場合、SQL_DESC_COUNTは次に高い番号の列またはパラメータの番号に変更されます。 最も高い番号の列の数より小さい列やパラメータがアンバウンドされている場合(SQLBindColTargetValuePtrの引数をnullに設定し、またはSQLBindParameterをNullポインタに設定したSQLBindParameterを呼び出した場合)、SQL_DESC_COUNTは変更されません。 もし追加の列やパラメータが、データを含む最も高い番号のレコードより大きい数字でバウンディングされている場合、ドライバーは自動的にSQL_DESC_COUNTフィールドの値を増やします。 SQL_UNBINDオプションで SQLFreeStmt を呼び出してすべての列がアンバインドされた場合、ARDとIRDのSQL_DESC_COUNTフィールドは0に設定されます。 SQLFreeStmtをSQL_RESET_PARAMSオプションで呼び出すと、APDとIPDのSQL_DESC_COUNTフィールドは0に設定されます。

SQL_DESC_COUNTの値は 、アプリケーションがSQLSetDescFieldを呼び出して明示的に設定できます。 SQL_DESC_COUNTの値を明示的に減少させると、SQL_DESC_COUNTの新しい値より大きいすべてのレコードは実質的に削除されます。 SQL_DESC_COUNTの値が明示的に0に設定されていて、フィールドがARD内にある場合、バウンドされたブックマーク列を除くすべてのデータバッファが解放されます。

このARDの記録数には、製本されたしおり列は含まれていません。 ブックマークの列を解除する唯一の方法は、SQL_DESC_DATA_PTRフィールドをnullポインタに設定することです。

SQL_DESC_ROWS_PROCESSED_PTR [実装記述子]
IRDにおいて、このSQLULEN *ヘッダーフィールドは 、SQLFetchSQLFetchScrollへの呼び出し後にフェッチされる行数、または SQLBulkOperationsSQLSetPosへの呼び出しによる一括操作で影響を受ける行数(エラー行を含む)を含むバッファを示します。

IPDでは、このSQLUINTEGER *ヘッダーフィールドはエラーセットを含む処理済みパラメータセットの数を含むバッファを指し示します。 これがヌルポインタの場合は番号は返されません。

SQL_DESC_ROWS_PROCESSED_PTRは 、SQLFetch または SQLFetchScroll (IRDフィールドの場合)、 SQLExecuteSQLExecDirectまたはSQLParamData (IPDフィールドの場合)に呼び出した後にSQL_SUCCESSまたはSQL_SUCCESS_WITH_INFOが返された場合にのみ有効です。 このフィールドが指すバッファを埋める呼び出しがSQL_SUCCESSやSQL_SUCCESS_WITH_INFOを返さない場合、バッファの内容は定義されていません。ただしSQL_NO_DATAを返す場合は、バッファ内の値は0に設定されます。

このARDのフィールドは、SQL_ATTR_ROWS_FETCHED_PTR属性で SQLSetStmtAttr を呼び出しることでも設定できます。 APD内のこのフィールドは、SQL_ATTR_PARAMS_PROCESSED_PTR属性で SQLSetStmtAttr を呼び出しることで設定することも可能です。

このフィールドが指すバッファはアプリケーションによって割り当てられます。 これはドライバーによって設定されるディファード出力バッファです。 デフォルトではnullポインタに設定されています。

記録フィールド

各ディスクリプタは、記述子の種類に応じてカラムデータまたは動的パラメータのいずれかを定義するフィールドからなる1つ以上のレコードを含みます。 各レコードは単一の列またはパラメータの完全な定義です。

SQL_DESC_AUTO_UNIQUE_VALUE [IRD]
この読み取り専用のSQLINTEGERレコードフィールドは、カラムが自動増量列であればSQL_TRUE、自動増量列でない場合はSQL_FALSEが含まれます。 このフィールドは読み取り専用ですが、基礎となる自動増量列が必ずしも読み取り専用とは限りません。

SQL_DESC_BASE_COLUMN_NAME [IRD]
この読み取り専用のSQLCHAR *レコードフィールドには、結果セット列の基本列名が含まれています。 基本列名が存在しない場合(式列の場合など)、この変数は空の文字列を含みます。

SQL_DESC_BASE_TABLE_NAME [IRD]
この読み取り専用のSQLCHAR *レコードフィールドには、結果セット列のベーステーブル名が含まれています。 ベーステーブル名が定義できないか適用できない場合、この変数には空の文字列が含まれます。

SQL_DESC_CASE_SENSITIVE [実装記述子]
この読み取り専用のSQLINTEGERレコードフィールドは、列やパラメータが照合や比較において大文字を区別する場合、または非文字列である場合にSQL_TRUE SQL_FALSEを含みます。

SQL_DESC_CATALOG_NAME [IRD]
この読み取り専用のSQLCHAR *レコードフィールドには、カラムを含むベーステーブルのカタログが含まれています。 列が式であるか、列がビューの一部であるかはドライバーに依存します。 データソースがカタログをサポートしていない場合、またはカタログが特定できない場合、この変数には空文字列が含まれます。

SQL_DESC_CONCISE_TYPE [全員]
このSQLSMALLINTヘッダーフィールドは、datetimeおよびintervalデータ型を含むすべてのデータ型の簡潔なデータ型を指定します。

SQL_DESC_CONCISE_TYPE、SQL_DESC_TYPE、SQL_DESC_DATETIME_INTERVAL_CODEの各フィールドの値は相互に依存しています。 一方のフィールドが設定されるたびに、もう一方も設定しなければなりません。 SQL_DESC_CONCISE_TYPEは SQLBindColSQLBindParameter、または SQLSetDescFieldへの呼び出しで設定できます。 SQL_DESC_TYPE SQLSetDescField または SQLSetDescRecを呼び出しすることで設定できます。

SQL_DESC_CONCISE_TYPEが区間や日付時間データ型以外の簡潔なデータ型に設定されている場合、SQL_DESC_TYPEフィールドは同じ値、SQL_DESC_DATETIME_INTERVAL_CODEフィールドは0に設定されます。

SQL_DESC_CONCISE_TYPEが簡潔な日付時間または区間データ型に設定されている場合、SQL_DESC_TYPEフィールドは対応する長文型(SQL_DATETIMEまたはSQL_INTERVAL)に、SQL_DESC_DATETIME_INTERVAL_CODEフィールドは適切なサブコードに設定されます。

SQL_DESC_DATA_PTR [アプリケーション記述子とIPD]
このSQLPOINTERレコードフィールドは、パラメータ値(APDの場合)または列値(ARDの場合)を含む変数を指しています。 このフィールドは ディファードフィールドです。 設定時に使用されるのではなく、後でドライバーがデータを取得するために使います。

ARDのSQL_DESC_DATA_PTRフィールドで指定された列は、SQLBindColへの呼び出しにおけるTargetValuePtr引数がnullポインタである場合や、ARDのSQL_DESC_DATA_PTRフィールドがSQLSetDescFieldまたはSQLSetDescRecへのヌルポインタへの呼び出しによって設定された場合にバウンド解除されます。 SQL_DESC_DATA_PTRフィールドがヌルポインタに設定されている場合、他のフィールドには影響を受けません。

このフィールドが指すバッファを埋める SQLFetchSQLFetchScroll への呼び出しがSQL_SUCCESSやSQL_SUCCESS_WITH_INFOを返さなければ、バッファの内容は定義されていません。

APD、ARD、またはIPDのSQL_DESC_DATA_PTRフィールドを設定するたびに、ドライバーはSQL_DESC_TYPEフィールドの値に有効なODBC Cデータ型のいずれか、またはドライバー固有のデータ型が含まれているか、そしてそれらのデータ型に影響を与える他のすべてのフィールドが整合しているかを確認します。 整合性チェックを促すことがIPDのSQL_DESC_DATA_PTRフィールドの唯一の使用方法です。 具体的には、アプリケーションがIPDのSQL_DESC_DATA_PTRフィールドを設定し、その後そのフィールドで SQLGetDescField を呼び出す場合、設定した値を必ずしも返すわけではありません。 詳細については、 SQLSetDescRecの「Consistency Checks」を参照してください。

SQL_DESC_DATETIME_INTERVAL_CODE [全員]
このSQLSMALLINTレコードフィールドには、SQL_DESC_TYPEフィールドがSQL_DATETIMEまたはSQL_INTERVALの特定のdatetimeまたはintervalデータ型のサブコードが含まれています。 これはSQLデータ型とC型の両方に当てはまります。 コードはデータ型名を「CODE」に置き換え、日付時間型の場合は「TYPE」または「C_TYPE」に置き換え、区間タイプの場合は「CODE」を「INTERVAL」または「C_INTERVAL」に置き換えます。

アプリケーションディスクリプタのSQL_DESC_TYPEとSQL_DESC_CONCISE_TYPEがSQL_C_DEFAULTに設定され、そのディスクリプタが文ハンドルに紐づいていない場合、SQL_DESC_DATETIME_INTERVAL_CODEの内容は定義されていません。

このフィールドは、以下の表に記載されているdatetimeデータ型に対して設定できます。

Datetimeの種類 DATETIME_INTERVAL_CODE
SQL_TYPE_DATE/SQL_C_TYPE_DATE SQL_CODE_DATE
SQL_TYPE_TIME/SQL_C_TYPE_TIME SQL_CODE_TIME
SQL_TYPE_TIMESTAMP/SQL_C_TYPE_TIMESTAMP SQL_CODE_TIMESTAMP

このフィールドは、以下の表に記載されている区間データ型に対して設定できます。

[間隔の種類] DATETIME_INTERVAL_CODE
SQL_INTERVAL_DAY/SQL_C_INTERVAL_DAY SQL_CODE_DAY
SQL_INTERVAL_DAY_TO_HOUR/SQL_C_INTERVAL_DAY_TO_HOUR SQL_CODE_DAY_TO_HOUR
SQL_INTERVAL_DAY_TO_MINUTE/ SQL_C_INTERVAL_DAY_TO_MINUTE SQL_CODE_DAY_TO_MINUTE
SQL_INTERVAL_DAY_TO_SECOND/SQL_C_INTERVAL_DAY_TO_SECOND SQL_CODE_DAY_TO_SECOND
SQL_INTERVAL_HOUR/SQL_C_INTERVAL_HOUR SQL_CODE_HOUR
SQL_INTERVAL_HOUR_TO_MINUTE/SQL_C_INTERVAL_HOUR_TO_MINUTE SQL_CODE_HOUR_TO_MINUTE
SQL_INTERVAL_HOUR_TO_SECOND/ SQL_C_INTERVAL_HOUR_TO_SECOND SQL_CODE_HOUR_TO_SECOND
SQL_INTERVAL_MINUTE/SQL_C_INTERVAL_MINUTE SQL_CODE_MINUTE
SQL_INTERVAL_MINUTE_TO_SECOND/ SQL_C_INTERVAL_MINUTE_TO_SECOND SQL_CODE_MINUTE_TO_SECOND
SQL_INTERVAL_MONTH/ SQL_C_INTERVAL_MONTH SQL_CODE_MONTH
SQL_INTERVAL_SECOND/SQL_C_INTERVAL_SECOND SQL_CODE_SECOND
SQL_INTERVAL_YEAR/SQL_C_INTERVAL_YEAR SQL_CODE_YEAR
SQL_INTERVAL_YEAR_TO_MONTH/ SQL_C_INTERVAL_YEAR_TO_MONTH SQL_CODE_YEAR_TO_MONTH

データ区間およびこのフィールドの詳細については、「 データ型識別子およびディスクリプタ」を参照してください。

SQL_DESC_DATETIME_INTERVAL_PRECISION [全員]
このSQLINTEGERレコードフィールドは、SQL_DESC_TYPEフィールドがSQL_INTERVALの場合の区間先導精度を含みます。 SQL_DESC_DATETIME_INTERVAL_CODEフィールドが区間データ型に設定されている場合、このフィールドはデフォルトの区間先導精度に設定されます。

SQL_DESC_DISPLAY_SIZE [IRD]
この読み取り専用のSQLINTEGERレコードフィールドには、カラムからデータを表示するために必要な最大文字数が含まれています。

SQL_DESC_FIXED_PREC_SCALE [実装記述子]
この読み取り専用のSQLSMALLINTレコードフィールドは、列が正確な数値列で固定精度かつゼロでないスケールの場合はSQL_TRUEに設定され、固定精度とスケールを持つ正確な数値列でない場合はSQL_FALSEに設定されます。

SQL_DESC_INDICATOR_PTR [アプリケーション記述子]
ARDでは、このSQLLEN *レコードフィールドはインジケーター変数を指しています。 この変数は列の値がNULLであればSQL_NULL_DATAを含みます。 APDの場合、インジケーター変数はSQL_NULL_DATAに設定され、NULL動的引数を指定します。 そうでなければ、変数はゼロになります(SQL_DESC_INDICATOR_PTRとSQL_DESC_OCTET_LENGTH_PTRの値が同じポインタでない限り)。

ARDのSQL_DESC_INDICATOR_PTRフィールドがnullポインタの場合、ドライバーはその列がNULLかどうかの情報を返すことができません。 列がNULLでSQL_DESC_INDICATOR_PTRがnullポインタの場合、 SQLFetchSQLFetchScrollへの呼び出し後にドライバがバッファを埋めようとすると、SQLSTATE 22002(Indicator変数が必要だが提供されていない)が返されます。 SQLFetchSQLFetchScrollへの呼び出しがSQL_SUCCESSやSQL_SUCCESS_WITH_INFOを返さなければ、バッファの内容は定義されていません。

SQL_DESC_INDICATOR_PTR体は、SQL_DESC_OCTET_LENGTH_PTRが指す体が集合されているかどうかを決定します。 列のデータ値がNULLの場合、ドライバーはインジケーター変数をSQL_NULL_DATAに設定します。 SQL_DESC_OCTET_LENGTH_PTRが指す場は設定されません。 フェッチ中にNULL値が見つからない場合、SQL_DESC_INDICATOR_PTRが指すバッファはゼロに、SQL_DESC_OCTET_LENGTH_PTRが指すバッファはデータの長さに設定されます。

APDのSQL_DESC_INDICATOR_PTRフィールドがnullポインタの場合、アプリケーションはこのディスクリプタレコードを使ってNULL引数を指定することはできません。

このフィールドは ディフェアドフィールドです。設定時に使用されるのではなく、後でドライバーがnullability(ARDの場合)を示すため、またはnullabilityを判定するために使います(APDの場合)。

SQL_DESC_LABEL [IRD]
この読み取り専用のSQLCHAR *レコードフィールドには、列ラベルまたはタイトルが含まれます。 列にラベルがない場合は、この変数に列名が記載されます。 列が名前もラベルもない場合、この変数は空の文字列を含みます。

SQL_DESC_LENGTH [全員]
このSQLULENレコードフィールドは、文字文字列の最大または実際の長さ(文字数)またはバイナリデータ型(バイト単位)のいずれかです。 これは固定長データ型の最大長、または可変長データ型の実際の長さです。 その値は、文字列を終わらせるヌル終端文字は常に除外されます。 SQL_TYPE_DATE、SQL_TYPE_TIME、SQL_TYPE_TIMESTAMP、またはSQLの区間データ型のいずれかの値の場合、このフィールドはdatetimeや区間値の文字列表現の文字数(文字数)を持ちます。

このフィールドの値は、ODBC 2*.x*で定義されている「長さ」の値と異なる場合があります。 詳細は 付録D:データ型をご参照ください。

SQL_DESC_LITERAL_PREFIX [IRD]
この読み取り専用のSQLCHAR *レコードフィールドには、ドライバーがこのリテラルのプレフィックスとして認識する文字が含まれます。 この変数は、リテラルプレフィックスが適用されないデータ型の空文字列を含みます。

SQL_DESC_LITERAL_SUFFIX [IRD]
この読み取り専用のSQLCHAR *レコードフィールドには、このデータ型のリテラルに対してドライバーが接尾辞として認識する文字が含まれます。 この変数には、リテラル接尾辞が適用されないデータ型の空文字列が含まれています。

SQL_DESC_LOCAL_TYPE_NAME [実装記述子]
この読み取り専用のSQLCHAR *レコードフィールドには、データ型の通常の名称と異なる場合のローカライズされた(ネイティブ言語)名前がすべて含まれます。 ローカライズされた名前がない場合は空の文字列が返されます。 このフィールドは表示のみのためです。

SQL_DESC_NAME [実装記述子]
この行ディスクリプタ内のSQLCHAR *レコードフィールドは、該当する場合カラムエイリアスを含みます。 列のエイリアスが適用されない場合は、列名が返されます。 いずれの場合も、ドライバーはSQL_DESC_NAMEフィールドを設定する際にSQL_DESC_UNNAMEDフィールドをSQL_NAMEDに設定します。 列名や列エイリアスがない場合、ドライバーはSQL_DESC_NAMEフィールドに空文字列を返し、SQL_DESC_UNNAMEDフィールドをSQL_UNNAMEDに設定します。

アプリケーションはIPDのSQL_DESC_NAMEフィールドをパラメータ名またはエイリアスに設定し、ストアドプロシージャのパラメータを名前で指定することができます。 (詳細は「 名前によるパラメータのバインディング(名前付きパラメータ)」を参照してください。) IRDのSQL_DESC_NAMEフィールドは読み取り専用フィールドです。SQLSTATE HY091(無効なディスクリプタフィールド識別子)は、アプリケーションが設定しようとすると返されます。

IPDでは、ドライバーが名前付きパラメータをサポートしていない場合、このフィールドは定義されていません。 ドライバーが名前付きパラメータをサポートし、パラメータを記述できる場合、このフィールドでパラメータ名が返されます。

SQL_DESC_NULLABLE [実装記述子]
IRDでは、この読み取り専用のSQLSMALLINTレコードフィールドは、カラムがNULL値を持てない場合、SQL_NULLABLE SQL_NO_NULLSカラムにNULL値がない場合、またはカラムがNULL値を受け入れるかどうか分からない場合はSQL_NULLABLE_UNKNOWNとなります。 このフィールドは結果セットの列に関係し、基準列ではありません。

IPDでは、動的パラメータは常にnullableであり、アプリケーションが設定できないため、このフィールドは常にSQL_NULLABLEに設定されています。

SQL_DESC_NUM_PREC_RADIX [全員]
このSQLINTEGERフィールドは、SQL_DESC_TYPEフィールドのデータ型が近似数値型である場合、SQL_DESC_PRECISIONフィールドがビット数を含むため、値が2となります。 SQL_DESC_TYPEフィールドのデータ型が正確な数値型の場合、SQL_DESC_PRECISIONフィールドは10の数値を持ちます。なぜなら、フィールドには小数点の数が含まれているからです。 このフィールドはすべての非数値データ型に対して0に設定されています。

SQL_DESC_OCTET_LENGTH [全員]
このSQLLENレコードフィールドは、文字文字列またはバイナリデータ型の長さ(バイト単位)を含みます。 固定長の文字型やバイナリ型の場合、これは実際のバイト単位の長さです。 可変長文字型やバイナリ型の場合、これはバイト単位の最大長さです。 この値は、実装ディスクリプタ用のヌル終端文字のスペースを常に除外し、アプリケーションディスクリプタ用のヌル終端文字のスペースを必ず含みます。 アプリケーションデータの場合、このフィールドにはバッファのサイズが含まれます。 APDの場合、このフィールドは出力または入力/出力パラメータのみに定義されます。

SQL_DESC_OCTET_LENGTH_PTR [アプリケーション記述子]
このSQLLEN *レコードフィールドは、動的引数(パラメータディスクリプタの場合)またはバウンドカラム値(行ディスクリプタの場合)の総長(バイト数)を含む変数を示します。

APDの場合、この値は文字列とバイナリ以外のすべての引数で無視されます。このフィールドがSQL_NTSを指す場合、動的引数はnull終端でなければなりません。 バウンドパラメータが実行時データパラメータであることを示すために、アプリケーションはAPDの適切なレコード内のこのフィールドを変数に設定し、実行時にSQL_LEN_DATA_AT_EXECマクロの結果SQL_DATA_AT_EXEC値を含む変数にします。 もしフィールドが複数存在する場合、SQL_DESC_DATA_PTRパラメータを一意に識別する値に設定し、アプリケーションがどのパラメータを要求しているかを判断するのに役立ちます。

ARDのOCTET_LENGTH_PTRフィールドがヌルポインタの場合、ドライバーは列の長さ情報を返しません。 APDのSQL_DESC_OCTET_LENGTH_PTRフィールドがヌルポインタであれば、ドライバーは文字文字列やバイナリの値がヌル終端であると仮定します。 (バイナリ値はヌル終端にすべきではありませんが、切断を避けるために長さを割り当てるべきです。)

このフィールドが指すバッファを埋める SQLFetchSQLFetchScroll への呼び出しがSQL_SUCCESSやSQL_SUCCESS_WITH_INFOを返さなければ、バッファの内容は定義されていません。 このフィールドは ディファードフィールドです。 設定時に使用されることはありませんが、後でドライバーがデータのオクテット長を決定または表示するために使います。

SQL_DESC_PARAMETER_TYPE [IPD]
このSQLSMALLINTレコードフィールドは、入力パラメータに対してSQL_PARAM_INPUT、入出力パラメータに対してSQL_PARAM_INPUT_OUTPUT、出力パラメータに対してSQL_PARAM_OUTPUT、入出力ストリームパラメータに対してSQL_PARAM_INPUT_OUTPUT_STREAM、または出力ストリームパラメータに対してSQL_PARAM_OUTPUT_STREAMに設定されています。 デフォルトではSQL_PARAM_INPUTに設定されています。

IPDの場合、ドライバーがIPDを自動的に入力しない場合(SQL_ATTR_ENABLE_AUTO_IPD文属性はSQL_FALSE)、フィールドはデフォルトでSQL_PARAM_INPUTに設定されています。 アプリケーションは入力パラメータでないパラメータに対してIPDでこのフィールドを設定するべきです。

SQL_DESC_PRECISION [全員]
このSQLSMALLINTレコードフィールドには、正確な数値型の桁数、おおよその数値型の仮数(2進精度)、またはSQL_TYPE_TIME、SQL_TYPE_TIMESTAMP、またはSQL_INTERVAL_SECONDデータ型の分数秒成分の桁数が含まれます。 このフィールドは他のすべてのデータ型については未定義です。

このフィールドの値は、ODBC 2*.x*で定義された「precision」の値と異なる場合があります。 詳細は 付録D:データ型をご参照ください。

SQL_DESC_ROWVER [実装記述子]
このSQLSMALLINTレコードフィールドは、行が更新された際にDBMSによってカラムが自動的に修正されるかどうかを示します(例:SQL Serverの「タイムスタンプ」型のカラム)。 このレコードフィールドの値は、行バージョン管理列の場合はSQL_TRUEに設定され、そうでなければSQL_FALSEに設定されます。 この列属性は、 SQLSpecialColumns をIdentifierTypeのIdentifierTypeで呼び出して、カラムが自動的に更新されるかどうかを判定するのに似ていますSQL_ROWVER。

SQL_DESC_SCALE [全員]
このSQLSMALLINTレコードフィールドには、10進データ型および数値型の定義されたスケールが含まれています。 このフィールドは他のすべてのデータ型に対して未定義です。

このフィールドの値は、ODBC 2*.x*で定義された「スケール」の値と異なる場合があります。 詳細は 付録D:データ型をご参照ください。

SQL_DESC_SCHEMA_NAME [IRD]
この読み取り専用のSQLCHAR *レコードフィールドには、列を含むベーステーブルのスキーマ名が含まれています。 列が式であるか、列がビューの一部であるかはドライバーに依存します。 データソースがスキーマをサポートしていない場合やスキーマ名が特定できない場合、この変数には空文字列が含まれます。

SQL_DESC_SEARCHABLE [IRD]
この読み取り専用のSQLSMALLINTレコードフィールドは、以下のいずれかの値に設定されます:

  • SQL_PRED_NONE WHERE 節でその列を使えない場合。 (これはODBC 2*.x*のSQL_UNSEARCHABLE値と同じです。)

  • SQL_PRED_CHAR、その列が WHERE 節で使えるが、 LIKE 述語のみで使えるかどうか。 (これはODBC 2*.x*のSQL_LIKE_ONLY値と同じです。)

  • SQL_PRED_BASIC、その列が WHERE 節で LIKE以外のすべての比較演算子を含んで使えるかどうか。 (これはODBC 2*.x*のSQL_EXCEPT_LIKE値と同じです。)

  • SQL_PRED_SEARCHABLE その列が任意の比較演算子を持つ WHERE 節で使用可能かどうか。

SQL_DESC_TABLE_NAME [IRD]
この読み取り専用のSQLCHAR *レコードフィールドには、この列を含むベーステーブルの名前が含まれています。 列が式であるか、列がビューの一部であるかはドライバーに依存します。

SQL_DESC_TYPE [全員]
このSQLSMALLINTレコードフィールドは、datetimeおよびintervalデータ型を除くすべてのデータ型に対して簡潔なSQLまたはCデータ型を指定します。 datetimeおよびintervalデータ型については、このフィールドは長文データ型(SQL_DATETIMEまたはSQL_INTERVAL)を指定します。

このフィールドにSQL_DATETIMEまたはSQL_INTERVALが含まれている場合、SQL_DESC_DATETIME_INTERVAL_CODEフィールドには簡潔型に適したサブコードが含まれなければなりません。 datetimeデータ型の場合、SQL_DESC_TYPEはSQL_DATETIMEを含み、SQL_DESC_DATETIME_INTERVAL_CODEフィールドには特定のdatetimeデータ型のサブコードが含まれています。 区間データタイプの場合、SQL_DESC_TYPEはSQL_INTERVALを含み、SQL_DESC_DATETIME_INTERVAL_CODEフィールドには特定の区間データ型のサブコードが含まれています。

SQL_DESC_TYPE場とSQL_DESC_CONCISE_TYPE場の値は相互依存しています。 一方のフィールドが設定されるたびに、もう一方も設定しなければなりません。 SQL_DESC_TYPE SQLSetDescField または SQLSetDescRecを呼び出しすることで設定できます。 SQL_DESC_CONCISE_TYPEは SQLBindColSQLBindParameter、または SQLSetDescFieldへの呼び出しで設定できます。

SQL_DESC_TYPEが区間や日付時間データ型以外の簡潔なデータ型に設定されている場合、SQL_DESC_CONCISE_TYPEフィールドは同じ値に、SQL_DESC_DATETIME_INTERVAL_CODEフィールドは0に設定されます。

SQL_DESC_TYPEが詳細な日付時間または区間データ型(SQL_DATETIMEまたはSQL_INTERVAL)に設定され、SQL_DESC_DATETIME_INTERVAL_CODEフィールドが適切なサブコードに設定されている場合、SQL_DESC_CONCISE TYPE フィールドは対応する簡潔型に設定されます。 簡潔な日付時間や区間タイプのいずれかにSQL_DESC_TYPE設定しようとすると、SQLSTATE HY021(不整合な記述子情報)が返されます。

SQL_DESC_TYPEフィールドが SQLBindColSQLBindParameter、または SQLSetDescFieldの呼び出しによって設定された場合、以下のフィールドは以下の表に示すようにデフォルトの値に設定されます。 同じレコードの残りのフィールドの値は定義されていません。

SQL_DESC_TYPEの価値 その他の場は暗黙的に設定されます
SQL_CHAR、SQL_VARCHAR、SQL_C_CHAR、SQL_C_VARCHAR SQL_DESC_LENGTHは1に設定されています。 SQL_DESC_PRECISIONは0に設定されています。
SQL_DATETIME SQL_DESC_DATETIME_INTERVAL_CODEがSQL_CODE_DATEまたはSQL_CODE_TIMEに設定されている場合、SQL_DESC_PRECISIONは0に設定されます。 SQL_DESC_TIMESTAMPに設定されているときは、SQL_DESC_PRECISIONは6に設定されます。
SQL_DECIMAL、SQL_NUMERIC、SQL_C_NUMERIC SQL_DESC_SCALEは0に設定されています。 SQL_DESC_PRECISIONは、それぞれのデータ型に対して実装で定義された精度に設定されています。

SQL_C_NUMERIC値を手動でバインドする方法については、「 SQL to C: Numeric 」を参照してください。
SQL_FLOAT、SQL_C_FLOAT SQL_DESC_PRECISIONはSQL_FLOATの実装で定義されたデフォルト精度に設定されています。
SQL_INTERVAL SQL_DESC_DATETIME_INTERVAL_CODEが区間データ型に設定されている場合、SQL_DESC_DATETIME_INTERVAL_PRECISIONは2(デフォルトの区間先導精度)に設定されます。 区間に秒単位がある場合、SQL_DESC_PRECISIONは6(デフォルトの秒単位)に設定されます。

アプリケーションが SQLSetDescField を呼び出してディスクリプタのフィールドを設定する場合、 SQLSetDescRecを呼び出す代わりに、まずデータ型を宣言しなければなりません。 その場合、前の表に示された他のフィールドは暗黙的に設定されます。 暗黙的に設定された値のいずれかが許容できない場合、アプリケーションは SQLSetDescField または SQLSetDescréc を呼び出して、その不可能な値を明示的に設定できます。

SQL_DESC_TYPE_NAME [実装記述子]
この読み取り専用のSQLCHAR *レコードフィールドには、データソース依存の型名(例:「CHAR」、「VARCHAR」など)が含まれます。 データ型名が不明の場合、この変数は空の文字列を含みます。

SQL_DESC_UNNAMED [実装記述子]
このSQLSMALLINTレコードフィールドは、行ディスクリプタの際にドライバーによってSQL_DESC_NAMEフィールドを設定する際にSQL_NAMEDまたはSQL_UNNAMEDに設定されます。 SQL_DESC_NAMEフィールドに列別名が含まれている場合、または列別名が適用されない場合、ドライバーはSQL_DESC_UNNAMEDフィールドをSQL_NAMEDに設定します。 アプリケーションがIPDのSQL_DESC_NAMEフィールドをパラメータ名またはエイリアスに設定すると、ドライバーはIPDのSQL_DESC_UNNAMEDフィールドをSQL_NAMEDに設定します。 列名や列別名がない場合、ドライバーはSQL_DESC_UNNAMEDフィールドをSQL_UNNAMEDに設定します。

アプリケーションはIPDのSQL_DESC_UNNAMEDフィールドをSQL_UNNAMEDに設定できます。 アプリケーションがIPDのSQL_DESC_UNNAMEDフィールドをSQL_NAMEDに設定しようとすると、ドライバはSQLSTATE HY091(無効なディスクリプタフィールド識別子)を返します。 IRDのSQL_DESC_UNNAMEDフィールドは読み取り専用です。SQLSTATE HY091(無効なディスクリプタフィールド識別子)は、アプリケーションが設定しようとすると返されます。

SQL_DESC_UNSIGNED [実装記述子]
この読み取り専用のSQLSMALLINTレコードフィールドは、カラムタイプが符号なしまたは数値でない場合はSQL_TRUE、署名付きカラムタイプの場合はSQL_FALSEに設定されます。

SQL_DESC_UPDATABLE [IRD]
この読み取り専用のSQLSMALLINTレコードフィールドは、以下のいずれかの値に設定されます:

  • SQL_ATTR_READ_ONLY結果セットの列が読み取り専用の場合。

  • SQL_ATTR_WRITE結果セットの列が読み書き(read-write)である場合。

  • SQL_ATTR_READWRITE_UNKNOWN結果セットの列が更新可能かどうかが不明な場合。

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

整合性チェック

アプリケーションがARD、APD、またはIPDのSQL_DESC_DATA_PTRフィールドの値を入力するたびに、ドライバーによって自動的に整合性チェックが行われます。 もしフィールドのいずれかが他のフィールドと矛盾している場合、 SQLSetDescFieldはSQLSTATE HY021(Inconsistent descriptor information)を返します。 詳細については、 SQLSetDescRecの「Consistency Check」をご覧ください。

詳細情報 参照先
カラムの製本 SQLBindCol 関数
パラメータのバインド SQLBindParameter 関数
ディスクリプタフィールドの取得 SQLGetDescField 関数
複数のディスクリプタフィールドを取得する方法 SQLGetDescRec 関数
複数のディスクリプタフィールドを設定する SQLSetDescRec 関数

こちらもご覧ください

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