2009-05-07 19 views
5

Ich muss eine große Menge von Daten (~ 100 MB) aus einer SQL-Tabelle an einen Benutzer über das Web exportieren. Was wäre die beste Lösung dafür? Ein Gedanke war, die Daten in einen Ordner auf dem Datenbankserver zu exportieren, sie zu komprimieren (auf irgendeine Weise) und dann einen Download-Link für den Benutzer bereitzustellen. Irgendwelche anderen Methoden dafür? Können wir Daten von SQL Server komprimieren?Export großer Datenmengen an den Client in asp.net

Alle Ansätze sind willkommen.

+0

Was ist Ihr Zielformat? Was wird der Endbenutzer herunterladen? Xml? CSV? Eine tatsächliche SQL Server Database-Datei? – Nate

+0

Eine Excel-Datei/CSV-Datei. Jedes Format ist in Ordnung. – Sirpingalot

Antwort

0

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

Ich würde vorschlagen, gegen die Implementierung der Komprimierung in der SQL Server-Engine. Betrachten Sie stattdessen die DotNetZip-Bibliothek (oder System.IO.Conpression, wenn Sie glauben, dass Ihre Benutzer die Möglichkeit haben, gzip-Archive zu entpacken) und implementieren Sie die Komprimierung innerhalb der Webanwendung.

0

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

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

Dies wird die XML-Datei auf 1/3 oder vielleicht 1/4 der Größe verkleinern, wie es übertragen wird. Dies wäre aufgrund des inhärenten verschwendeten Speicherplatzes in XML-Dateien nicht die leistungsstärkste Option, aber eine Menge hängt davon ab, welches Format Sie am Ende suchen.

Eine andere Option wäre, die freie CSharpZipLib zu verwenden, um die XML (oder welches Format Sie wollen) in eine Zip-Datei zu komprimieren, die der Benutzer herunterladen würde. Wenn Sie dieses Thema häufig verwenden, sollten Sie in Erwägung ziehen, die ZIP-Datei auf dem Webserver mit einer Art Ablaufdatum zu speichern und zu speichern, damit sie nicht für jede einzelne Anfrage neu generiert wird.

3

Sie können mit einer Datei auf eine externe Seite Anfrage antworten:

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

Seien Sie sicher, Pufferung auszuschalten, so kann IIS starten Sie den ersten Teil der Datei zu senden, während Sie die zweite bauen:

Response.BufferOutput = false; 

Danach können Sie starten Sie die Datei wie das Schreiben:

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

Wenn die Datei ist complet ely geschrieben, die Antwort beenden, so ASP.NET nicht eine Web-Seite zu Ihrer Datei anhängen:

Response.End(); 

Auf diese Weise müssen Sie keine Dateien Server auf Ihrem Web schreiben, müssen Sie nur die Dateien erstellen im Speicher und senden Sie sie an Ihre Benutzer.

Wenn eine Komprimierung erforderlich ist, können Sie auf die gleiche Weise eine ZIP-Datei schreiben. Dies ist eine nette free library zum Erstellen von ZIP-Dateien.

+0

Hinweis: Wenn zwischen der Datenbank und dem Endbenutzer keine Pufferung stattfindet, hält der Prozess Sperren, bis das gesamte Rowset gesendet wurde. Es werden nicht viele Sperren sein, wenn Sie nur READ COMMITTED ausführen, aber trotzdem einige Sperren haben. Dies würde zum Beispiel jedem Schreiber an der Tabelle verbieten, eine Tabellensperre zu erhalten, wenn sie eskalieren wollten. Vielleicht nicht schlecht mit einem High-Speed-Endbenutzer, aber könnte auf einer langsamen Verbindung ziemlich schlecht sein. – ahains

+0

+1 Response.BufferOutput ist eine großartige 'schnelle Lösung'. Ich denke immer noch, dass die Lösung von @ Goblyn27 der "richtige" Ansatz ist, aber wenn Sie Zeit brauchen und der Benutzer JETZT seinen Bericht benötigt, funktioniert das Deaktivieren des Ausgabepuffers sehr gut. – Pandincus

0

Ihr Ansatz funktioniert gut. SSIS + 7zip könnte für die Automatisierung des Prozesses nützlich sein, wenn Sie es mehr als ein paar Mal tun müssen.

4

Ich würde die Datenbank nicht binden, die darauf wartet, dass der Benutzer 100 MB selbst für einen Hochgeschwindigkeitsbenutzer herunterlädt.Wenn der Benutzer die Datei anfordert, muss er eine E-Mail-Adresse angeben. Rufen Sie dann einen asynchronen Prozess auf, um die Daten zu holen, schreiben Sie sie in eine temporäre Datei (nicht 100 MB im Speicher), zippen Sie die temporäre Datei an einen Speicherort und senden Sie dem Benutzer eine E-Mail mit einem Link zum Herunterladen die Datei.

+0

+1 Meine am häufigsten verwendeten Muster für große Datei gen/Download. – ewbi

+0

Einzige Sache, die ich hinzufügen würde, ist die Notwendigkeit einer alten Dateibereinigung (d. H. Periodische Löschung dieser> 100 MB-Dateien); Es ist einfach genug, mit einem einfachen Skript und einer geplanten Aufgabe zu tun. Und vergessen Sie nicht, dem Benutzer mitzuteilen, dass die Datei nur für einen begrenzten Zeitraum verfügbar sein wird. – ewbi

Verwandte Themen