Бөлісу құралы:


Динамические курсоры ODBC

Динамический курсор — это просто динамический. Он может обнаружить любые изменения, внесенные в членство, порядок и значения результирующий набор после открытия курсора. Например, предположим, что динамический курсор извлекает две строки, а другое приложение затем обновляет одну из них и удаляет другую. Если динамический курсор пытается получить ссылку на эти строки, он не найдет удаленную строку, но вернет новые значения для обновленной строки.

Динамические курсоры обнаруживают все обновления, удаления и вставки, как собственные, так и созданные другими пользователями. (Это зависит от уровня изоляции транзакции, заданного атрибутом подключения SQL_ATTR_TXN_ISOLATION.) Массив состояния строки, указанный атрибутом инструкции SQL_ATTR_ROW_STATUS_PTR, отражает эти изменения и может содержать SQL_ROW_SUCCESS, SQL_ROW_SUCCESS_WITH_INFO, SQL_ROW_ERROR, SQL_ROW_UPDATED и SQL_ROW_ADDED. Невозможно вернуть SQL_ROW_DELETED, так как динамический курсор не возвращает удаленные строки за пределами набора строк и поэтому больше не распознает существование удаленной строки в результирующем наборе или его соответствующем элементе в массиве состояния строки. SQL_ROW_ADDED возвращается только при обновлении строки вызовом SQLSetPos, а не при обновлении другим курсором.

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

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

SELECT * FROM Customers ORDER BY Name, CustID  

Чтобы получить следующий набор строк в этом результирующем наборе, имитированный курсор задает параметры в следующей инструкции SELECT значениям в последней строке текущего набора строк, а затем выполняет его:

SELECT * FROM Customers WHERE (Name > ?) AND (CustID > ?)  
   ORDER BY Name, CustID  

Эта инструкция создает второй результирующий набор, первый набор строк которого является следующим набором строк в исходном результирующем наборе. В этом случае набор строк в таблице Customers. Курсор возвращает этот набор строк приложению.

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