2009-05-07 22 views
5

Tôi cần xuất một lượng lớn dữ liệu (~ 100mb) từ bảng sql sang người dùng qua web. Điều gì sẽ là giải pháp tốt nhất để làm như vậy? Một ý nghĩ là xuất dữ liệu vào một thư mục trên máy chủ db, nén nó (bằng một số phương tiện) và sau đó cung cấp liên kết tải xuống cho người dùng. Bất kỳ phương pháp khác để làm như vậy? Ngoài ra, chúng tôi có thể nén dữ liệu từ trong máy chủ sql không?Xuất một lượng lớn dữ liệu cho khách hàng trong asp.net

Mọi phương pháp đều được chào đón.

+0

Định dạng mục tiêu của bạn là gì? Người dùng cuối sẽ tải xuống cái gì? Xml? Csv? Tệp cơ sở dữ liệu máy chủ Sql thực tế? – Nate

+0

Tệp Excel/tệp csv. Định dạng là ok. – Sirpingalot

Trả lời

0

Liên kết tải xuống là giải pháp hoàn toàn hợp lệ và hợp lý. Người khác sẽ tự động chuyển hướng người dùng đến tệp đó để họ không cần nhấp vào liên kết. Nó thực sự phụ thuộc vào quy trình làm việc và trải nghiệm giao diện người dùng của bạn.

Tôi sẽ đề xuất chống lại việc triển khai nén trong công cụ Máy chủ SQL. Thay vào đó hãy nhìn vào thư viện DotNetZip (Hoặc System.IO.Conpression nếu bạn nghĩ rằng người dùng của bạn có khả năng nén lưu trữ gzip) và thực hiện nén trong ứng dụng web.

0

Nếu XML là OK, một cách tiếp cận sẽ được chọn dữ liệu "FOR XML" như thế này: http://www.sqljunkies.ddj.com/Article/296D1B56-8BDD-4236-808F-E62CC1908C4E.scuk

Và sau đó nhổ ra XML liệu trực tiếp vào trình duyệt như content-type: text/xml. Ngoài ra, hãy chắc chắn thiết lập nén Gzip trên máy chủ web của bạn cho các tệp có phần mở rộng XML. http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/502ef631-3695-4616-b268-cbe7cf1351ce.mspx?mfr=true

Điều này sẽ thu nhỏ tệp XML xuống 1/3 hoặc có thể 1/4 kích thước khi tệp được chuyển. Đây sẽ không phải là tùy chọn hiệu suất cao nhất vì không gian lãng phí vốn có trong các tệp XML, nhưng rất nhiều tùy thuộc vào định dạng bạn đang tìm kiếm cuối cùng.

Một tùy chọn khác sẽ là sử dụng CSharpZipLib miễn phí để nén XML (hoặc bất kỳ định dạng nào bạn muốn) thành tệp zip mà người dùng sẽ tải xuống. Dọc theo những dòng này, nếu đây là thứ sẽ được sử dụng thường xuyên, bạn có thể muốn xem trong bộ nhớ đệm và lưu trữ tệp zip trên máy chủ web với một số loại hết hạn để nó không được tạo lại cho mọi yêu cầu.

3

Bạn có thể đáp ứng một yêu cầu trang với một tập tin:

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

Hãy chắc chắn để biến đệm tắt, vì vậy IIS có thể bắt đầu gửi phần đầu tiên của tập tin trong khi bạn đang xây dựng thứ hai:

Response.BufferOutput = false; 

Sau đó, bạn có thể bắt đầu viết các tập tin như:

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

Khi tập tin là complet ely viết, kết thúc phản ứng, vì vậy ASP.NET không nối thêm một trang web vào tệp của bạn:

Response.End(); 

Bằng cách này, bạn không phải ghi tệp trên máy chủ web, bạn chỉ cần tạo tệp trong bộ nhớ và gửi chúng cho người dùng của bạn.

Nếu nén là bắt buộc, bạn có thể viết tệp ZIP theo cách tương tự. Đây là một free library đẹp để tạo tệp ZIP.

+0

Lưu ý: nếu không có đệm giữa db và người dùng cuối, quá trình sẽ giữ khóa cho đến khi toàn bộ rowset được gửi đi. Nó sẽ không có nhiều ổ khóa nếu bạn chỉ làm READ COMMITTED, nhưng sẽ có một số ổ khóa dù sao. Ví dụ, điều này sẽ ngăn cấm bất kỳ nhà văn nào trong bảng có được khóa bàn nếu họ cố gắng leo thang. Có thể không tệ với người dùng cuối tốc độ cao, nhưng có thể khá tệ trên một liên kết chậm. – ahains

+0

Phản hồi +1.BufferOutput là một 'sửa chữa nhanh' tuyệt vời. Tôi vẫn cảm thấy giải pháp của @ Goblyn27 là cách tiếp cận 'đúng' hơn, nhưng khi bạn bị ràng buộc về thời gian và người dùng cần báo cáo của họ NGAY BÂY GIỜ, việc vô hiệu hóa bộ đệm đầu ra hoạt động tốt đẹp. – Pandincus

0

Cách tiếp cận của bạn hoạt động tốt. SSIS + 7zip có thể hữu ích cho việc tự động hóa quy trình nếu bạn cần thực hiện nhiều hơn một vài lần.

4

Tôi sẽ không kết nối cơ sở dữ liệu đang chờ người dùng tải xuống 100Mb, ngay cả đối với người dùng tốc độ cao.Khi người dùng yêu cầu tệp, họ có chỉ định địa chỉ email. Sau đó gọi một quá trình asynch để kéo dữ liệu, ghi nó vào một tập tin tạm thời (không muốn> 100mb trong bộ nhớ sau khi tất cả), sau đó zip file tạm thời vào một vị trí lưu trữ, sau đó gửi cho người dùng một email với một liên kết để tải về tập tin.

+0

+1 Mẫu đơn được sử dụng nhiều nhất của tôi cho tệp/tải xuống tệp lớn. – ewbi

+0

Điều duy nhất tôi muốn thêm là cần dọn dẹp tệp tuổi (ví dụ: xóa định kỳ các tệp> 100MB đó); thật dễ dàng để thực hiện với một tập lệnh đơn giản và nhiệm vụ được lên lịch. Và đừng quên cho người dùng biết tệp sẽ chỉ có sẵn trong khoảng thời gian giới hạn. – ewbi

Các vấn đề liên quan