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

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 または SQLFetchScroll の呼び出しと SQLBulkOperations の間で 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 ステートメント属性を挿入する行数に設定する必要があります。 前の行セット サイズに戻すには、SQLFetchSQLFetchScroll、または 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 ステートメント属性を設定する値に設定されます。

Note

アプリケーションが 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 はそれぞれ StatementHandleAttribute および ValuePtr の値に設定されます。 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 は無視されます。

Note

接続レベルでステートメント属性を設定する機能は非推奨になりました。 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 は、それぞれ StatementHandleAttribute および ValuePtr の値に設定されます。 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 アプリケーションは、APD で SQL_DESC_ARRAY_SIZE フィールドを明示的に設定していない場合でも、SQLGetStmtAttr を呼び出して 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 ドライバー マネージャーは BufferLength 引数が 4 未満か 4 より大きいかを確認し、その場合は SQLSTATE HY090 (文字列またはバッファーの長さが無効) を返します。 BufferLength 引数が 4 の場合、ドライバー マネージャーは、fCType を SQL_C_BOOKMARK に置き換えた後、ドライバーで SQLBindCol を呼び出します。

SQLColAttribute

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

FieldIdentifier Value
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 を呼び出すと、ドライバー マネージャーは次の表に示す値を返します。

バッファー Value
[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 に設定します。