Уроки Iczelion'а


Урок 2. Соединение с базой данных - часть 2


  Вышеуказанный синтаксис может утомить ваш взор, поэтому мы его немного упростим. SQLAllocHandle proto HandleType:DWORD, InputHandle:DWORD, OutputHandlePtr:DWORD

  SQLRETURN определен как тип SQLSMALLINT, SQLSMALLINT определен как короткое целое, т.e. слово (16 бит). Таким образом функция возвращает выходную величину в ax, а не в eax, что является очень важным. Однако параметр передаётся функции под Win32 в 32-битном стеке. Поэтому, даже если параметр определён как словный (16-бит) вы должны его расширить до 32-бит. Вот почему HandleType - dword вместо word. Вы можете свериться с библиотекой импорта: odbc32.lib. Вход для SQLAllocHandleэто _SQLAllocHandle@12. Эта запись означает, что комбинированный размер параметров составляет 12 байт (3 слова). Тем не менее, это не означает, что функциональный прототип C - неверный. SQLAllocHandle будет только использовать младшее слово HandleTypeи игнорировать старшее слово. Таким образом, функциональный прототип C - корректен пока наш asm-функциональный прототип соответствует сказанному выше.

  С типом SQL разберёмся более обстоятельно. Рассмотрим входные функциональные параметры и обратную величину.

  • HandleType - константа, которая определяет тип идентификатора, для которого вы хотите распределить память. Возможные величины:

    SQL_HANDLE_ENV идентификатор окружения
    SQL_HANDLE_DBC идентификатор соединения
    SQL_HANDLE_STMT идентификатор запроса
    SQL_HANDLE_DESC идентификатор дескриптора

    Дескриптор - это коллекция метаданных, которые описывают параметры инструкций SQL или столбцов с набором результатов, которые обрабатываются приложением или драйвером.

  • InputHandle - идентификатор родительского "контекста". Если вы хотите выделить память для идентификатора подключения, вы должны получить идентификатор окружения, потому что подключение будет сделано в контексте этого окружения. Если вы хотите выделить память для идентификатора окружения, этот параметр должен быть SQL_HANDLE_NULL (остерегайтесь значения SQL_HANDLE_NULL в windows.inc версии 1.18 и ниже, т.к. там допущена ошибка и определено ненадлежащим образом как 0L. Вы должны стереть "L",иначе ваша программа не будет транслироваться. Что касается операторных и дескрипторных идентификаторов, то вы должны передать идентификатор подключения как этот параметр.
  • OutputHandlePtr указывает на dword переменную, которая получит распределенный идентификатор, если запрос успешен.




- Начало -  - Назад -  - Вперед -



Книжный магазин