Написание приложений 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, SQLAlloc Подключение или SQLAllocStmt вызовами SQLAllocHandle соответствующим аргументом HandleType SQL_HANDLE_ENV, SQL_HANDLE_DBC или SQL_HANDLE_STMT.
Замените все вызовы SQLFreeEnv или SQLFree Подключение вызовами SQLFreeHandle соответствующим аргументом HandleType SQL_HANDLE_DBC или SQL_HANDLE_STMT.
Замените все вызовы SQLSet Подключение Option вызовами SQLSet Подключение Attr. Если задать атрибут, значение которого является строкой, задайте аргумент StringLength соответствующим образом. Измените аргумент атрибута с SQL_XXXX на SQL_ATTR_XXXX.
Замените все вызовы SQLGet Подключение Option вызовами SQLGet Подключение Attr. При получении строкового или двоичного атрибута задайте 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.
Этот раздел содержит следующие подразделы.