2009-05-07 2 views
12

Дано: Механизм вычисления C#, который загружает объектную модель, сжимает огромное количество чисел и сохраняет результаты в пару гигантских мегаиндексированных таблиц базы данных в SQL Server. Эти таблицы предоставляют данные для веб-интерфейсов, других программных модулей и отчетов SQL Server Reporting Services 2005.Как получить данные, отличные от таблицы, в SQL Server Reporting Services?

Мне удалось сделать двигатель лот быстрее в последней версии программного обеспечения, достаточно быстро, чтобы он мог предоставлять данные по запросу - иногда даже быстрее, чем время, необходимое для запроса базы данных для предварительной вычисляемые числа. Я очень доволен этим.

Этот прорыв означает, что мы можем генерировать данные по запросу для веб-интерфейсов и других программных модулей. Но таблицы кэша еще не могут умереть, потому что они потребляются отчетами SSRS (или, более конкретно, хранимыми процедурами, которые запрашивают таблицы и предоставляют данные для SSRS.)

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

Но как еще я могу получить данные в SSRS? Я провел довольно много исследований и ничего не выглядел слишком многообещающе:

  • Мы могли бы предоставить данные через веб-службу и использовать SSRS XML DPE. Но это выглядит отвратительно - я прав, что вам нужно самостоятельно разобрать свой SOAP-конверт ?! И он не поддерживает XPath, а проприетарный диалект XPath-y? Наши авторы отчетов знают T-SQL, и это то, на что они лучше всего.
  • Использование SQL CLR для размещения нашего API нежелательно - это большое приложение, и вы ничего не можете сделать без создания объекта приложения и входа в систему и т. Д.
  • Использование SQL CLR для связи с веб-службой на веб-приложение - это наиболее перспективно до сих пор (эта статья была полезной http://www.simple-talk.com/sql/sql-server-2005/practical-sql-server-2005-clr-assemblies/.) Кто-нибудь пробовал этот подход? Он работает нормально, может ли он предоставлять большие наборы данных? OTOH Я отключен дополнительной настройкой, которую нам нужно будет делать на клиентских серверах БД.
  • Любые другие предложения были бы высоко оценены.
+0

Я добавил щедрость для всех, кто может предоставить мне хороший опыт/информацию/спецификации/номера о том, можно ли с этим справиться с помощью SQLCLR/Web Services или любыми другими хорошими идеями, которые помогут в этой ситуации. –

+0

Привет, правильно ли я понимаю, что таблицы кэша используются в основном для SSRS для целей отчетности? Похоже, что отчетность является аспектом вашего приложения/решений, но из-за этого аспекта он вызывает некоторую неприятную работу БД для целей отчетности? –

+0

Правильно Рихан. Отчетность является компонентом приложения, а скверные таблицы существуют только для предоставления данных для отчетов. –

ответ

9

Если вы правильно поняли, вы строите отчет по не-SQL-данным. Вы храните данные в таблицах с конкретной целью сделать их отчетными.

Я могу представить два решения. Первый заключается в том, чтобы расширить ваш вычислительный механизм C# с помощью reporting part. Пространства имен Microsoft.Reporting.WinForms и Microsoft.Reporting.WebForms могут использоваться для создания отчетов по любому источнику данных, а не только по SQL Server. Если конечные пользователи используют ваше приложение в качестве клиента, вы можете генерировать данные и отчеты «на лету».

Второй способ - использовать SQL CLR. Вы можете использовать хранимую процедуру CLR в качестве основы для отчета (введите «exec mysp» в качестве источника данных.) Эта процедура CLR является кодом C# и может включать в себя ваш механизм вычислений в виде библиотеки. Это позволит вам генерировать отчеты «на лету», все еще используя пользовательский интерфейс сервера отчетов.

Интересный вопрос, и я надеюсь, что более знающие люди могут обеспечить лучший ответ :)

+0

Отчетные части очень интересны! Я еще этого не нашел. К сожалению, наши клиенты полагаются на такие функции SSRS, как автоматическая доставка и планирование отчетов, поэтому переполнение нашей собственной отчетности для подмножества отчетов приложения не собирается этого делать. –

+0

Означает ли это, что вы собираетесь делать SQL CLR? – Gator

+0

Gator, это означает, что я должен использовать опцию, которая позволяет мне отображать отчеты SSRS с сервера SSRS. Это может означать SQLCLR, SQLCLR-WebService, WebService-XMLDPE или любые другие идеи, которые возникают у вопроса. –

3

Я был в подобной ситуации ранее и попытался как источник данных XML SSRS и расширение отчетности, Andomar упоминает ,Моя рекомендация - использовать функцию источника данных SSRS XML. Если структура данных, возвращаемая веб-службой, проста, XPath также прост. Мне также стало легче отлаживать. Главное, чтобы следить за таймаутами.

Хорошая вещь с использованием веб-служб заключается в том, что они легко потребляются многими различными технологиями, поэтому они могут стать очень удобными в любом случае.

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

+0

+1 В этом вопросе упоминается «Использование SQL CLR для связи с веб-службой в веб-приложении», но с источником данных XML вы можете связаться с веб-службой без SQL CLR. – Andomar

