Написание приложений ODBC 3.x

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

Атрибут среды SQL_ATTR_ODBC_VERSION должен иметь значение SQL_OV_ODBC2. Это гарантирует, что драйвер работает как драйвер ODBC 2.x с учетом изменений, описанных в разделе "Изменения поведения".

Если приложение будет использовать любой из функций, описанных в разделе "Новые функции", условный код следует использовать для определения того, является ли драйвер ODBC 3.x или ODBC 2.x драйвером. Приложение использует SQLGetDiagField и SQLGetDiagRec для получения ODBC 3.x SQLSTATEs при обработке ошибок в этих фрагментах условного кода. Следует учитывать следующие моменты о новых функциональных возможностях:

  • Приложение, затронутое изменением размера набора строк, должно быть осторожным, чтобы не вызывать SQLFetch , если размер массива больше 1. Эти приложения должны заменить вызовы SQLExtendedFetch вызовами SQLSetStmtAttr , чтобы задать атрибут инструкции SQL_ATTR_ARRAY_STATUS_PTR и SQLFetchScroll, чтобы они имели общий код, который работает с драйверами ODBC 3.x и ODBC 2.x . Так как SQLSetStmtAttr с SQL_ATTR_ROW_ARRAY_SIZE будет заменен на SQLSetStmtAttr с SQL_ROWSET_SIZE для драйверов ODBC 2.x, приложения могут просто задать SQL_ATTR_ROW_ARRAY_SIZE для операций множественного извлечения.

  • Большинство приложений, которые обновляются, на самом деле не влияют на изменения в кодах SQLSTATE. Для затронутых приложений можно выполнить автоматический поиск и замену в большинстве случаев, используя таблицу преобразования ошибок в разделе "Сопоставление SQLSTATE" для преобразования кодов ошибок ODBC 3.x в коды ODBC 2.x. Поскольку диспетчер драйверов ODBC 3.x будет выполнять сопоставление ODBC 2.x SQLSTATEs на ODBC 3.x SQLSTATEs, разработчикам приложений нужно проверять только ODBC 3.x SQLSTATEs и не беспокоиться о включении ODBC 2.x SQLSTATEs в условный код.

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

Обновление должно также включать следующие шаги.

  • Вызовите SQLSetEnvAttr перед выделением подключения, чтобы задать для атрибута среды SQL_ATTR_ODBC_VERSION значение SQL_OV_ODBC2.

  • Замените все вызовы SQLAllocEnv, SQLAllocConnect или SQLAllocStmt вызовами SQLAllocHandle соответствующим аргументом HandleType SQL_HANDLE_ENV, SQL_HANDLE_DBC или SQL_HANDLE_STMT.

  • Замените все вызовы SQLFreeEnv или SQLFreeConnect на вызовы SQLFreeHandle с соответствующим аргументом типа HandleType: SQL_HANDLE_DBC или SQL_HANDLE_STMT.

  • Замените все вызовы SQLSetConnectOption вызовами SQLSetConnectAttr. Если задать атрибут, значение которого является строкой, задайте аргумент StringLength соответствующим образом. Измените аргумент атрибута с SQL_XXXX на SQL_ATTR_XXXX.

  • Замените все вызовы SQLGetConnectOption вызовами SQLGetConnectAttr. При получении строкового или двоичного атрибута задайте bufferLength соответствующее значение и передайте аргумент StringLength . Измените аргумент атрибута с SQL_XXXX на SQL_ATTR_XXXX.

  • Замените все вызовы SQLSetStmtOption вызовами SQLSetStmtAttr. Если задать атрибут, значение которого является строкой, задайте аргумент StringLength соответствующим образом. Измените аргумент атрибута с SQL_XXXX на SQL_ATTR_XXXX.

  • Замените все вызовы SQLGetStmtOption вызовами SQLGetStmtAttr. При получении строкового или двоичного атрибута задайте bufferLength соответствующее значение и передайте аргумент StringLength . Измените атрибутный аргумент атрибута с SQL_XXXX на SQL_ATTR_XXXX.

  • Замените все вызовы SQLTransact вызовами SQLEndTran. Если самый правый верный дескриптор в вызове SQLTransact является дескриптором среды, аргумент HandleType SQL_HANDLE_ENV должен использоваться в вызове SQLEndTran с соответствующим аргументом Handle. Если самый правый действительный дескриптор в вызове SQLTransact является дескриптором подключения, то аргумент HandleType SQL_HANDLE_DBC должен быть использован в вызове SQLEndTran вместе с соответствующим аргументом Handle.

  • Замените все вызовы SQLColAttributes вызовами SQLColAttribute. Если аргумент FieldIdentifier имеет значение SQL_COLUMN_PRECISION, SQL_COLUMN_SCALE или SQL_COLUMN_LENGTH, не изменяйте ничего, кроме имени функции. В противном случае измените FieldIdentifier с SQL_COLUMN_XXXX на SQL_DESC_XXXX. Если FieldIdentifier SQL_DESC_CONCISE_TYPE и тип данных является типом данных datetime, измените его на соответствующий тип данных ODBC 3.x .

  • Если используются блоковые курсоры, прокручиваемые курсоры или оба, приложение выполняет следующие действия:

    • Задает размер набора строк, тип курсора и параллелизм курсора с помощью SQLSetStmtAttr.

    • Вызывает SQLSetStmtAttr, чтобы установить SQL_ATTR_ROW_STATUS_PTR, указывающим на массив записей состояния.

    • Вызывает SQLSetStmtAttr, чтобы установить указатель SQL_ATTR_ROWS_FETCHED_PTR на SQLINTEGER.

    • Выполняет необходимые привязки и выполняет инструкцию SQL.

    • Вызывает SQLFetchScroll в цикле для получения строк и перемещения по результирующем набору.

    • Если нужно выполнить выборку по закладке, приложение вызывает SQLSetStmtAttr, чтобы задать для переменной SQL_ATTR_FETCH_BOOKMARK_PTR значение закладки для строки, которую требуется получить, и вызывает SQLFetchScroll с аргументом FetchOrientation SQL_FETCH_BOOKMARK.

  • При использовании массивов параметров приложение выполняет следующие действия.

    • Вызывает SQLSetStmtAttr , чтобы задать атрибут SQL_ATTR_PARAMSET_SIZE размер массива параметров.

    • Вызывает функцию SQLSetStmtAttr, чтобы установить SQL_ATTR_ROWS_PROCESSED_PTR, указывая на внутреннюю переменную UDWORD.

    • Выполняет необходимые операции подготовки, привязки и выполнения.

    • Если выполнение останавливается по какой-либо причине (например, SQL_NEED_DATA), он может найти строку "текущих" параметров, проверяя расположение, на которое указывает SQL_ATTR_ROWS_PROCESSED_PTR.

Этот раздел содержит следующие подразделы.