2009-05-07 8 views
5

Potrzebuję wyeksportować dużą ilość danych (~ 100mb) ze stołu sql do użytkownika za pośrednictwem Internetu. Jakie byłoby najlepsze rozwiązanie? Jedną z nich było wyeksportowanie danych do folderu na serwerze bazy danych, skompresowanie go (w pewien sposób), a następnie udostępnienie łącza pobierania dla użytkownika. Jakieś inne metody na zrobienie tego? Czy możemy również kompresować dane z serwera sql?Eksportuj duże ilości danych do klienta w asp.net

Wszelkie podejścia są mile widziane.

+0

Jaki jest twój format docelowy? Co użytkownik końcowy może pobrać? Xml? CSV? Rzeczywisty plik bazy danych serwera Sql? – Nate

+0

Plik Excel/plik csv. Każdy format jest w porządku. – Sirpingalot

Odpowiedz

0

Link do pobrania jest całkowicie poprawnym i rozsądnym rozwiązaniem. Innym rozwiązaniem byłoby automatyczne przekierowanie użytkownika do tego pliku, aby nie musieli klikać linku. To naprawdę zależy od twojego doświadczenia w pracy i interfejsu użytkownika.

Proponuję przeciwko wprowadzeniu kompresji w silniku SQL Server. Zamiast tego spójrz na bibliotekę DotNetZip (lub System.IO.Conpression, jeśli uważasz, że twoi użytkownicy mają możliwość dekompresji archiwów gzip) i zaimplementuj kompresję w aplikacji internetowej.

0

Jeśli XML jest OK, jedno podejście byłoby wybrać Data "xml" tak: http://www.sqljunkies.ddj.com/Article/296D1B56-8BDD-4236-808F-E62CC1908C4E.scuk

A potem wypluć surowego XML bezpośrednio do przeglądarki jako Content-Type: text/xml. Upewnij się też, że kompresja Gzip na twoim serwerze WWW dla plików z rozszerzeniami XML. http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/502ef631-3695-4616-b268-cbe7cf1351ce.mspx?mfr=true

Spowoduje to zmniejszenie pliku XML do 1/3, a może do 1/4 rozmiaru podczas przesyłania. To nie byłaby opcja najwyższej wydajności ze względu na wrodzoną marnowaną przestrzeń w plikach XML, ale wiele zależy od tego, jakiego formatu szukasz w końcu.

Inną opcją byłoby użycie darmowego CSharpZipLib do kompresji XML (lub dowolnego innego formatu) do pliku ZIP, który użytkownik mógłby pobrać. W tym przypadku, jeśli jest to coś, co będzie często używane, możesz zajrzeć do pamięci podręcznej i zapisać plik zip na serwerze WWW z pewnym czasem wygaśnięcia, aby nie był on regenerowany dla każdego żądania.

3

Możesz odpowiedzieć na żądanie strony z plikiem:

Response.AddHeader("Content-Disposition", 
    "attachment; filename=yourfile.csv"); 
Response.ContentType = "text/plain"; 

należy wyłączyć buforowanie off, więc IIS może rozpocząć wysyłanie pierwszej części pliku podczas budowania drugi:

Response.BufferOutput = false; 

Po tym, można zacząć pisać plik jak:

Response.Write("field1,field2,field3\r\n"); 

Gdy plik jest complet ely napisane, zakończyć reakcję, więc ASP.NET nie dołączać stronę WWW do pliku:

Response.End(); 

ten sposób nie trzeba się zapisywać pliki na serwerach internetowych, po prostu tworzyć pliki w pamięci i wysłać je do użytkowników.

Jeśli wymagana jest kompresja, można zapisać plik ZIP w ten sam sposób. To jest ładne free library do tworzenia plików ZIP.

+0

Uwaga: jeśli nie ma buforowania między bazą danych a użytkownikiem końcowym, proces będzie blokował do momentu wysłania całego zestawu zestawów wierszy. To nie będzie wiele zamków, jeśli po prostu wykonujesz READ COMMITTED, ale mimo wszystko będą pewne zamki. To na przykład uniemożliwiłoby pisarzom przy stole zdobywanie blokady stołu, gdyby próbowali ją eskalować. Może nieźle z użytkownikiem końcowym wysokiej prędkości, ale może być dość źle na wolnym łączu. – ahains

+0

+1 Response.BufferOutput to świetna "szybka naprawa". Wciąż uważam, że rozwiązanie @Goblyn27 jest bardziej "poprawnym" podejściem, ale kiedy jesteś przywiązany do czasu i użytkownik potrzebuje swojego raportu TERAZ, wyłączenie bufora wyjściowego działa pięknie. – Pandincus

0

Twoje podejście działa dobrze. SSIS + 7zip może być przydatny do zautomatyzowania procesu, jeśli musisz zrobić to więcej niż kilka razy.

4

Nie chciałbym powiązać bazy danych, czekając na pobranie przez użytkownika 100Mb, nawet dla szybkiego użytkownika.Gdy użytkownik zażąda pliku, podaj im adres e-mail. Następnie wywołaj proces asynchroniczny, aby pobrać dane, zapisz je w pliku tymczasowym (nie chcesz> 100mb w pamięci), a następnie zapakuj plik tymczasowy do lokalizacji przechowywania, a następnie wyślij użytkownikowi wiadomość e-mail z łączem do pobrania plik.

+0

+1 Mój najpopularniejszy wzorzec dla dużych plików gen/download. – ewbi

+0

Jedyną rzeczą, którą chciałbym dodać jest potrzeba starszego czyszczenia plików (tj. Okresowe usuwanie tych plików> 100 MB); Łatwo to zrobić za pomocą prostego skryptu i zaplanowanego zadania. I nie zapomnij poinformować użytkownika, że ​​plik będzie dostępny tylko przez ograniczony czas. – ewbi

Powiązane problemy