Сопоставление замещающих функций для обеспечения обратной совместимости приложений

Приложение ODBC 3.x, работающее через диспетчер драйверов ODBC 3.x, будет работать с драйвером ODBC 2.x, пока новые функции не используются. Однако повторяющиеся функциональные возможности и изменения поведения влияют на то, как приложение ODBC 3.x работает на драйвере ODBC 2.x. При работе с драйвером ODBC 2.x диспетчер драйверов сопоставляет следующие функции ODBC 3.x, которые заменили одну или несколько функций ODBC 2.x, в соответствующие функции ODBC 2.x.

Функция ODBC 3.x Функция ODBC 2.x
SQLAllocHandle SQLAllocEnv, SQLAlloc Подключение или SQLAllocStmt
SQLBulkOperations Sqlsetpos
SQLColAttribute SQLColAttributes
SQLEndTran SQLTransact
SQLFetch Sqlextendedfetch
SQLFetchScroll Sqlextendedfetch
SQLFreeHandle SQLFreeEnv, SQLFree Подключение или SQLFreeStmt
SQLGetConnectAttr SQLGet Подключение Option
SQLGetDiagRec Sqlerror
SQLGetStmtAttr SQLGetStmtOption[1]
SQLSetConnectAttr SQLSet Подключение Option
SQLSetStmtAttr SQLSetStmtOption[1]

[1] Другие действия также могут выполняться в зависимости от запрошенного атрибута.

SQLAllocHandle

Диспетчер драйверов сопоставляет это с SQLAllocEnv, SQLAlloc Подключение или 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. Если аргумент операции SQL_ADD, диспетчер драйверов вызывает SQLSetPos следующим образом:

    SQLSetPos (hstmt, 0, SQL_ADD, SQL_LOCK_NO_CHANGE);  
    
  2. Если аргумент операции не SQL_ADD, драйвер возвращает SQLSTATE HY092 (недопустимый идентификатор атрибута или параметра).

  3. Если приложение пытается изменить SQL_ATTR_ROW_STATUS_PTR между вызовами SQLFetch или SQLFetchScroll и SQLBulkOperations, диспетчер драйверов вернет SQLSTATE HY011 (атрибут нельзя задать сейчас).

  4. Если аргумент операции SQL_ADD, приложение должно вызвать SQLBindCol , чтобы привязать данные для вставки. Не удается вызвать SQLSetDescField или SQLSetDescRec , чтобы привязать данные для вставки.

  5. Если аргумент операции SQL_ADD, а количество строк, которые необходимо вставить, не совпадает с текущим размером набора строк, необходимо вызвать SQLSetStmtAttr, чтобы задать атрибут инструкции SQL_ATTR_ROW_ARRAY_SIZE число вставленных строк перед вызовом SQLBulkOperations. Чтобы отменить изменения обратно к предыдущему размеру набора строк, приложение должно задать атрибут инструкции SQL_ATTR_ROW_ARRAY_SIZE перед вызовом SQLFetch, SQLFetchScroll или SQLSetPos.

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

    Диспетчер драйверов возвращает SQL_ERROR с помощью SQLSTATE HY091 (недопустимый идентификатор поля дескриптора). Дополнительные правила этого раздела не применяются.

  2. Диспетчер драйверов сопоставляет SQL_COLUMN_COUNT, SQL_COLUMN_NAME или SQL_COLUMN_NULLABLE с SQL_DESC_COUNT, SQL_DESC_NAME или SQL_DESC_NULLABLE соответственно. (ODBC Драйвер 2.x должен поддерживать только SQL_COLUMN_COUNT, SQL_COLUMN_NAME и SQL_COLUMN_NULLABLE, а не SQL_DESC_COUNT, SQL_DESC_NAME и SQL_DESC_NULLABLE.) Вызов SQLColAttribute сопоставляется с:

    SQLColAttributes(StatementHandle, ColumnNumber, FieldIdentifier, CharacterAttributePtr, BufferLength, StringLengthPtr, NumericAttributePtr);  
    
  3. Все остальные значения FieldIdentifier передаются драйверу, при этом SQLColAttribute сопоставляется с SQLColAttributes , как показано ранее.

  4. Если BufferLength меньше 0, диспетчер драйверов возвращает SQL_ERROR с SQLSTATE HY090 (недопустимая длина строки или буфера). Дополнительные правила этого раздела не применяются.

  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

Диспетчер драйверов сопоставляет это с SQLExtendedFetch аргументом FetchOrientation SQL_FETCH_NEXT. Следующий вызов SQLFetch:

SQLFetch (StatementHandle);  

Приведет к вызову SQLExtendedFetch диспетчера драйверов, как показано ниже.

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

В этом вызове аргумент pcRow имеет значение, которое приложение задает атрибуту инструкции SQL_ATTR_ROWS_FETCHED_PTR через вызов SQLSetStmtAttr.