+0

Правильно. Это то, о чем я говорил, станет более ясным. –

3

Вы можете обернуть свои данные в ADO.NET DataSet and use it as a Reporting Services Data Source..

Я никогда лично не использовал это, поэтому я не могу дать вам больше информации. Тем не менее, я знал, что вы можете сделать это из класса SSRS, в котором я учился. Пример, который преподаватель дал мне, когда вы сделаете это в примере «реального мира», будет, если вам нужно объединить данные из двух разных источников данных. Например, вы сделали бы это, если бы хотели бы сопоставить данные из SQL Server и Oracle вместе в одном отчете.

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

+0

Расширение пользовательской обработки данных, безусловно, является новой идеей в этой дискуссии. Образец описывает настроенный ADO.NET DPE, который считывает исправленные файлы xml с дисковых мест, что явно не очень практично в реальном мире. Я думаю, что я мог бы создать DPE, который использует URL-адрес веб-службы в качестве строки подключения, а затем имя метода с параметрами в качестве запроса - правильно ли это звучит? –

+0

Я никогда не реализовывал это, поэтому я не могу дать вам никаких практических советов из опыта. Это, как говорится, похоже на тот подход, который я бы принял. У вас уже есть веб-сервис? Если это так, то маскировка его вызовов за интерфейсами .NET Data Provider (esque) звучит как способ пойти. Если нет, и у вас есть библиотека .NET, то, возможно, прицепить его методы API будет лучше. Вы бы избежали накладных расходов на SOAP и еще много чего. Это была одна из тех вещей, которые я заправил в глубине души и никогда не имел возможности использовать ее. –

2

Рассматривали ли вы свой собственный драйвер базы данных, который находится на вершине вашего вычислительного механизма? Затем вы можете указать службы отчетности прямо на него. Это будет держать вещи быстро, хотя это может быть сложной задачей. Я уже давно это рассматривал в отношении запатентованного программного обеспечения для хранилища данных, над которым я работал, но так и не получил, чтобы построить драйвер.

Большой вопрос кстати.

+0

Крис, конечно же, указывает на внешний вид, но я не уверен, что дополнительная работа дает какие-либо преимущества перед написанием специального расширения обработки данных SSRS или с использованием пользовательского DPE ADO.NET, опубликованного Аароном Дэниелсом. –

+0

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

+0

Как и Питер, я бы поспорил, что вы выиграете от повышения производительности по сравнению с другим методом. –

1

Использование SQL CLR, чтобы связаться с веб-службы на веб-приложения

Это способ, которым я рекомендовал бы - я сделал это, чтобы получить доступ к данным списка SharePoint с помощью своих веб-сервисов. Если схема данных может быть исправлена, SQL CLR TVF может быть хорошо подходит и обеспечивает максимальную гибкость. Если вам нужно определить схему во время выполнения, хранимая процедура SQL CLR - это то, что вы хотите, поскольку она не привязана к схеме.

Ключевых вещей, которые вы должны будете это:

-- enable CLR on the server 
sp_configure 'clr_enabled', 1 
GO 
RECONFIGURE 
GO 

-- allow your db to execute clr code marked EXTERNAL or UNSAFE 
alter database mydb set trustworthy on 

затем создать SQL CLR проект VS (вы не должны, но это поможет с развертыванием и отладки), установите уровень разрешений «внешний». Если вы используете «Добавить веб-ссылку» в проекте VS, вам придется включить генерацию сборки сериализации и CREATE ASSEMBLY, чтобы загрузить ее после сборки/развертывания.

Это немного волнистый рука прямо сейчас - честно, я сделал это - я добавлю более подробно позже. В прошлом месяце я рассказал о SQL CLR. В моем sample code есть проект GetFibs, который вызывает веб-службу (Fibonnaci), которая также включена.

Также смотрите здесь: http://footheory.com/blogs/bennie/archive/2006/12/07/invoking-a-web-service-from-a-sqlclr-stored-procedure.aspx и http://www.codeproject.com/KB/database/SQLCLR.aspx?display=Print

ли это выполнить в порядке, это может обеспечить большие наборы данных?

Да, это, кажется, хорошо работает.С небольшой дополнительной работой вы можете построить ее более ориентированной на поток, где она не будет потреблять память для всего набора. См. Пример в примере диапазона или here.

1

Я бы окончательно спустился по ADO.NET DPE road. Если ваш источник данных может предоставить необходимые данные в реальном времени, тогда это будет иметь смысл. Вы сэкономите 1,2 или 3 уровня, что, несомненно, улучшит общую производительность. И не говорить о поддержании каждого уровня кода. Извлеките число crunched data в виде набора данных ADO.NET и позвольте вашим службам отчетов запросить его напрямую, это лучший, на мой взгляд.

1

В SQL 2008 вы можете использовать пакет SQL SSIS в качестве источника данных. Напишите пакет SSIS для выполнения вашего вычислительного механизма «на лету» и вывода массива данных .net (DataReaderDestination). Затем это можно использовать для отчетности.