(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Введение в SQL Server Analysis Services для разработчика. ADOMD.NET.

Существуют средства доступа, берущие на себя накладные расходы, но, как и в любой программной модели, за это приходится платить снижением гибкости и полноты контроля. Наиболее популярным таким средством является ADOMD.NET - аналог ADO.NET для многомерных данных. Библиотека ADOMD.NET ставится в составе SQL Server, либо ее можно скачать и установить отдельно. Она раздается в составе SQL Server Feature Pack. Для SQL Server 2008 R2 ее на данный момент можно взять здесь (СТР3 - ноябрь 2009). Для просто SQL Server 2008 ее на данный момент можно взять здесь (октябрь 2009).  Найдите в перечне фич Microsoft ADOMD.NET и скачайте. Для SQL Server 2005 тоже где-то есть.

Рассмотрим в качестве примера отправку XMLA-запроса с помощью ADOMD.NET.

Создайте новое консольное приложение. Предварительно в проект требуется добавить ссылку на C:\Program Files\Microsoft.NET\ADOMD.NET\100\Microsoft.AnalysisServices.AdomdClient.dll:

image

Рис.1

Разрешите использование типов в пространстве имен Microsoft.AnalysisServices.AdomdClient:

image

Рис.2

Запустите на выполнение код:

using System;

using Microsoft.AnalysisServices.AdomdClient;

using System.Diagnostics;

class Program

{

    static void Main(string[] args)

    {

        string xmla = @"<Statement>SELECT Measures.MEMBERS ON COLUMNS FROM [Adventure Works]</Statement>";

        AdomdConnection cnn = new AdomdConnection("Data Source=http://192.168.0.29/msolap/msmdpump.dll; User ID=192.168.0.29\\Administrator; Password=AbraCada<br>a");

        cnn.Open();

        AdomdCommand cmd = new AdomdCommand(xmla, cnn);

        cmd.Properties.Add("Catalog", "Adventure Works DW 2008R2");

        cmd.Properties.Add("Format", "Multidimensional");

        cmd.Properties.Add("AxisFormat", "TupleFormat");

        CellSet res = cmd.ExecuteCellSet();

        cnn.Close();

        Debug.WriteLine("");

        foreach (Cell c in res.Cells) Debug.Write(String.Format("{0} ; ", c.FormattedValue));

        Debug.WriteLine("\n");

    }

}

Скрипт 1

Для счастливчиков, успевших установить Visual Studio 2010 Release Candidate, - получите ошибку The type or namespace name 'AnalysisServices' does not exist in the namespace 'Microsoft' (are you missing an assembly reference?). И это невзирая на то, что IntelliSence только что его прекрасно видел. Зайдите в свойства проекта и исправьте Target framework c .NET Framework 4 Client Profile, который VS по умолчанию ставит для консольных приложений и Win-форм, на полный .NET Framework 4:

image

Рис.3

Снова запустите приложение на выполнение. Теперь оно выполнится нормально

image

Рис.4

и мы можем продолжить наш разговор про ADO.NET. Во-первых, ADOMD.NET предоставляет модель доступа, инвариантную по отношению к протоколу. В случае, когда в качестве Data Source выступает ISAPI dll (с префиксом http://), ADOMD.NET шлет SOAP-запрос по HTTP. Мы могли бы написать в качестве Data Source просто имя OLAP-сервера:

AdomdConnection cnn = new AdomdConnection("Data Source=192.168.0.29;");

cnn.Open();

Скрипт 2

В этом случае SOAP-запрос автоматически отправлялся бы по ТСР. Понятно, что когда на пути нет IISа, осуществляющего промежуточную аутентификацию, MS AS будет аутентифицировать по Windows credentials и указывать User ID; Password не требуется.

Во-вторых, обратите внимание на урезанный вид XMLA-запроса в Скрипте 1 по сравнению со Скриптом 1 из предыдущего поста. От него остался только элемент Statement:

<Statement>SELECT Measures.MEMBERS ON COLUMNS FROM [Adventure Works]</Statement>

Скрипт 3

Если попытаться запихать запрос в ADOMD.NET в его первоначальном полном варианте (см. Скрипт 1 из поста MDX и XMLA):

<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>

  <soap:Body>

    <Execute xmlns='urn:schemas-microsoft-com:xml-analysis'>

      <Command>

        <Statement>SELECT Measures.MEMBERS ON COLUMNS FROM [Adventure Works]</Statement>

      </Command>

      <Properties>

...

</soap:Envelope>

Скрипт 4

произойдет ошибка The soap:Envelope element at line 7, column 85 (namespace http://schemas.xmlsoap.org/soap/envelope/) cannot appear under Envelope/Body/Execute/Command, из которой следует, что ADOMD.NET за нас заворачивает текст команды в SOAP-конверт. Следовательно, в качестве текста AdomdCommand потребляется InnerXml элемента Command XMLA-запроса. Что мы и видели на примере окна MDX-запроса в SSMS. См., напр., Рис.3 в посте XMLA DDL. Тот пример на команду резервного копирования можно выполнить из ADOMD.NET следующим образом:

cnn.Open();

AdomdCommand cmd = new AdomdCommand(

@"<Backup xmlns='http://schemas.microsoft.com/analysisservices/2003/engine'>                 

    <Object>

       <DatabaseID> Adventure Works DW 2008R2</DatabaseID>

    </Object>

    <File>Adventure Works DW.abf</File> 

    <AllowOverwrite>true</AllowOverwrite>

  </Backup>",

                             cnn);

cmd.Execute();

cnn.Close();

Скрипт 5

Т.е. Inner XML из элемента Command, как и говорилось выше.

В случае MDX Query в SSMS для DML-запросов можно опускать не только скобки в виде элемента Command, но и вообще ограничиться Inner XML из элемента Statement. Так, от нашего первоначального SOAP XMLA-запросa (Скрипт 1 из поста MDX и XMLA) в результате остается только

image

Рис.5

а в Скрипте 1, соответственно -

string xmla = "SELECT Measures.MEMBERS ON COLUMNS FROM [Adventure Works]";

...

Скрипт 6

Невозможность послать через ADOMD.NET полноценный XMLA-запрос, а только его подмножество в виде элемента Command вызывает некоторый дискомфорт. Внутри элемента Execute наряду с Command идут также Properties и Parameters (http://msdn.microsoft.com/en-us/library/ms186691.aspx). Если AdomdCommand оперирует только с внутренностью элемента Command, как передать ей свойства и параметры? Далее, как быть с методом Discover, про который еще толком не говорилось, только упоминалось, что он есть наравне с Execute? Он ведь вообще не имеет элемента Command. Там различие начинается на более высоком уровне. Что в этом случае выполнять в ADOMD.NET?

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 16.03.2010 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Microsoft Office для дома и учебы 2019 (лицензия ESD)
Microsoft Office 365 Персональный 32-bit/x64. 1 ПК/MAC + 1 Планшет + 1 Телефон. Все языки. Подписка на 1 год.
Microsoft 365 Business Standard (corporate)
Microsoft Windows Professional 10, Электронный ключ
Microsoft 365 Business Basic (corporate)
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Безопасность компьютерных сетей и защита информации
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
Программирование на Visual Basic/Visual Studio и ASP/ASP.NET
Мастерская программиста
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100