Примечание.

Когда приложение вызывает SQLSetStmtAttr , чтобы задать SQL_ATTR_ROW_STATUS_PTR указывать на массив состояния, диспетчер драйверов кэширует указатель. RowStatusArray может иметь значение NULL- указателя.

Если драйвер не поддерживает SQLExtendedFetch и загружает библиотеку курсоров, диспетчер драйверов использует SQLExtendedFetch для сопоставления SQLFetch с SQLExtendedFetch с SQLExtendedFetch. Если драйвер не поддерживает 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 (который задает поле SQL_DESC_ARRAY_STATUS_PTR в IRD), чтобы указать массив состояния, диспетчер драйверов кэширует этот указатель. Пусть этот указатель будет 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 (тип Fetch вне диапазона). Дополнительные правила этого раздела не применяются.

  3. Регистр:

  • Если FetchOrientation равно SQL_FETCH_BOOKMARK, то:

    • Если sqlSetStmtAttr был вызван ранее, чтобы задать значение SQL_ATTR_FETCH_BOOKMARK_PTR, то пусть Bmk будет значением, полученным путем расшифровки указателя SQL_DESC_FETCH_BOOKMARK_PTR.

    • В противном случае вернитесь SQL_ERROR с SQLSTATE HY111 (недопустимое значение закладки). Дополнительные правила этого раздела не применяются.

    Диспетчер драйверов теперь вызывает SQLExtendedFetch следующим образом:

    rc = SQLExtendedFetch(StatementHandle, FetchOrientation, Bmk, pcRow, RowStatusArray);  
    
  • В противном случае диспетчер драйверов вызывает SQLExtendedFetch следующим образом:

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

    В этих вызовах аргумент pcRow имеет значение, которое приложение задает атрибуту инструкции SQL_ATTR_ROWS_FETCHED_PTR через вызов SQLSetStmtAttr.

  • 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

Диспетчер драйверов сопоставляет это с SQLFreeEnv, SQLFree Подключение или 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

Диспетчер драйверов сопоставляет это с SQLGet Подключение Option. Следующий вызов SQLGet Подключение Attr:

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

приведет к следующей последовательности шагов:

  1. Если атрибут не является атрибутом, определяемым драйвером или оператором, и не является атрибутом, определенным в ODBC 2.x, диспетчер драйверов возвращает SQL_ERROR с sqlSTATE HY092 (недопустимый идентификатор атрибута или параметра). Дополнительные правила в этом разделе не применяются.

  2. Если атрибут равен SQL_ATTR_AUTO_IPD или SQL_ATTR_METADATA_ID, диспетчер драйверов возвращает SQL_ERROR с помощью SQLSTATE HY092 (недопустимый идентификатор атрибута или параметра).

  3. Диспетчер драйверов выполняет необходимые проверка, чтобы узнать, нужно ли вызвать ошибку SQLSTATE 08003 (Подключение ion не открыто) или SQLSTATE HY010 (ошибка последовательности функций). В этом случае диспетчер драйверов возвращает SQL_ERROR и отправляет соответствующее сообщение об ошибке. Дополнительные правила этого раздела не применяются.

  4. Диспетчер драйверов вызывает SQLGet Подключение Option следующим образом:

    SQLGetConnectOption (ConnectionHandle, Attribute, ValuePtr);  
    

    Обратите внимание, что буферLength и StringLengthPtr игнорируются.

SQLGetData

Когда приложение ODBC 3.x, работающее с драйвером ODBC 2.x, вызывает SQLGetData с аргументом ColumnNumber равным 0, диспетчер драйверов ODBC 3.x сопоставляет это с вызовом SQLGetStmtOption с атрибутом Option, заданным для SQL_GET_BOOKMARK.

SQLGetStmtAttr

Диспетчер драйверов сопоставляет это с SQLGetStmtOption. Следующий вызов SQLGetStmtAttr:

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

