5 Stimmen

Große Datenmengen im asp.net an den Client exportieren

Ich muss eine große Menge an Daten (~100 MB) aus einer SQL-Tabelle über das Web an einen Benutzer exportieren. Was wäre die beste Lösung dafür? Ein Gedanke war, die Daten in einen Ordner auf dem DB-Server zu exportieren, sie zu komprimieren (auf irgendeine Weise) und dann einen Download-Link für den Benutzer bereitzustellen. Gibt es noch andere Methoden, um dies zu tun? Können wir Daten auch innerhalb des SQL-Servers komprimieren?

Alle Ansätze sind willkommen.

0 Stimmen

Was ist Ihr Zielformat? Was wird der Endbenutzer letztendlich herunterladen? Xml? Csv? Eine tatsächliche Sql Server-Datenbankdatei?

0 Stimmen

Eine Excel-Datei/CSV-Datei. Beide Formate sind in Ordnung.

4voto

Peter Lange Punkte 2694

Ich würde die Datenbank nicht blockieren, während der Benutzer versucht, 100 MB herunterzuladen, selbst für einen Benutzer mit hoher Geschwindigkeit. Wenn der Benutzer die Datei anfordert, soll er eine E-Mail-Adresse angeben. Dann rufen Sie einen asynchronen Prozess auf, um die Daten abzurufen, sie in eine temporäre Datei zu schreiben (schließlich möchten wir nicht mehr als 100 MB im Speicher haben), die temporäre Datei an einen Speicherort zu zippen und dem Benutzer dann eine E-Mail mit einem Link zum Herunterladen der Datei zu senden.

0 Stimmen

Das einzige, was ich hinzufügen würde, ist die Notwendigkeit einer Bereinigung alter Dateien (d. h. regelmäßiges Löschen von Dateien größer als 100 MB); dies lässt sich einfach mit einem einfachen Skript und einer geplanten Aufgabe erledigen. Und vergessen Sie nicht, den Benutzer darüber zu informieren, dass die Datei nur für einen begrenzten Zeitraum verfügbar sein wird.

3voto

Andomar Punkte 224164

Sie können auf eine Seitenanforderung mit einer Datei antworten:

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

Stellen Sie sicher, dass das Puffern deaktiviert ist, damit IIS den ersten Teil der Datei senden kann, während Sie den zweiten Teil erstellen:

Response.BufferOutput = false;

Danach können Sie mit dem Schreiben der Datei beginnen:

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

Wenn die Datei vollständig geschrieben ist, beenden Sie die Antwort, damit ASP.NET keine Webseite an Ihre Datei anhängt:

Response.End();

Auf diese Weise müssen Sie keine Dateien auf Ihren Webservern schreiben, sondern erstellen die Dateien im Speicher und senden sie an Ihre Benutzer.

Wenn eine Komprimierung erforderlich ist, können Sie auf dieselbe Weise eine ZIP-Datei schreiben. Dies ist eine gute kostenlose Bibliothek zum Erstellen von ZIP-Dateien.

0 Stimmen

Hinweis: Wenn es keine Pufferung zwischen der Datenbank und dem Endbenutzer gibt, werden Locks gehalten, bis der gesamte Satz von Zeilen gesendet wurde. Es werden nicht viele Locks sein, wenn Sie nur READ COMMITTED ausführen, aber dennoch werden einige Locks vorhanden sein. Dies würde zum Beispiel verhindern, dass Schreiber auf die Tabelle einen Tabellenlock erhalten, wenn sie versuchen, zu eskalieren. Dies mag bei einem schnellen Endbenutzer nicht schlimm sein, könnte aber bei einer langsamen Verbindung ziemlich schlecht sein.

0 Stimmen

+1 Response.BufferOutput ist ein großartiger 'Schnellfix'. Ich denke immer noch, dass @Goblyn27's Lösung der "korrektere" Ansatz ist, aber wenn Sie unter Zeitdruck stehen und der Benutzer seinen Bericht JETZT benötigt, funktioniert die Deaktivierung des Ausgabepuffers wunderbar.

0voto

Sam Axe Punkte 32502

Der Download-Link ist eine vollkommen gültige und vernünftige Lösung. Eine andere wäre, den Benutzer automatisch zu dieser Datei umzuleiten, damit er nicht auf einen Link klicken muss. Es hängt wirklich von Ihrem Workflow und der Benutzeroberfläche ab.

Ich würde davon abraten, die Kompression im SQL Server zu implementieren. Schauen Sie stattdessen die DotNetZip-Bibliothek an (oder System.IO.Compression, wenn Sie denken, dass Ihre Benutzer die Fähigkeit haben, gzip-Archive zu entpacken) und implementieren Sie die Kompression innerhalb der Webanwendung.

0voto

Steve Wortham Punkte 21010

Wenn XML in Ordnung ist, wäre ein Ansatz, die Daten "FOR XML" wie folgt auszuwählen: http://www.sqljunkies.ddj.com/Article/296D1B56-8BDD-4236-808F-E62CC1908C4E.scuk

Und dann geben Sie das Roh-XML direkt an den Browser aus als Content-Type: text/xml. Stellen Sie auch sicher, dass die Gzip-Komprimierung auf Ihrem Webserver für Dateien mit XML-Erweiterungen eingerichtet ist. http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/502ef631-3695-4616-b268-cbe7cf1351ce.mspx?mfr=true

Dadurch wird die Größe der XML-Datei beim Transfer auf 1/3 oder vielleicht 1/4 reduziert. Dies wäre nicht die Leistungsstärkste Option aufgrund des inhärenten Platzverschwendungs in XML-Dateien, aber vieles hängt davon ab, in welchem Format Sie letztendlich suchen.

Eine weitere Option wäre die Verwendung der kostenlosen CSharpZipLib zum Komprimieren des XML (oder eines anderen gewünschten Formats) in eine Zip-Datei, die der Benutzer herunterladen würde. In diesem Zusammenhang sollten Sie, wenn dies etwas ist, das häufig verwendet wird, in das Caching und das Speichern der Zip-Datei auf dem Webserver mit einer Art von Ablaufdatum schauen, sodass sie nicht für jede einzelne Anfrage neu erstellt wird.

0voto

steamer25 Punkte 8710

Dein Ansatz funktioniert gut. SSIS + 7zip könnte nützlich sein, um den Prozess zu automatisieren, wenn du ihn öfter als ein paar Mal durchführen musst.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X