アプリケーションの旧バージョンとの互換性のためのマッピング置換関数

ODBC 3.x ドライバー マネージャーで動作する ODBC 3.x アプリケーションは、新しい機能が使用されていない限り、ODBC 2.x ドライバーに対して動作します。 ただし、重複する機能と動作の変更はどちらも、ODBC 3.x アプリケーションが ODBC 2.x ドライバーで動作する方法に影響します。 ODBC 2.x ドライバーを使用する場合、ドライバー マネージャーは、1 つ以上の ODBC 2.x 関数を置き換えた次の ODBC 3.x 関数を、対応する ODBC 2.x 関数にマップします。

ODBC 3.x 関数 ODBC 2.x 関数
SQLAllocHandle SQLAllocEnvSQLAllocConnect、または SQLAllocStmt
SQLBulkOperations SQLSetPos
SQLColAttribute SQLColAttributes
SQLEndTran SQLTransact
SQLFetch SQLExtendedFetch
SQLFetchScroll SQLExtendedFetch
SQLFreeHandle SQLFreeEnvSQLFreeConnect、または SQLFreeStmt
SQLGetConnectAttr SQLGetConnectOption
SQLGetDiagRec SQLError
SQLGetStmtAttr SQLGetStmtOption[1]
SQLSetConnectAttr SQLSetConnectOption
SQLSetStmtAttr SQLSetStmtOption[1]

[1] 要求される属性に応じて、他のアクションも実行される可能性があります。

SQLAllocHandle

ドライバー マネージャーは、必要に応じて、 これを SQLAllocEnvSQLAllocConnect、または SQLAllocStmt にマップします。 SQLAllocHandle の次の呼び出し:

SQLAllocHandle(HandleType, InputHandle, OutputHandlePtr);  

では、ドライバー マネージャーは次のマッピング (概念的、エラー チェックなし) を実行します。

switch (HandleType) {  
   case SQL_HANDLE_ENV: return (SQLAllocEnv(OutputHandlePtr));  
   case SQL_HANDLE_DBC: return (SQLAllocConnect (InputHandle, OutputHandlePtr));  
   case SQL_HANDLE_STMT: return (SQLAllocStmt (InputHandle, OutputHandlePtr));  
   default: // return SQL_ERROR, SQLSTATE HY092 ("Invalid attribute/option identifier")  
}  

SQLBulkOperations

ドライバー マネージャーは、 これを SQLSetPos にマップします。 SQLBulkOperations への次の呼び出し:

SQLBulkOperations(hstmt, Operation);  

は、次の一連の手順になります。

  1. Operation 引数がSQL_ADDされている場合、ドライバー マネージャーは次のように SQLSetPos を 呼び出します。

    SQLSetPos (hstmt, 0, SQL_ADD, SQL_LOCK_NO_CHANGE);  
    
  2. Operation 引数がSQL_ADDされていない場合、ドライバーは SQLSTATE HY092 (無効な属性/オプション識別子) を返します。

  3. アプリケーションが SQLFetch または SQLFetchScrollSQLBulkOperations への呼び出しの間でSQL_ATTR_ROW_STATUS_PTRを変更しようとすると、ドライバー マネージャーは SQLSTATE HY011 を返します (属性は現在設定できません)。

  4. Operation 引数がSQL_ADDされている場合、アプリケーションは SQLBindCol を 呼び出して、挿入するデータをバインドする必要があります。 SQLSetDescField または SQLSetDescRec を呼び出して、挿入するデータをバインドすることはできません。

  5. Operation 引数がSQL_ADDされ、挿入する行数が現在の行セット サイズと同じでない場合は、 SQLSetStmtAttr を呼び出して、 sqlBulkOperations を呼び出す前に挿入する行数にSQL_ATTR_ROW_ARRAY_SIZEステートメント属性を設定する必要があります。 前の行セット サイズに戻すには、SQLFetch、SQLFetchScroll、または SQLSetPos が呼び出される前に、アプリケーションで SQL_ATTR_ROW_ARRAY_SIZE ステートメント属性を設定する必要があります。

