Обработка нескольких результирующих наборов при помощи интерфейса IMultipleResults
Потребители используют интерфейс IMultipleResults для обработки результатов, возвращенных командой поставщика OLE DB для собственного клиента SQL Server. Когда поставщик OLE DB для собственного клиента SQL Server отправляет команду для выполнения, SQL Server выполняет инструкции и возвращает результаты.
Клиент должен обработать все результаты выполнения команды. Поскольку команда поставщика OLE DB для собственного клиента SQL Server может формировать в качестве результата несколько объектов набора строк, интерфейс IMultipleResults используется, чтобы приложение гарантированно завершило обмен данными, инициированный клиентом.
Следующая инструкция Transact-SQL формирует несколько наборов строк, при этом некоторые содержат данные строк из таблицы OrderDetails, а некоторые — результаты предложения COMPUTE BY:
SELECT OrderID, FullPrice = (UnitPrice * Quantity), Discount,
Discounted = UnitPrice * (1 - Discount) * Quantity
FROM OrderDetails
ORDER BY OrderID
COMPUTE
SUM(UnitPrice * Quantity), SUM(UnitPrice * (1 - Discount) * Quantity)
BY OrderID
Если потребитель выполняет команду, содержащую этот текст, и запрашивает набор строк в качестве интерфейса возвращаемых результатов, возвращается только первый набор строк. Потребитель может обработать все строки в возвращенном наборе строк. Но если свойство источника данных DBPROP_MULTIPLECONNECTIONS имеет значение VARIANT_FALSE, а в соединении не включен режим MARS, в объекте сеанса невозможно будет выполнить ни одну другую команду (поставщик OLE DB для собственного клиента SQL Server не создает другого соединения), пока не будет отменена команда. Если в соединении не включен режим MARS, поставщик OLE DB для собственного клиента SQL Server возвращает ошибку DB_E_OBJECTOPEN, если свойство DBPROP_MULTIPLECONNECTIONS имеет значение VARIANT_FALSE, и возвращает E_FAIL, если отсутствует активная транзакция.
Поставщик OLE DB для собственного клиента SQL Server возвратит также DB_E_OBJECTOPEN при использовании потоковых выходных параметров, а приложение не использовало все значения возвращенных параметров перед вызовом метода IMultipleResults::GetResults, чтобы получить следующий результирующий набор. Если режим MARS не включен и соединение занято выполнением команды, не производящей набор строк или производящей набор строк, который не является серверным курсором, а свойство источника данных DBPROP_MULTIPLECONNECTIONS имеет значение VARIANT_TRUE, поставщик OLE DB для собственного клиента SQL Server создает дополнительные соединения для поддержки параллельных объектов команды при отсутствии активной транзакции. В противном случае возвращается ошибка. Управление транзакциями и блокировками SQL Server производит отдельно для каждого соединения. Если создано второе соединение, команда в отдельном соединении не использует общие блокировки. Необходимо соблюдать осторожность и убедиться, что одна команда не блокирует другую, удерживая блокировки строк, запрошенных другой командой. Если включен режим MARS, в одном соединении могут быть активными несколько команд, а если выполняются явные транзакции, все команды совместно используют общую транзакцию.
Потребитель может отменить команду с помощью метода ISSAbort::Abort или освободив все удерживаемые ссылки на объект команды и производный набор строк.
Использование интерфейса IMultipleResults на всех экземплярах позволяет потребителю получить все наборы строк, сформированные командой, и соответствующим образом определить, когда нужно отменить выполнение команды, чтобы освободить объект сеанса для других команд.
Примечание |
---|
Если используются курсоры SQL Server, они создаются при выполнении команды. SQL Server возвращает успех или ошибку создания курсора, поэтому обмен данными с экземпляром SQL Server завершается по выполнении команды. Следовательно, каждый вызов GetNextRows становится обменом данными. Таким образом, могут существовать несколько активных объектов команд, каждая из которых обрабатывает набор строк, являющийся результатом выборки из серверного курсора. Дополнительные сведения см. в разделе Наборы строк и курсоры SQL Server. |