2009-05-07 14 views
12

Biorąc pod uwagę: silnik obliczeniowy C#, który ładuje model obiektowy, przechwytuje ogromne ilości liczb i zapisuje wyniki w kilku gigantycznych tabelach indeksowanych w SQL Server. Te tabele udostępniają dane interfejsom WWW, innym modułom oprogramowania i raportom SQL Server Reporting Services 2005.Jak mogę pobrać dane inne niż do SQL Server Reporting Services?

Udało mi się sprawić, że silnik lot szybciej w najnowszej wersji oprogramowania, wystarczająco szybko, teraz może dostarczyć dane na żądanie - czasami nawet szybciej niż czas potrzebny na wysłanie zapytania do bazy danych - obliczone liczby. Bardzo się z tego cieszę.

Ten przełom oznacza, że ​​możemy generować dane na żądanie dla interfejsów internetowych i innych modułów oprogramowania. Jednak tabele pamięci podręcznej nie mogą jeszcze umrzeć, ponieważ są zużywane przez raporty SSRS (a dokładniej za pomocą procedur przechowywanych, które przeszukują tabele i dostarczają dane do SSRS.)

Tabele pamięci podręcznej to ból, w ten sam sposób, w jaki każda pamięć podręczna jest bólem w świecie oprogramowania. Nie wchodząc w szczegóły, mają problemy z synchronizacją, problemy z blokowaniem itp. Oprogramowanie działałoby o wiele ładniej, gdybym nie musiał się martwić o aktualizowanie tych cholernych tablic.

Ale jak inaczej mogę uzyskać dane do SSRS? Zrobiłem sporo badań i nic nie wygląda na zbyt obiecujące:

  • Możemy dostarczyć dane za pośrednictwem usługi internetowej i korzystać z XML DPR SSRS. Ale to wygląda trochę ohydnie - czy mam rację, że sam musisz przetworzyć kopertę SOAP ?! I nie obsługuje XPath, ale zastrzeżony dialekt XPath-y? Nasi autorzy raportów znają T-SQL i to jest to, w czym są najlepsi.
  • Używanie SQL CLR do hostowania naszego API nie jest pożądane - jest to duża aplikacja i nie można nic zrobić bez tworzenia obiektu aplikacji i logowania itp.
  • Używanie SQL CLR do kontaktowania się z usługą sieciową na aplikacja internetowa - jest to najbardziej obiecująca do tej pory (ten artykuł był pomocny http://www.simple-talk.com/sql/sql-server-2005/practical-sql-server-2005-clr-assemblies/.) Czy ktoś próbował tego podejścia? Czy działa dobrze, czy może dostarczać duże zestawy danych? OTOH Zostałem wyłączony przez dodatkową konfigurację, którą musielibyśmy wykonać na klientach serwerów DB.
  • Wszelkie inne sugestie będą mile widziane.
+0

Dodałem nagrodę dla każdego, kto może zapewnić mi dobre doświadczenie/informacje/specyfikacje/numery na temat tego, czy wyłączenie tego z SQLCLR/Web Services jest łatwe w zarządzaniu, czy jakiekolwiek inne dobre pomysły, które pomogą w tej sytuacji. –

+0

Witam, czy rozumiem poprawnie, że tabele pamięci podręcznej są używane głównie przez SSRS, do celów raportowania? Wygląda na to, że raportowanie jest aspektem twojej aplikacji/rozwiązań, ale z powodu tego aspektu powoduje to, że trzeba wykonać jakąś nieprzyjemną pracę dla celów raportowania? –

+0

To prawda, Rihan. Raportowanie jest składnikiem aplikacji, a nieprzyjemne tabele istnieją tylko w celu dostarczenia danych do raportów. –

Odpowiedz

9

Jeśli dobrze rozumiem, budujesz raport na temat danych innych niż SQL. Przechowujesz dane w tabelach w celu ich zgłoszenia.

Potrafię wymyślić dwa rozwiązania. Pierwszym z nich jest rozszerzenie silnika obliczeniowego C# o reporting part. Przestrzenie nazw Microsoft.Reporting.WinForms i Microsoft.Reporting.WebForms mogą być używane do tworzenia raportów na dowolnym źródle danych, a nie tylko na serwerze SQL Server. Jeśli użytkownicy końcowi używają Twojej aplikacji jako klienta, możesz generować dane i raporty w locie.

Drugi to użycie SQL CLR. Możesz użyć procedury składowanej CLR jako podstawy raportu (wpisz "exec mysp" jako źródło danych). Ta procedura CLR jest kodem C# i może zawierać twój silnik obliczeniowy jako bibliotekę. Umożliwi to generowanie raportów w locie, przy jednoczesnym korzystaniu z interfejsu użytkownika serwera raportów.

Ciekawe pytanie i mam nadzieję, że bardziej doświadczeni ludzie mogą zapewnić lepszą odpowiedź :)

