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


Использование IMultipleResults для обработки нескольких результирующих наборов в собственном клиенте SQL Server

Применимо: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure azure Synapse Analytics Analytics Platform System (PDW)

Потребители используют интерфейс 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 Native Client OLE DB не будет создавать другое соединение), пока команда не будет отменена. Если 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 Native Client создает дополнительные подключения для поддержки параллельных объектов команд. Если транзакция не активна, в этом случае она возвращает ошибку. Транзакции и блокировка управляются SQL Server на основе каждого подключения. Если создано второе соединение, команда в отдельном соединении не использует общие блокировки. Необходимо соблюдать осторожность и убедиться, что одна команда не блокирует другую, удерживая блокировки строк, запрошенных другой командой. Если включен режим MARS, в одном соединении могут быть активными несколько команд, а если выполняются явные транзакции, все команды совместно используют общую транзакцию.

Потребитель может отменить команду с помощью метода ISSAbort::Abort или освободив все удерживаемые ссылки на объект команды и производный набор строк.

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

Примечание.

При использовании курсоров SQL Server выполнение команд создает курсор. SQL Server возвращает успех или сбой при создании курсора; Таким образом, циклический переход к экземпляру SQL Server завершается после возврата из выполнения команды. Следовательно, каждый вызов GetNextRows становится обменом данными. Таким образом, могут существовать несколько активных объектов команд, каждая из которых обрабатывает набор строк, являющийся результатом выборки из серверного курсора. Дополнительные сведения см. в статье Наборы строк и курсоры SQL Server.

См. также

Команды