приведет к следующей последовательности шагов:

  1. Если атрибут не является атрибутом, определяемым драйвером или оператором, и не является атрибутом, определенным в ODBC 2.x, диспетчер драйверов возвращает SQL_ERROR с sqlSTATE HY092 (недопустимый идентификатор атрибута или параметра). Дополнительные правила в этом разделе не применяются.

  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

    Диспетчер драйверов возвращает SQL_ERROR с помощью SQLSTATE HY092 (недопустимый идентификатор атрибута или параметра). Дополнительные правила этого раздела не применяются.

  3. Диспетчер драйверов выполняет необходимые проверка, чтобы узнать, нужно ли вызывать SQLSTATE HY010 (ошибка последовательности функций). В этом случае диспетчер драйверов возвращает SQL_ERROR и SQLSTATE HY010 (ошибка последовательности функций). Дополнительные правила этого раздела не применяются.

  4. Если атрибут равен SQL_ATTR_ROWS_FETCHED_PTR, диспетчер драйверов возвращает указатель на внутреннюю переменную диспетчера драйверов, которую он использовал или будет использовать в вызове SQLExtendedFetch. Дополнительные правила этого раздела не применяются.

  5. Если атрибут равен SQL_DESC_FETCH_BOOKMARK_PTR, диспетчер драйверов возвращает соответствующий указатель, который он кэшировал во время вызова SQLSetStmtAttr.

  6. Если атрибут равен SQL_ATTR_ROW_STATUS_PTR, диспетчер драйверов возвращает соответствующий указатель, который он кэшировал во время вызова SQLSetStmtAttr.

  7. Диспетчер драйверов вызывает SQLGetStmtOption следующим образом:

    SQLGetStmtOption (hstmt, fOption, pvParam);  
    

    где hstmt, fOption и pvParam будут иметь значения StatementHandle, Attribute и ValuePtr соответственно. БуферLength и StringLengthPtr игнорируются.

SQLSetConnectAttr

Диспетчер драйверов сопоставляет это с SQLSet Подключение Option. Следующий вызов SQLSet Подключение Attr:

SQLSetConnectAttr(ConnectionHandle, Attribute, ValuePtr, StringLength);  

приведет к следующей последовательности шагов:

  1. Если атрибут не является атрибутом, определяемым драйвером или оператором, и не является атрибутом, определенным в ODBC 2.x, диспетчер драйверов возвращает SQL_ERROR с sqlSTATE HY092 (недопустимый идентификатор атрибута или параметра). Дополнительные правила в этом разделе не применяются.

  2. Если атрибут равен SQL_ATTR_AUTO_IPD, диспетчер драйверов возвращает SQL_ERROR с помощью SQLSTATE HY092 (недопустимый идентификатор атрибута или параметра).

  3. Диспетчер драйверов выполняет необходимые проверка, чтобы узнать, нужно ли вызывать SQLSTATE 08003 (Подключение ion не открыт) или SQLSTATE HY010 (ошибка последовательности функций). Если необходимо вызвать одну из этих ошибок, диспетчер драйверов возвращает SQL_ERROR и отправляет соответствующее сообщение об ошибке. Дополнительные правила этого раздела не применяются.

  4. Диспетчер драйверов вызывает SQLSet Подключение Option следующим образом:

    SQLSetConnectOption (hdbc, fOption, vParam);  
    

    где hdbc, fOption и vParam будут иметь значения Подключение ionHandle, Attribute и ValuePtr соответственно. StringLengthPtr игнорируется.

Примечание.

Возможность задавать атрибуты инструкции на уровне подключения устарела. Атрибуты инструкции никогда не должны устанавливаться на уровне подключения приложением ODBC 3.x .

SQLSetStmtAttr

Диспетчер драйверов сопоставляет это с SQLSetStmtOption. Следующий вызов SQLSetStmtAttr:

SQLSetStmtAttr(StatementHandle, Attribute, ValuePtr, StringLength);  

приведет к следующей последовательности шагов:

  1. Если атрибут не является атрибутом, определяемым драйвером или оператором, и не является атрибутом, определенным в ODBC 2.x, диспетчер драйверов возвращает SQL_ERROR с sqlSTATE HY092 (недопустимый идентификатор атрибута или параметра). Дополнительные правила в этом разделе не применяются.

  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

    Диспетчер драйверов возвращает SQL_ERROR с помощью SQLSTATE HY092 (недопустимый идентификатор атрибута или параметра). Дополнительные правила этого раздела не применяются.

  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);  
    

    где hstmt, fOption и vParam будут иметь значения StatementHandle, Attribute и 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 может вызывать SQLGetStmtAttr , чтобы получить значение SQL_ATTR_PARAMS_PROCESSED_PTR даже если оно явно не задало поле SQL_DESC_ARRAY_SIZE в APD. Эта ситуация может возникнуть, например, если приложение имеет универсальную подпрограмму, которая проверка для текущей строки параметров, обрабатываемых при возврате SQLExecute SQL_NEED_DATA. Эта подпрограмма вызывается независимо от того, является ли SQL_DESC_ARRAY_SIZE 1 или больше 1. Чтобы учесть это, диспетчер драйверов должен определить эту внутреннюю переменную, если приложение назвало SQLSetStmtAttr , чтобы задать поле SQL_DESC_ARRAY_SIZE в APD. Если SQL_DESC_ARRAY_SIZE не задано, диспетчер драйверов должен убедиться, что эта переменная содержит значение 1 до возвращения из SQLExecDirect или SQLExecute.

Обработка ошибок