+0

Reportujące części są bardzo interesujące! Jeszcze tego nie znalazłem. Niestety, nasi klienci polegają na funkcjach SSRS, takich jak automatyczne dostarczanie i harmonogramowanie raportów, dlatego też samodzielne generowanie raportów dla podzbioru raportów aplikacji nie będzie tego robić. –

+0

Czy to oznacza, że ​​zamierzasz wykonać SQL CLR? – Gator

+0

Gator, oznacza to, że muszę realizować opcję, która pozwala mi renderować raporty SSRS z serwera SSRS. Może to oznaczać SQLCLR, SQLCLR-WebService, WebService-XMLDPE lub jakiekolwiek inne pomysły, które pojawiają się na to pytanie. –

3

Byłem w podobnej sytuacji wcześniej i starał zarówno SSRS źródło danych XML oraz rozszerzenie raportowania że Andomar wspomina .Moje zalecenie jest użycie funkcji źródła danych SSRS XML. Jeśli struktura danych zwrócona przez usługę sieciową jest prosta, to XPath jest również prosty. Zauważyłem również, że łatwiej jest debugować. Główną rzeczą, na którą należy zwrócić uwagę, są limity czasu.

Dobrą rzeczą przy korzystaniu z usług sieciowych jest to, że są one łatwo wykorzystywane przez wiele różnych technologii, więc i tak mogą być bardzo przydatne.

Jest to również osobisty wybór, ale pomimo funkcji SQL CLR nadal nie czuję się dobrze z umieszczaniem kodu w bazie danych. Korzystając ze źródła danych XML w SSRS, nie ma potrzeby włączania w ogóle niestandardowego kodu CLR.

+0

+1 W pytaniu wspomniano "Korzystanie z SQL CLR do kontaktowania się z usługą internetową w aplikacji internetowej", ale ze źródłem danych XML można skontaktować się z serwisem internetowym bez SQL CLR. – Andomar

+0

Dobrze. To, o czym wspomniałem, uczyni jaśniejszym. –

3

Można zawinąć dane w pliku ADO.NET DataSet and use it as a Reporting Services Data Source..

Nigdy osobiście tego nie używałem, więc nie mogę podać więcej informacji. Wiedziałem jednak, że możesz to zrobić z klasy SSRS, w której uczestniczyłem. Przykład, który dał mi instruktor, gdy zrobiłbyś to w "prawdziwym świecie", byłby przykładowy, gdybyś chciał połączyć dane z dwóch różnych źródeł danych. Na przykład możesz to zrobić, jeśli chcesz skorelować dane z SQL Server i Oracle w jednym raporcie.

Wiem, że nie jest to, co chcesz zrobić, ale brzmi to tak, jakby dostarczył tę samą warstwę abstrakcji, której potrzebujesz.

+0

Niestandardowe rozszerzenie przetwarzania danych to zdecydowanie nowy pomysł w tej dyskusji. Próbka opisuje niestandardowy DPO ADO.NET, który odczytuje stałe pliki xml z lokalizacji na dysku, oczywiście niezbyt praktyczne w rzeczywistym świecie. Sądzę, że mógłbym stworzyć plik DPE, który pobiera adres URL usługi internetowej jako ciąg połączenia, a następnie nazwę metody z wartościami parametrów jako zapytanie - czy to brzmi dobrze? –

+0

Nigdy tego nie zaimplementowałem, więc nie mogę podać żadnych praktycznych porad z doświadczenia. To powiedziawszy, to brzmi jak podejście, które brałbym. Czy masz już usługę sieciową do użycia? Jeśli tak, to zamaskowanie wywołań za interfejsami dostawcy danych .NET (esque) brzmi jak droga. Jeśli nie, a masz bibliotekę .NET, to być może podpięcie jej metod API byłoby lepsze. Unikniesz narzutu SOAP i czegokolwiek. To była jedna z tych rzeczy, które ukryłem w umyśle i nigdy osobiście nie miałem okazji skorzystać. –

