Введение в SQL Server Analysis Services для разработчика. Discover из ADOMD.NET
Средствами ADOMD.NET XMLA-запросы с методом Discover выполнять немного хитрее, чем Execute. Если ничтоже сумняшеся забабахать запрос из поста Метод Discover\Скрипт 1 в в AdomdCommand по аналогии, например, со Скриптом 2 поста про MDX-запросы, произойдет ошибка
Скрипт 1 Рис. 1 Это происходит потому, что, как уже неоднократно отмечалось выше, AdomdCommand воспринимает только InnerXml элемента <Command> XMLA-запроса, т.е. она может выполнять только запросы метода Execute. Ну вот так устроена ADOMD.NET. Для выполнения Discover-запросов в ADOMD.NET существет метод GetSchemaDataSet(), который выполняется непосредственно над соединением AdomdConnection. Первым параметром в нем является строка с названием риквест тайпа или его гуидом. Гуиды риквест тайпов можно видеть при помощи Скрипта 4 поста Метод Discover. Кроме того, добрые люди, писавшие ADOMD.NET, предусмотрели enum (перечислимый тип) AdomdSchemaGuid, который избавляет от необходимости обременять свою память или заниматься копи-пастом гуидов. Скажем, вместо строки "DBSCHEMA_CATALOGS" можно написать AdomdSchemaGuid.Catalogs и т.д. (см., к примеру, Рис.3).
Скрипт 2 Рис. 2 Как говорилось в посте Метод Discover, результатом Discover-запроса является реляционное множество записей (rowset). Его колонками являются те элементы, которые можно видеть в XSD-описании элемента <row> в результатах запроса Скрипт 1 поста Метод Discover:
Скрипт 3 Эти результаты можно видеть на Рис.1 поста Метод Discover повыше обведенного фрагмента. Это шапка. Значения Analysis Services берет из недр директории, где лежат данные. Что-нибудь типа %ProgramFiles%\Microsoft SQL Server\MSAS10_50.MSSQLSERVER\OLAP\Data, в зависимости от того, куда происходила установка. Дополнительными элементами канонического Discover-запроса в XMLA выступают Restrictions и Properties. В аналогичной ситуации Execute-запроса для передачи элементов запроса Parameters и Properties у AdomdCommand существовали свойства-коллекции Parameters и Properties – см., напр., Скрипт 2 поста Параметризованные MDX-запросы. В случае Discover-запроса для передачи Restrictions предназначен второй параметр метода GetSchemaDataSet типа object[] или AdomdRestrictionCollection, а Properties, похоже, не передаются никак. То есть выполнить запрос Скрипта 5 из предыдущего поста нам еще удастся, например, вот так:
Скрипт 4 или так:
Скрипт 5 А вот, допустим, как ему подсунуть
из Скрипта 2 (тоже предыдущего поста), я уже не знаю. Ну нет нигде для GetSchemaDataSet коллекции Properties. Видимо, просматривая список Properties (Скрипт 3 поста Метод Discover), эти добрые люди решили, что в плане PropertiesXMLA избыточен, хватит одних Restrictions. Я не поленился заглянуть в профайлер и обнаружил, что когда идет запрос через GetSchemaDataSet, судя по всему, всегда подставляется стандартный набор свойств:
где LocaleIdentifier определяется текущими установками, а база данных (Catalog), которая здесь явно не указана, по-видимому, берется из свойств соединения AdomdConnection.
Скрипт 5 Рис. 3 Кроме того, как мы помним, всегда остается способ в обход ADOMD заслать Analysis Services напрямую XMLA в чистом виде, т.е. SOAP-запрос по типу Скрипта 1 поста Доступ по SOAP. Автор: Алексей Шуленин |