SQLColAttribute

ドライバー マネージャーは、 これを SQLColAttributes にマップします。 SQLColAttribute の次の呼び出し:

SQLColAttribute(StatementHandle, ColumnNumber, FieldIdentifier, CharacterAttributePtr, BufferLength, StringLengthPtr, NumericAttributePtr);  

は、次の一連の手順になります。

  1. FieldIdentifier が次のいずれかである場合:

    SQL_DESC_PRECISION、SQL_DESC_SCALE、SQL_DESC_LENGTH、SQL_DESC_OCTET_LENGTH、SQL_DESC_UNNAMED、SQL_DESC_BASE_COLUMN_NAME、SQL_DESC_LITERAL_PREFIX、SQL_DESC_LITERAL_SUFFIX、またはSQL_DESC_LOCAL_TYPE_NAME

    ドライバー マネージャーは、SQLSTATE HY091 (無効な記述子フィールド識別子) でSQL_ERRORを返します。 このセクションのそれ以上の規則は適用されません。

  2. ドライバー マネージャーは、SQL_COLUMN_COUNT、SQL_COLUMN_NAME、またはSQL_COLUMN_NULLABLEをそれぞれSQL_DESC_COUNT、SQL_DESC_NAME、またはSQL_DESC_NULLABLEにマップします。 (ODBC 2.x ドライバーでは、SQL_DESC_COUNT、SQL_DESC_NAME、SQL_DESC_NULLABLEではなく、SQL_COLUMN_COUNT、SQL_COLUMN_NAME、およびSQL_COLUMN_NULLABLEのみをサポートする必要があります)。SQLColAttribute の呼び出しは、次にマップされます。

    SQLColAttributes(StatementHandle, ColumnNumber, FieldIdentifier, CharacterAttributePtr, BufferLength, StringLengthPtr, NumericAttributePtr);  
    
  3. 他のすべての FieldIdentifier 値はドライバーに渡され、 SQLColAttribute は前述のように SQLColAttributes にマップされます。

  4. BufferLength が 0 未満の場合、ドライバー マネージャーは SQLSTATE HY090 (文字列またはバッファーの長さが無効) のSQL_ERRORを返します。 このセクションのそれ以上の規則は適用されません。

  5. FieldIdentifier がSQL_DESC_CONCISE_TYPEされ、返される型が簡潔な datetime データ型の場合、ドライバー マネージャーは戻り値を日付、時刻、およびタイムスタンプ コードにマップします。

  6. ドライバー マネージャーは、SQLSTATE HY010 (関数シーケンス エラー) を発生させる必要があるかどうかを確認するために必要なチェックを実行します。 その場合、ドライバー マネージャーはSQL_ERRORと SQLSTATE HY010 (関数シーケンス エラー) を返します。 このセクションのそれ以上の規則は適用されません。

SQLEndTran

ドライバー マネージャーは、これを SQLTransact にマップします。 SQLEndTran の次の呼び出し:

SQLEndTran(HandleType, Handle, CompletionType);  

では、ドライバー マネージャーは次のマッピング (概念的、エラー チェックなし) を実行します。