2

Czy rozważałeś napisanie własnego niestandardowego sterownika bazy danych, który znajduje się na szczycie silnika obliczeniowego? Następnie możesz wskazać usługi raportowania bezpośrednio w tym miejscu. Pozwoli to zachować szybkie tempo, choć może to być skomplikowane zadanie. Zastanawiałem się nad tym w przeszłości nad zastrzeżonym oprogramowaniem hurtowni danych, nad którym pracowałem, ale nigdy nie udało mi się zbudować sterownika.

Świetne pytanie przy okazji.

+0

Chris, punkty na zewnątrz w polu, na pewno, ale nie jestem pewien, że dodatkowa praca oferuje jakiekolwiek korzyści z pisania niestandardowego rozszerzenia przetwarzania danych SSRS, lub przy użyciu niestandardowego DPE ADO.NET opublikowanego przez Aarona Danielsa. –

+0

Korzyści, jakie oferuje to to, że wszystko, co może spożywać ADO.Dane NET stają się potencjalnym konsumentem twojego systemu. Na przykład możesz połączyć arkusz kalkulacyjny programu Excel bezpośrednio z systemem. –

+0

Oprócz tego, co powiedział Peter, mogę się założyć, że skorzystasz na zwiększeniu wydajności w porównaniu z inną metodą. –

1

Korzystanie CLR SQL, aby skontaktować się z usługą internetową na aplikacji internetowej

ten sposób polecam - Zrobiłem to, aby uzyskać dostęp do danych listy programu SharePoint za pośrednictwem swoich usług internetowych. Jeśli schemat danych można naprawić, SQL CLR TVF może być dobrze dopasowany i zapewnia największą elastyczność. Jeśli chcesz, aby schemat został określony w czasie wykonywania, procedura składowana SQL CLR jest tym, czego potrzebujesz, ponieważ nie jest powiązana ze schematem.

The najważniejszych rzeczy, które musisz to:

-- 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 

następnie utworzyć projekt sql clr VS (nie trzeba jednak pomóc z wdrażania i debugowania go), ustawić poziom uprawnień do 'zewnętrzny'. Jeśli użyjesz "Dodaj odniesienie do stron internetowych" w projekcie VS, musisz włączyć generowanie zespołu do serializacji i utworzyć ZESPÓŁ, aby załadować go po zbudowaniu/wdrożeniu.

To jest teraz trochę zafascynowana ręką - szczerze, już to zrobiłem - dodam jeszcze trochę szczegółów. W zeszłym miesiącu przeprowadziłem rozmowę na temat SQL CLR. Mój sample code ma projekt GetFibs, który wywołuje usługę sieciową (Fibonnaci), która również jest dołączona.

wziąć również do obejrzenia tutaj: http://footheory.com/blogs/bennie/archive/2006/12/07/invoking-a-web-service-from-a-sqlclr-stored-procedure.aspx i http://www.codeproject.com/KB/database/SQLCLR.aspx?display=Print

nie wykonuje dobrze, może ona dostarczyć dużych zestawów danych?

Tak, wygląda na to, że działa dobrze.Przy odrobinie dodatkowej pracy można ją zbudować w bardziej zorientowany na strumień sposób, w którym nie będzie zużywać pamięci na cały zestaw. Zobacz, jak w próbce Range lub here.

1

Chciałbym zejść na dół ADO.NET DPE road. Jeśli twoje źródło danych może dostarczać potrzebne dane w czasie rzeczywistym, to ma to sens. Zaoszczędzisz sobie 1,2 lub 3 poziomów, co z pewnością poprawi ogólną wydajność. I nie mów o konserwacji każdej warstwy kodu. Ujawnij dane podzielone na liczby jako zestaw danych ADO.NET i pozwól, aby twoje usługi raportowania bezpośrednio je przetestowały, jest według mnie najlepszy.

1

W SQL 2008 można użyć pakietu SQL SSIS jako źródła danych. Napisz pakiet SSIS, aby uruchomić silnik obliczeniowy w locie i wypisać zbiór danych .net (DataReaderDestination) w pamięci. To może być następnie wykorzystane do raportowania.

Powiązane problemy