Поделиться через


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

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

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

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

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

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

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

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