Переходы состояния

ODBC определяет дискретные состояния для каждой среды, каждого подключения и каждой инструкции. Например, среда имеет три возможных состояния: нераспределенные (в которых среда не выделена), выделенная (в которой среда выделена, но не выделены подключения), а также Подключение (в которой среда и один или несколько подключений выделены). Подключение имеют семь возможных состояний; заявления имеют 13 возможных состояний.

Определенный элемент, определяемый его дескриптором, перемещается из одного состояния в другое, когда приложение вызывает определенную функцию или функции и передает дескриптор этому элементу. Такое движение называется переходом состояния. Например, выделение дескриптора среды с помощью SQLAllocHandle перемещает среду из нераспределенной на выделенную, и освобождение этого дескриптора с помощью SQLFreeHandle возвращает его из выделенного в unallocated. ODBC определяет ограниченное количество переходов правового состояния, которое является другим способом сказать, что функции должны вызываться в определенном порядке.

Некоторые функции, такие как SQLGet Подключение Attr, не влияют на состояние вообще. Другие функции влияют на состояние одного элемента. Например, SQLDisconnect перемещает соединение из состояния Подключение ion в выделенное состояние. Наконец, некоторые функции влияют на состояние нескольких элементов. Например, выделение дескриптора соединения с помощью SQLAllocHandle перемещает соединение из нераспределенного состояния в выделенное состояние и перемещает среду из выделенного состояния в состояние Подключение ion.

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

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

С точки зрения приложения переходы состояния обычно просты: переходы правового состояния, как правило, идут рука об руку с потоком хорошо написанного приложения. Переходы состояния являются более сложными для диспетчера драйверов и драйверов, так как они должны отслеживать состояние среды, каждое подключение и каждую инструкцию. Большая часть этой работы выполняется диспетчером драйверов; большая часть работы, которую необходимо выполнить драйверами, происходит с инструкциями с ожидающими результатами.

Части 1 и 2 этого руководства (введение в ODBC и "Разработка приложений и драйверов") обычно не упоминание переходы состояния. Вместо этого они описывают порядок вызова функций. Например, "Выполнение инструкций" указывает, что инструкция должна быть подготовлена с помощью SQLPrepare , прежде чем ее можно будет выполнить с помощью SQLExecute. Полное описание состояний и переходов состояния, в том числе проверка диспетчером драйверов и которые должны быть проверка драйверами, см. в приложении B: таблицы перехода состояния ODBC.