В ODBC 3.x вызов SQLFetch или SQLFetchScroll заполняет SQL_DESC_ARRAY_STATUS_PTR в IRD, а поле SQL_DIAG_ROW_NUМБ ER заданной диагностической записи содержит число строк в наборе строк, к которому относится эта запись. С помощью этого приложение может сопоставить сообщение об ошибке с заданной позицией строки.

Драйвер ODBC 2.x не сможет предоставить эту функцию. Однако он предоставит демаркацию ошибок с SQLSTATE 01S01 (ошибка в строке). Приложение ODBC 3.x, использующее SQLFetch или SQLFetchScroll при переходе к драйверу ODBC 2.x, необходимо учитывать этот факт. Обратите внимание, что такое приложение не сможет вызвать SQLGetDiagField, чтобы на самом деле получить поле SQL_DIAG_ROW_NUМБ ER в любом случае. Приложение ODBC 3.x, работающее с драйвером ODBC 2.x, сможет вызывать SQLGetDiagField только с аргументом DiagIdentifier SQL_DIAG_MESSAGE_TEXT, SQL_DIAG_NATIVE, SQL_DIAG_RETURNCODE или SQL_DIAG_SQLSTATE. Диспетчер драйверов ODBC 3.x поддерживает структуру диагностических данных при работе с драйвером ODBC 2.x, но драйвер ODBC 2.x возвращает только эти четыре поля.

Если приложение ODBC 2.x работает с драйвером ODBC 2.x, если операция может вызвать несколько ошибок, возвращаемых диспетчером драйверов, разные ошибки могут быть возвращены диспетчером драйверов ODBC 3.x, чем диспетчером драйверов ODBC 2.x.

Сопоставления операций закладки

Диспетчер драйверов ODBC 3.x выполняет следующие сопоставления, когда приложение ODBC 3.x, работающее с драйвером ODBC 2.x, выполняет операции с закладками.

SQLBindCol

Когда приложение ODBC 3.x, работающее с драйвером ODBC 2.x, вызывает SQLBindCol для привязки к столбцу 0 с fCType равным SQL_C_VARBOOKMARK, диспетчер драйверов ODBC 3.x проверка, чтобы узнать, равен ли аргумент BufferLength меньше 4 или больше 4, а если да, возвращает SQLSTATE HY090 (недопустимая строка или длина буфера). Если аргумент BufferLength равен 4, диспетчер драйверов вызывает SQLBindCol в драйвере после замены fCType SQL_C_BOOKMARK.

SQLColAttribute

Когда приложение ODBC 3.x, работающее с драйвером ODBC 2.x, вызывает SQLColAttribute с аргументом ColumnNumber значение 0, диспетчер драйверов возвращает значения 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 3.x, работающее с драйвером ODBC 2.x, вызывает SQLDescribeCol с аргументом ColumnNumber значение 0, диспетчер драйверов возвращает значения, перечисленные в следующей таблице.

Buffer Значение
ColumnName "" (пустая строка)
*NameLengthPtr 0
*DataTypePtr SQL_BINARY
*ColumnSizePtr 4
*DecimalDigitsPtr 0
*NullablePtr SQL_NO_NULLS

SQLGetData

Когда приложение ODBC 3.x, работающее с драйвером ODBC 2.x, вызывает sqlGetData для получения закладки:

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

Вызов сопоставляется с SQLGetStmtOption с fOption SQL_GET_BOOKMARK следующим образом:

SQLGetStmtOption(hstmt, SQL_GET_BOOKMARK, TargetValuePtr)  

где hstmt и pvParam задаются значения в StatementHandle и TargetValuePtr соответственно. Закладка возвращается в буфере, на который указывает аргумент pvParam (TargetValuePtr). Значение в буфере, на которое указывает аргумент StrLen_or_IndPtr в вызове SQLGetData , имеет значение 4.

Это сопоставление необходимо учитывать для случая, в котором sqlFetch был вызван до вызова SQLGetData и драйвера ODBC 2.x не поддерживает SQLExtendedFetch. В этом случае SQLFetch передается драйверу ODBC 2.x , в этом случае извлечение закладок не поддерживается.

SQLGetData нельзя вызывать несколько раз в драйвере ODBC 2.x для получения закладки в частях, поэтому вызов SQLGetData с аргументом BufferLength имеет значение меньше 4, а аргумент ColumnNumber имеет значение 0, возвращает SQLSTATE HY090 (недопустимая строка или длина буфера). Однако SQLGetData может вызываться несколько раз, чтобы получить одну закладку.

SQLSetStmtAttr

Когда приложение ODBC 3.x, работающее с драйвером ODBC 2.x, вызывает SQLSetStmtAttr для задания атрибута SQL_ATTR_USE_BOOKMARKS SQL_UB_VARIABLE, диспетчер драйверов устанавливает атрибут для SQL_UB_ON в базовом драйвере ODBC 2.x.