2009-05-07 17 views
5

Necesito exportar una gran cantidad de datos (~ 100mb) desde una tabla SQL a un usuario a través de la web. ¿Cuál sería la mejor solución para hacerlo? Se pensó exportar los datos a una carpeta en el servidor db, comprimirlo (de alguna manera) y luego proporcionar un enlace de descarga para el usuario. ¿Algún otro método para hacerlo? Además, ¿podemos comprimir datos desde el servidor sql?Exportar grandes cantidades de datos al cliente en asp.net

Cualquier acercamiento es bienvenido.

+0

¿Cuál es su formato de destino? ¿Qué terminará descargando el usuario final? Xml? Csv? ¿Un archivo de base de datos de servidor Sql real? – Nate

+0

Un archivo de Excel/archivo csv. Cualquiera de los formatos está bien. – Sirpingalot

Respuesta

0

El enlace de descarga es una solución perfectamente válida y válida. Otra sería redirigir automáticamente al usuario a ese archivo para que no necesiten hacer clic en un enlace. Realmente depende de tu flujo de trabajo y experiencia de UI.

Sugeriría que no se implemente la compresión en el motor de SQL Server. En su lugar, mire la biblioteca DotNetZip (o System.IO.Conpression si cree que sus usuarios tienen la capacidad de descomprimir archivos gzip) e implemente la compresión dentro de la aplicación web.

0

Si XML está bien, un enfoque sería para seleccionar los datos "FOR XML" como esto: http://www.sqljunkies.ddj.com/Article/296D1B56-8BDD-4236-808F-E62CC1908C4E.scuk

Y luego escupir el XML sin procesar directamente en el navegador, Content-Type: text/xml. También asegúrese de configurar la compresión Gzip en su servidor web para archivos con extensiones XML. http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/502ef631-3695-4616-b268-cbe7cf1351ce.mspx?mfr=true

Esto reducirá el tamaño del archivo XML a 1/3 o tal vez 1/4 del tamaño a medida que se transfiere. Esta no sería la opción de mayor rendimiento debido al espacio perdido inherente en los archivos XML, pero mucho depende del formato que esté buscando al final.

Otra opción sería utilizar el CSharpZipLib gratuito para comprimir el XML (o el formato que desee) en un archivo comprimido que el usuario descargaría. En esa línea, si esto es algo que se utilizará con frecuencia, es posible que desee examinar el almacenamiento en caché y el archivo zip en el servidor web con algún tipo de caducidad, por lo que no se regenera para cada solicitud.

3

Puede responder a una solicitud de página con un archivo:

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

Asegúrese de girar amortiguando fuera, por lo que IIS puede comenzar a enviar la primera parte del archivo mientras se está construyendo la segunda:

Response.BufferOutput = false; 

Después de eso, puede empezar a escribir el archivo como:

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

Cuando el archivo es complet Ely escrito, poner fin a la respuesta, por lo que ASP.NET no añade una página web para su archivo:

Response.End(); 

esta manera, usted no tiene que escribir archivos en sus servidores web, que acaba de crear los archivos en la memoria y enviarlos a tus usuarios.

Si se requiere compresión, puede escribir un archivo ZIP de la misma manera. Este es un buen free library para crear archivos ZIP.

+0

Nota: si no hay memoria intermedia entre el db y el usuario final, el proceso mantendrá bloqueos hasta que se envíe todo el conjunto de filas. No serán muchos los bloqueos si solo está LEYENDO COMPROMETIDO, pero habrá algunos bloqueos de todos modos. Esto, por ejemplo, prohibiría a los escritores de la mesa adquirir un bloqueo de tabla si intentaban escalar. Tal vez no está mal con un usuario final de alta velocidad, pero podría ser bastante malo en un enlace lento. – ahains

+0

+1 Response.BufferOutput es una gran 'solución rápida'. Sigo pensando que la solución de @Goblyn27 es el enfoque más "correcto", pero cuando tienes poco tiempo y el usuario necesita su informe AHORA, la desactivación del búfer de salida funciona muy bien. – Pandincus

0

Su enfoque funciona bien. SSIS + 7zip podría ser útil para automatizar el proceso si necesita hacerlo más de un par de veces.

4

No ataré la base de datos esperando que el usuario descargue 100Mb, incluso para un usuario de alta velocidad.Cuando el usuario solicite el archivo, pídales que especifiquen una dirección de correo electrónico. Luego llame a un proceso de asincronización para extraer los datos, escríbalos en un archivo temporal (no desee> 100mb en memoria después de todo), luego zip el archivo temporal a una ubicación de almacenamiento, luego envíele al usuario un correo electrónico con un enlace para descargar el archivo.

+0

+1 Mi patrón más utilizado para la generación/descarga de archivos grandes. – ewbi

+0

Lo único que agregaría es la necesidad de una limpieza de archivos antigua (es decir, la eliminación periódica de esos> archivos de 100 MB); es bastante fácil de hacer con un simple script y una tarea programada. Y no se olvide de informar al usuario que el archivo solo estará disponible durante un período de tiempo limitado. – ewbi

Cuestiones relacionadas