switch (HandleType) {  
   case SQL_HANDLE_ENV:return(SQLTransact(Handle, SQL_NULL_HDBC, CompletionType));  
   case SQL_HANDLE_DBC:return(SQLTransact(SQL_NULL_HENV, Handle, CompletionType);  
   default: // return SQL_ERROR, SQLSTATE HY092 ("Invalid attribute/option identifier")  
}  

SQLFetch

ドライバー マネージャーは、SQL_FETCH_NEXTの FetchOrientation 引数を使用して、これを SQLExtendedFetch にマップします。 SQLFetch の次の呼び出し:

SQLFetch (StatementHandle);  

は、次のように SQLExtendedFetch を呼び出すドライバー マネージャーになります。

rc = SQLExtendedFetch(StatementHandle, FetchOrientation, FetchOffset, &RowCount, RowStatusArray);  

この呼び出しでは、 pcRow 引数は、 アプリケーションが SQLSetStmtAttr の呼び出しを介して SQL_ATTR_ROWS_FETCHED_PTR ステートメント属性を設定する値に設定されます。

注意

アプリケーションが SQLSetStmtAttr を呼び出して状態配列を指すSQL_ATTR_ROW_STATUS_PTRを設定すると、ドライバー マネージャーはポインターをキャッシュします。 RowStatusArray は null ポインターと等しい場合があります。

ドライバーが SQLExtendedFetch をサポートせず、カーソル ライブラリが読み込まれている場合、ドライバー マネージャーはカーソル ライブラリの SQLExtendedFetch を使用して SQLFetchSQLExtendedFetch にマップします。 ドライバーが SQLExtendedFetch をサポートせず、カーソル ライブラリが読み込まれていない場合、ドライバー マネージャーは SQLFetch への呼び出しをドライバーに渡します。 アプリケーションが SQLSetStmtAttr を 呼び出してSQL_ATTR_ROW_STATUS_PTRを設定すると、ドライバー マネージャーによって配列が確実に設定されます。 アプリケーションが SQLSetStmtAttr を呼び出してSQL_ATTR_ROWS_FETCHED_PTRを設定する場合、ドライバー マネージャーはこのフィールドを 1 に設定します。

SQLFetchScroll

ドライバー マネージャーは、 これを SQLExtendedFetch にマップします。 SQLFetchScroll の次の呼び出し:

SQLFetchScroll(StatementHandle, FetchOrientation, FetchOffset);  

は、次の一連の手順になります。

  1. アプリケーションが SQLSetStmtAttr を呼び出してSQL_ATTR_ROW_STATUS_PTR (IRD のSQL_DESC_ARRAY_STATUS_PTR フィールドを設定する) 状態配列を指すように設定すると、ドライバー マネージャーはこのポインターをキャッシュします。 このポインターを RowStatusArray にします。それ以外の場合は、 RowStatusArray を null ポインターと等しくします。 RowStatusArray 引数が null ポインターに設定されている場合、ドライバー マネージャーは行状態配列を生成します。

  2. FetchOrientation がSQL_FETCH_NEXT、SQL_FETCH_PRIOR、SQL_FETCH_ABSOLUTE、SQL_FETCH_RELATIVE、SQL_FETCH_FIRST、SQL_FETCH_LAST、またはSQL_FETCH_BOOKMARKのいずれかでない場合、ドライバー マネージャーはSQL_ERRORと SQLSTATE HY106 (フェッチの種類が範囲外) で返されます。 このセクションのそれ以上の規則は適用されません。

  3. 大文字と小文字の区別:

  • FetchOrientation が SQL_FETCH_BOOKMARK と等しい場合は、次のようになります。

    • SQLSetStmtAttr が以前に呼び出されてSQL_ATTR_FETCH_BOOKMARK_PTRの値を設定した場合は、ポインター SQL_DESC_FETCH_BOOKMARK_PTRを逆参照して取得した値を Bmk に設定します。

    • それ以外の場合は、SQLSTATE HY111 でSQL_ERRORを返します (ブックマーク値が無効です)。 このセクションのそれ以上の規則は適用されません。

    ドライバー マネージャーは、次のように SQLExtendedFetch を呼び出すようになりました。

    rc = SQLExtendedFetch(StatementHandle, FetchOrientation, Bmk, pcRow, RowStatusArray);  
    
  • それ以外の場合、ドライバー マネージャーは 次のように SQLExtendedFetch を呼び出します。

    rc = SQLExtendedFetch(StatementHandle, FetchOrientation, FetchOffset, pcRow, RowStatusArray);  
    

    これらの呼び出しでは、 pcRow 引数は、 アプリケーションが SQLSetStmtAttr の呼び出しを介して SQL_ATTR_ROWS_FETCHED_PTR ステートメント属性を設定する値に設定されます。

  • SQL_ATTR_ROW_ARRAY_SIZEはSQL_ROWSET_SIZEにマップされます。

  • rc がSQL_SUCCESSまたはSQL_SUCCESS_WITH_INFOと等しく、FetchOrientation が SQL_FETCH_BOOKMARK と等しく、FetchOffset が 0 に等しくない場合、ドライバー マネージャーは警告 SQLSTATE 01S10 (ブックマーク オフセットによるフェッチの試行、オフセット値の無視) を投稿し、SQL_SUCCESS_WITH_INFOを返します。

SQLFreeHandle

ドライバー マネージャーは、これを必要に応じて SQLFreeEnvSQLFreeConnect、または SQLFreeStmt にマップします。 SQLFreeHandle の次の呼び出し:

SQLFreeHandle(HandleType, Handle);  

では、ドライバー マネージャーは次のマッピング (概念的、エラー チェックなし) を実行します。

switch (HandleType) {  
   case SQL_HANDLE_ENV: return (SQLFreeEnv(Handle));  
   case SQL_HANDLE_DBC: return (SQLFreeConnect(Handle));  
   case SQL_HANDLE_STMT: return (SQLFreeStmt(Handle, SQL_DROP));  
   default: // return SQL_ERROR, SQLSTATE HY092 ("Invalid attribute/option identifier")  
}  

SQLGetConnectAttr

ドライバー マネージャーは、 これを SQLGetConnectOption にマップします。 SQLGetConnectAttr への次の呼び出し:

SQLGetConnectAttr(ConnectionHandle, Attribute, ValuePtr, BufferLength, StringLengthPtr);  

は、次の一連の手順になります。

  1. 属性がドライバー定義の接続またはステートメント属性ではなく、ODBC 2.x で定義された属性でない場合、ドライバー マネージャーは SQLSTATE HY092 (無効な属性/オプション識別子) でSQL_ERRORを返します。 このセクションのそれ以上の規則は適用されません。

  2. 属性がSQL_ATTR_AUTO_IPDまたはSQL_ATTR_METADATA_IDと等しい場合、ドライバー マネージャーは SQLSTATE HY092 (無効な属性/オプション識別子) でSQL_ERRORを返します。

  3. ドライバー マネージャーは、SQLSTATE 08003 (接続が開かっていない) または SQLSTATE HY010 (関数シーケンス エラー) を発生させる必要があるかどうかを確認するために必要なチェックを実行します。 その場合、ドライバー マネージャーはSQL_ERRORを返し、適切なエラー メッセージを投稿します。 このセクションのそれ以上の規則は適用されません。

  4. ドライバー マネージャーは、 次のように SQLGetConnectOption を 呼び出します。

    SQLGetConnectOption (ConnectionHandle, Attribute, ValuePtr);  
    

    BufferLengthStringLengthPtr は無視されることに注意してください。

SQLGetData

ODBC 2.x ドライバーを操作する ODBC 3.x アプリケーションで ColumnNumber 引数が 0 の SQLGetData を呼び出すと、ODBC 3.x Driver Manager は、Option 属性を SQL_GET_BOOKMARK に設定した SQLGetStmtOption への呼び出しにマップします。

SQLGetStmtAttr

ドライバー マネージャーは、 これを SQLGetStmtOption にマップします。 SQLGetStmtAttr への次の呼び出し:

SQLGetStmtAttr(StatementHandle, Attribute, ValuePtr, BufferLength, StringLengthPtr);  

は、次の一連の手順になります。

  1. 属性がドライバー定義の接続またはステートメント属性ではなく、ODBC 2.x で定義された属性でない場合、ドライバー マネージャーは SQLSTATE HY092 (無効な属性/オプション識別子) でSQL_ERRORを返します。 このセクションのそれ以上の規則は適用されません。

  2. 属性が次のいずれかである場合:

    SQL_ATTR_APP_ROW_DESC

    SQL_ATTR_APP_PARAM_DESC

    SQL_ATTR_AUTO_IPD

    SQL_ATTR_ROW_BIND_TYPE

    SQL_ATTR_IMP_ROW_DESC

    SQL_ATTR_IMP_PARAM_DESC

    SQL_ATTR_METADATA_ID

    SQL_ATTR_PARAM_BIND_TYPE

    SQL_ATTR_PREDICATE_PTR

    SQL_ATTR_PREDICATE_OCTET_LENGTH_PTR

    SQL_ATTR_PARAM_BIND_OFFSET_PTR

    SQL_ATTR_ROW_BIND_OFFSET_PTR

    SQL_ATTR_ROW_OPERATION_PTR

    SQL_ATTR_PARAM_OPERATION_PTR

    ドライバー マネージャーは、SQLSTATE HY092 (無効な属性/オプション識別子) でSQL_ERRORを返します。 このセクションのそれ以上の規則は適用されません。

  3. ドライバー マネージャーは、SQLSTATE HY010 (関数シーケンス エラー) を発生させる必要があるかどうかを確認するために必要なチェックを実行します。 その場合、ドライバー マネージャーはSQL_ERRORと SQLSTATE HY010 (関数シーケンス エラー) を返します。 このセクションのそれ以上の規則は適用されません。

  4. 属性が SQL_ATTR_ROWS_FETCHED_PTR と等しい場合、ドライバー マネージャーは内部ドライバー マネージャー変数 cRow へのポインターを返します。この変数は、SQLExtendedFetch の呼び出しで使用または使用します。 このセクションのそれ以上の規則は適用されません。

  5. 属性がSQL_DESC_FETCH_BOOKMARK_PTRと等しい場合、ドライバー マネージャーは、SQLSetStmtAttr の呼び出し中にキャッシュされた適切なポインターを返します。

  6. 属性がSQL_ATTR_ROW_STATUS_PTRと等しい場合、ドライバー マネージャーは、SQLSetStmtAttr の呼び出し中にキャッシュされた適切なポインターを返します。

  7. ドライバー マネージャーは、 次のように SQLGetStmtOption を 呼び出します。

    SQLGetStmtOption (hstmt, fOption, pvParam);  
    

    ここで、hstmtfOptionpvParam はそれぞれ StatementHandleAttributeValuePtr の値に設定されます。 BufferLengthStringLengthPtr は無視されます。

SQLSetConnectAttr

ドライバー マネージャーは、 これを SQLSetConnectOption にマップします。 SQLSetConnectAttr への次の呼び出し:

SQLSetConnectAttr(ConnectionHandle, Attribute, ValuePtr, StringLength);  

は、次の一連の手順になります。

  1. 属性がドライバー定義の接続またはステートメント属性ではなく、ODBC 2.x で定義された属性でない場合、ドライバー マネージャーは SQLSTATE HY092 (無効な属性/オプション識別子) でSQL_ERRORを返します。 このセクションのそれ以上の規則は適用されません。

  2. 属性がSQL_ATTR_AUTO_IPDと等しい場合、ドライバー マネージャーは SQLSTATE HY092 (無効な属性/オプション識別子) でSQL_ERRORを返します。

  3. ドライバー マネージャーは、SQLSTATE 08003 (接続が開かっていない) または SQLSTATE HY010 (関数シーケンス エラー) を発生させる必要があるかどうかを確認するために必要なチェックを実行します。 これらのエラーのいずれかが発生する必要がある場合、ドライバー マネージャーはSQL_ERRORを返し、適切なエラー メッセージを投稿します。 このセクションのそれ以上の規則は適用されません。

  4. ドライバー マネージャーは、次のように SQLSetConnectOption を 呼び出します。

    SQLSetConnectOption (hdbc, fOption, vParam);  
    

    ここで、hdbcfOptionvParam はそれぞれ ConnectionHandleAttributeValuePtr の値に設定されます。 StringLengthPtr は無視されます。

注意

接続レベルでステートメント属性を設定する機能は非推奨になりました。 ODBC 3.x アプリケーションでは、ステートメント属性を接続レベルで設定しないでください。

SQLSetStmtAttr

ドライバー マネージャーは、 これを SQLSetStmtOption にマップします。 SQLSetStmtAttr への次の呼び出し:

SQLSetStmtAttr(StatementHandle, Attribute, ValuePtr, StringLength);  

は、次の一連の手順になります。

  1. 属性がドライバー定義の接続またはステートメント属性ではなく、ODBC 2.x で定義された属性でない場合、ドライバー マネージャーは SQLSTATE HY092 (無効な属性/オプション識別子) でSQL_ERRORを返します。 このセクションのそれ以上の規則は適用されません。

  2. 属性が次のいずれかである場合:

    SQL_ATTR_APP_ROW_DESC

    SQL_ATTR_APP_PARAM_DESC

    SQL_ATTR_AUTO_IPD

    SQL_ATTR_ROW_BIND_TYPE

    SQL_ATTR_IMP_ROW_DESC

    SQL_ATTR_IMP_PARAM_DESC

    SQL_ATTR_METADATA_ID

    SQL_ATTR_PARAM_BIND_TYPE

    SQL_ATTR_PREDICATE_PTR

    SQL_ATTR_PREDICATE_OCTET_LENGTH_PTR

    SQL_ATTR_PARAM_BIND_OFFSET_PTR

    SQL_ATTR_ROW_BIND_OFFSET_PTR

    SQL_ATTR_ROW_OPERATION_PTR

    SQL_ATTR_PARAM_OPERATION_PTR

    ドライバー マネージャーは、SQLSTATE HY092 (無効な属性/オプション識別子) でSQL_ERRORを返します。 このセクションのそれ以上の規則は適用されません。

  3. ドライバー マネージャーは、SQLSTATE HY010 (関数シーケンス エラー) を発生させる必要があるかどうかを確認するために必要なチェックを実行します。 その場合、ドライバー マネージャーはSQL_ERRORと SQLSTATE HY010 (関数シーケンス エラー) を返します。 このセクションのそれ以上の規則は適用されません。

  4. 属性がSQL_ATTR_PARAMSET_SIZEまたはSQL_ATTR_PARAMS_PROCESSED_PTRと等しい場合は、このトピックで後述する「パラメーター配列の処理のためのマッピング」セクションを参照してください。 このセクションのそれ以上の規則は適用されません。

  5. 属性が SQL_ATTR_ROWS_FETCHED_PTR と等しい場合、ドライバー マネージャーは後で SQLFetchScroll で使用するためにポインター値をキャッシュします。

  6. 属性が SQL_ATTR_ROW_STATUS_PTR と等しい場合、ドライバー マネージャーは、後で SQLFetchScroll または SQLSetPos で使用するためにポインター値をキャッシュします。 このセクションのそれ以上の規則は適用されません。

  7. 属性が SQL_ATTR_FETCH_BOOKMARK_PTR と等しい場合、ドライバー マネージャーは ValuePtr をキャッシュし、後で SQLFetchScroll の呼び出しでキャッシュされた値を使用します。 このセクションのそれ以上の規則は適用されません。

  8. ドライバー マネージャーは、 次のように SQLSetStmtOption を 呼び出します。

    SQLSetStmtOption (hstmt, fOption, vParam);  
    

    ここで、hstmtfOption、および vParam はそれぞれ StatementHandleAttributeValuePtr の値に設定されます。 StringLength 引数は無視されます。

    ODBC 2.x ドライバーで文字ストリング固有のステートメント・オプションがサポートされている場合、ODBC 3.x アプリケーションは SQLSetStmtOption を呼び出してそれらのオプションを設定する必要があります。

パラメーター配列を処理するためのマッピング

アプリケーションが呼び出すとき:

SQLSetStmtAttr (StatementHandle, SQL_ATTR_PARAMSET_SIZE, Size, StringLength);  

ドライバー マネージャーは次を呼び出します。

SQLParamOptions (StatementHandle, Size, &RowCount);  

ドライバー マネージャーは、アプリケーションが SQLGetStmtAttr を呼び出してSQL_ATTR_PARAMS_PROCESSED_PTRを取得するときに、この変数へのポインターを後で返します。 ドライバー マネージャーは、ステートメント ハンドルが準備済みまたは割り当て済みの状態に戻るまで、この内部変数を変更できません。

ODBC 3.x アプリケーションは 、SQLGetStmtAttr を呼び出して、APD で SQL_DESC_ARRAY_SIZE フィールドを明示的に設定していない場合でも、SQL_ATTR_PARAMS_PROCESSED_PTRの値を取得できます。 この状況は、たとえば、 SQLExecute がSQL_NEED_DATAを返したときに処理されるパラメーターの現在の "行" をチェックする汎用ルーチンがアプリケーションにある場合に発生する可能性があります。 このルーチンは、SQL_DESC_ARRAY_SIZEが 1 であるか、1 より大きいかにかかわらず呼び出されます。 これを考慮するには、アプリケーションが SQLSetStmtAttr を呼び出して APD の SQL_DESC_ARRAY_SIZE フィールドを設定しているかどうかに関係なく、ドライバー マネージャーでこの内部変数を定義する必要があります。 SQL_DESC_ARRAY_SIZEが設定されていない場合、ドライバー マネージャーは、 SQLExecDirect または SQLExecute から返す前に、この変数に値 1 が含まれていることを確認する必要があります。

エラー処理

ODBC 3.x では、 SQLFetch または SQLFetchScroll を呼び出すと IRD のSQL_DESC_ARRAY_STATUS_PTRが設定され、特定の診断レコードのSQL_DIAG_ROW_NUMBER フィールドには、このレコードが関連する行セット内の行の番号が含まれます。 これを使用して、アプリケーションはエラー メッセージを特定の行位置と関連付けることができます。

ODBC 2.x ドライバーでは、この機能を提供できません。 ただし、SQLSTATE 01S01 (行内エラー) でエラーの境界が提供されます。 ODBC 2.x ドライバーに対して SQLFetch または SQLFetchScroll を使用している ODBC 3.x アプリケーションでは、この事実に注意する必要があります。 このようなアプリケーションでは、 SQLGetDiagField を呼び出して実際に SQL_DIAG_ROW_NUMBER フィールドを取得できないことにも注意してください。 ODBC 2.x ドライバーを使用する ODBC 3.x アプリケーションは、SQL_DIAG_MESSAGE_TEXT、SQL_DIAG_NATIVE、SQL_DIAG_RETURNCODE、またはSQL_DIAG_SQLSTATEの DiagIdentifier 引数でのみ SQLGetDiagField を呼び出すことが可能です。 ODBC 3.x ドライバー マネージャーは、ODBC 2.x ドライバーを操作するときに診断データ構造を維持しますが、ODBC 2.x ドライバーはこれら 4 つのフィールドのみを返します。

ODBC 2.x アプリケーションが ODBC 2.x ドライバーを操作しているときに、操作によってドライバー マネージャーによって複数のエラーが返される可能性がある場合は、ODBC 3.x ドライバー マネージャーによって ODBC 2.x ドライバー マネージャーによって異なるエラーが返される可能性があります。

ブックマーク操作のマッピング

ODBC 3.x ドライバー マネージャーは、ODBC 2.x ドライバーで動作する ODBC 3.x アプリケーションがブックマーク操作を実行するときに、次のマッピングを実行します。

SQLBindCol

ODBC 2.x ドライバーを操作する ODBC 3.x アプリケーションが SQLBindCol を呼び出して 、fCType が SQL_C_VARBOOKMARK と等しい列 0 にバインドする場合、ODBC 3.x Driver Manager は BufferLength 引数が 4 未満か 4 より大きいかどうかを確認し、その場合は SQLSTATE HY090 (文字列またはバッファーの長さが無効) を返します。 BufferLength 引数が 4 の場合、ドライバー マネージャーは、fCType をSQL_C_BOOKMARKに置き換えた後、ドライバーで SQLBindCol を呼び出します。

SQLColAttribute

ODBC 2.x ドライバーを操作する ODBC 3.x アプリケーションが ColumnNumber 引数を 0 に設定して SQLColAttribute を呼び出すと、ドライバー マネージャーは次の表に示す FieldIdentifier 値を返します。

FieldIdentifier
SQL_DESC_AUTO_UNIQUE_VALUE SQL_FALSE
SQL_DESC_CASE_SENSITIVE SQL_FALSE
SQL_DESC_CATALOG_NAME "" (空の文字列)
SQL_DESC_CONCISE_TYPE SQL_BINARY
SQL_DESC_COUNT SQLNumResultCols によって返されるのと同じ値
SQL_DESC_DATETIME_INTERVAL_CODE 0
SQL_DESC_DISPLAY_SIZE 8
SQL_DESC_FIXED_PREC_SCALE SQL_FALSE
SQL_DESC_LABEL "" (空の文字列)
SQL_DESC_LENGTH 0
SQL_DESC_LITERAL_PREFIX "" (空の文字列)
SQL_DESC_LITERAL_SUFFIX "" (空の文字列)
SQL_DESC_LOCAL_TYPE_NAME "" (空の文字列)
SQL_DESC_NAME "" (空の文字列)
SQL_DESC_NULLABLE SQL_NO_NULLS
SQL_DESC_OCTET_LENGTH 4
SQL_DESC_PRECISION 4
SQL_DESC_SCALE 0
SQL_DESC_SCHEMA_NAME "" (空の文字列)
SQL_DESC_SEARCHABLE SQL_PRED_NONE
SQL_DESC_TABLE_NAME "" (空の文字列)
SQL_DESC_TYPE SQL_BINARY
SQL_DESC_TYPE_NAME "" (空の文字列)
SQL_DESC_UNNAMED SQL_UNNAMED
SQL_DESC_UNSIGNED SQL_FALSE
SQL_DESC_UPDATEABLE SQL_ATTR_READ_ONLY

SQLDescribeCol

ODBC 2.x ドライバーを操作する ODBC 3.x アプリケーションが ColumnNumber 引数を 0 に設定して SQLDescribeCol を呼び出すと、ドライバー マネージャーは次の表に示す値を返します。

バッファー
ColumnName "" (空の文字列)
*NameLengthPtr 0
*DataTypePtr SQL_BINARY
*ColumnSizePtr 4
*DecimalDigitsPtr 0
*NullablePtr SQL_NO_NULLS

SQLGetData

ODBC 2.x ドライバーで動作する ODBC 3.x アプリケーションが SQLGetData を次のように呼び出してブックマークを取得する場合:

SQLGetData(StatementHandle, 0, SQL_C_VARBOOKMARK, TargetValuePtr, BufferLength, StrLen_or_IndPtr)  

呼び出しは、次のように、SQL_GET_BOOKMARKの fOption を使用して SQLGetStmtOption にマップされます。

SQLGetStmtOption(hstmt, SQL_GET_BOOKMARK, TargetValuePtr)  

ここで、hstmtpvParam はそれぞれ StatementHandleTargetValuePtr の値に設定されます。 ブックマークは、 pvParam (TargetValuePtr) 引数によって指されるバッファーで返されます。 SQLGetData の呼び出しでStrLen_or_IndPtr引数が指すバッファー内の値は 4 に設定されます。

このマッピングは、SQLGetData の呼び出し前に SQLFetch が呼び出され、ODBC 2.x ドライバーが SQLExtendedFetch をサポートしていなかった場合を考慮するために必要です。 この場合、 SQLFetch は ODBC 2.x ドライバーに渡されます。この場合、ブックマークの取得はサポートされません。

ODBC 2.x ドライバーで SQLGetData を複数回呼び出して、パーツ内のブックマークを取得することはできません。したがって、BufferLength 引数を 4 未満に設定し、ColumnNumber 引数を 0 に設定した SQLGetData を呼び出すと、SQLSTATE HY090 (文字列またはバッファーの長さが無効) が返されます。 ただし、SQLGetData は、同じブックマークを取得するために複数回呼び出すことができます。

SQLSetStmtAttr

ODBC 2.x ドライバーを操作する ODBC 3.x アプリケーションが SQLSetStmtAttr を呼び出してSQL_ATTR_USE_BOOKMARKS属性をSQL_UB_VARIABLEに設定すると、ドライバー マネージャーは、基になる ODBC 2.x ドライバーで属性をSQL_UB_ONするように設定します。