2009-01-26 11 views
11

Wszyscy wiemy, że DataReadery są szybsze niż DataTables, ponieważ DataReader jest używany do budowy DataTable.Jak przekonwertować DataTable na IDatareader?

Biorąc pod uwagę, że mam już DataTable .... Dlaczego miałbym przekonwertować go do DataReader?

Cóż, tworzę wewnętrzny interfejs o nazwie IDataProvider. Ten interfejs ma być implementowany zarówno lokalnie, jak i jako usługa WebService. Interfejs będzie miał metodę "Getdata", która pobiera pewne informacje o kryteriach i zwraca niektóre dane.

Ponieważ DataReader jest najszybszym mechanizmem pobierania danych, będę chciał użyć tego jako typu wyniku metody "GetData". Wiemy również, że DataReader nie jest możliwy do serializacji i dlatego nie można go przesłać przez Internet za pośrednictwem usługi WWW ...

W przypadku Internetu powinienem mieć lokalną klasę proxy żądać danych jako DataTable i następnie przekształć go lokalnie w DataReader.

W ten sposób aplikacja lokalna nie musi wiedzieć (lub dbać o to), czy ma lokalny czy zdalny dostęp do danych.

Jednak aby to zrobić, muszę wiedzieć ... Jak zawinąć DataReader wokół istniejącej DataTable?

Aktualizacja: Moja logika biznesowa nie będzie przechowywana w serwisie internetowym, ponieważ DataProvider korzystający z usługi Webservice może być przełączalny dla tego, który tego nie robi. BusinessLogic będzie zatem odbywał się w aplikacji klienckiej.

FWIW Używam .Net 3.5 SP1

+0

2 Downvotes ktoś chce komentarz, dlaczego? –

+0

Prawdopodobnie dlatego, że podajesz tylko, że chcesz używać obiektu DataReader, ponieważ uważasz, że pomoże Ci to w wydajności. Potrzebne są dodatkowe informacje na temat konfiguracji aplikacji, dlaczego warto korzystać z DataReadera zamiast z DataTable i gdzie znajduje się logika biznesowa. –

+0

Business-Logic znajduje się w aplikacji klienckiej. –

Odpowiedz

27

Po prostu zadzwoń do CreateDataReader na swojej DataTable

+0

Erm ... naprawdę zawstydzony ... jak ja w ogóle za tym tęskniłem? Wielkie dzięki –

+6

@Rory, te rzeczy nie zawsze są oczywiste. Jest ich zbyt wiele, aby je wszystkie znać. Właśnie dlatego mamy StackOverflow. – IAbstract

-2

Nie możesz. DataReader i DataTable to dwie różne rzeczy.

Ponieważ moduł DataReader umożliwia odczytywanie danych w postaci strumienia, nie widzę powodu, dla którego chcesz wykonać tę stronę po stronie klienta.

DataReader jest zwykle używany do odczytu danych z bazy danych i dodawania logiki do wypełnienia listy obiektów lub DataTable. Najlepiej więc wykonać większość logiki biznesowej, która ma związek z budową DataTable w serwisie internetowym, przekazać ją klientowi jako serwis internetowy i pracować z innymi funkcjami ADO.Net, aby uzyskać więcej logiki biznesowej.

Być może możesz być bardziej konkretny, dlaczego naprawdę chcesz DataReader?

+0

Wybrałem DataReader, ponieważ jest to najszybszy mechanizm. Usługa sieciowa nie będzie zawierała żadnego BusinessLogic (z wyjątkiem ** może ** niestandardowej warstwy zabezpieczeń). –

0

Nie ma istniejącej klasy, która zrobi to za Ciebie. Ale nie powinno ci być trudno napisać klasy serializowalnej, która implementuje IDataReader i jest opakowaniem wokół istniejącej DataTable.

EDYTOWANIE: Może ci się łatwiej przyswoić z DbDataReader (myślę, sprawdź klasę podstawową SqlDataReader w eksploratorze obiektów). Zapewnia część interfejsu dla ciebie. Ale tak, wciąż jest sporo nudnego kodu.

+0

Bardzo dziękuję, po prostu to, czego szukałem. –

+0

Cholera, to zaangażowany interfejs. –

1

DataReader jest najszybszym sposobem, aby czytać magazyn danych, ale tylko wtedy, gdy spełnione są pewne warunki:

  1. dane mają być odczytywane w sposób tylko do przodu.
  2. Dane mają być tylko do odczytu.

Nawet jeśli te warunki są spełnione przez scenariuszu DataReader reprezentuje podłączonego magazynu danych, co oznacza, że ​​trzeba zachować połączenie otwarte przez cały czas, że DataReader jest przekazywany przez sieć i do zwaną metodą na drugim końcu zwraca jakąś odpowiedź.

Dlatego uważam, że aktywny obiekt DataReader nigdy nie powinien być przekazywany za pośrednictwem różnych warstw i aplikacji. Wolałbym raczej najpierw wydobyć dane do innego magazynu danych lub kolekcji i natychmiast pozbyć się DataReadera.

+0

W przypadku Local DataProvider wszystkie te warunki zostałyby spełnione. W przypadku WebdataProvider, wszystkie warunki zostaną spełnione. Nowy moduł Datareader będzie używany tylko w ruchu do przodu w trybie tylko do odczytu. –

+0

Mam nadzieję, że Datareader * połączy się * z DataTable i dlatego będzie całkiem szczęśliwy sam w sobie. –

Powiązane problemy