Lluís Franco on Geeks.ms
  • Home

Editar documentos almacenados como array de bits en SQL Server [FileStream] (1/n)

  • By lfranco
  • Ago-17-2011
  • Sin categoría
  • 0 Comments.

Bajo este título -a priori tan chorra-, voy a empezar una serie de posts que muestren cómo almacenar documentos (ficheros NTFS) en una base de datos SQL Server 2008 mediante el uso de FILESTREAM storage, y cómo visualizarlos y editarlos con su aplicación asociada. En realidad, ésta última parte –la edición- es la única compleja, pero me ha parecido un buen tema para empezar una serie, y así de paso retomar las viejas costumbres.

FILESTREAM Storage:

Una de las características más esperadas de SQL Server 2008 –al menos por mi parte- es el almacenamiento en FILESTREAM de grandes ficheros como array de bytes, en campos de tipo varbinary(MAX) dentro de nuestra base de datos. El punto fuerte de este tipo de almacenamiento es que en lugar de almacenar el array de bytes dentro de la tabla lo almacena de forma transparente en el sistema de ficheros NTFS, pero con todas las ventajas de SQL Server (Atomicidad, facilidad para realizar backups, rendimiento, seguridad, etc.). Esto permite además que el tamaño de la BD no crezca despesuradamente, ya que la edición express *sólo* permite almacenar hasta 10GB.

Configuración de FILESTREAM Storage:

  1. Activar FILESTREAM en nuestro servidor SQL Server.
  2. Crear una base de datos habilitada para FILESTREAM
  3. Crear una tabla con un campo de tipo varbinary(MAX) habilitado para FILESTREAM.

Bien, supongamos que ya disponemos de nuestra base de datos y hemos creado una sencilla tabla para almacenar documentos. Algo parecido a esto:

filestream

Dónde los campos más relevantes son:

  • FileId: Un campo Guid que identifica cada documento guardado de forma única.
  • Document: El campo varbinary(MAX) en el que vamos a volcar el array de bytes de los ficheros a almacenar.
  • OriginalPath: En realidad no es importante, pero uno de los metadatos que vamos a necesitar más adelante es la extensión del fichero, para que pueda ser abierta con su aplicación asociada (Word, Excel, Acrobar Reader, etc.)

 

Vamos a ver cómo insertar documentos en dicha tabla. Nada mejor que un poco de C# y LINQ2SQL (o EF, eso es lo de menos):

using (OpenFileDialog opendialog = new OpenFileDialog())

{

    opendialog.Title = "Import document to database";

    opendialog.Filter = "All Documents|*.doc;*.docx;*.xls;*xlsx;*.ppt;*.pptx;*.pdf;*.txt";

    if (opendialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)

    {

        var newdoc = new FileStreamDocument();

        newdoc.FileId = Guid.NewGuid();

        newdoc.OriginalPath = opendialog.FileName;

        newdoc.Document = File.ReadAllBytes(opendialog.FileName);

        newdoc.ComputerName = Environment.MachineName;

        context.FileStreamDocuments.InsertOnSubmit(newdoc);

        context.SubmitChanges();

    }

}

En el código anterior mostramos un OpenFileDialog, el usuario selecciona un fichero, leemos el contenido y creamos un FileStreamDocument para insertarlo en la BD. La belleza subyacente es que SQL Server se encargará de almacenar dichos ficheros fuera de la tabla, en el sistema de ficheros NTFS del servidor. Y además, de forma totalmente transparente para nosotros 🙂

En los próximos posts veremos dónde se almacenan REALMENTE estos ficheros, cómo visualizarlos, y lo más importante de todo, cómo editarlos y guardarlos otra vez en la base de datos de forma transparente para el usuario.

Nos leemos pronto! 😀

Comments

Deja un comentario Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

← Previous Post Next Post →

Tags

async Back best practices

Entradas recientes

  • Video de mi charla en la #dotNetSpain2016
  • I’m back. Miss me?
  • Office365 actualizado a 2013 para nuevas suscripciones
  • Serializar listas genéricas en aplicaciones WinRT
  • [TPL] Problemas de concurrencia

Comentarios recientes

  • Darling Chavez en Tip: Mostrar objetos relacionados en DevExpress GridControl
  • Alexander en [TPL] Problemas de concurrencia
  • cristinakity en Funciones escalares en TSQL, JOINS, CROSS APPLY, y la madre que parió al topo.
  • cristinakity en Funciones escalares en TSQL, JOINS, CROSS APPLY, y la madre que parió al topo.
  • anonymous en HowTo: Crear una pantalla de inicio (splash screen)

Archivos

  • marzo 2016
  • marzo 2013
  • octubre 2012
  • septiembre 2012
  • agosto 2012
  • febrero 2012
  • diciembre 2011
  • noviembre 2011
  • octubre 2011
  • septiembre 2011
  • agosto 2011
  • junio 2011
  • mayo 2011
  • abril 2011
  • febrero 2011
  • enero 2011
  • diciembre 2010
  • noviembre 2010
  • octubre 2010
  • agosto 2010
  • julio 2010
  • marzo 2010
  • febrero 2010
  • enero 2010
  • diciembre 2009
  • noviembre 2009
  • octubre 2009
  • septiembre 2009
  • agosto 2009
  • julio 2009
  • junio 2009
  • mayo 2009
  • abril 2009
  • marzo 2009
  • febrero 2009
  • enero 2009
  • diciembre 2008
  • noviembre 2008
  • octubre 2008
  • septiembre 2008
  • agosto 2008
  • julio 2008
  • junio 2008
  • mayo 2008
  • abril 2008
  • marzo 2008
  • febrero 2008
  • enero 2008
  • diciembre 2007
  • noviembre 2007
  • octubre 2007
  • septiembre 2007
  • agosto 2007
  • abril 2007
  • febrero 2007
  • enero 2007

Categorías

  • .NET
  • C#
  • Channel9
  • Evento
  • Personal
  • Videos

Meta

  • Acceder
  • RSS de las entradas
  • RSS de los comentarios
  • WordPress.org
About This Site

A cras tincidunt, ut tellus et. Gravida scel ipsum sed iaculis, nunc non nam. Placerat sed phase llus, purus purus elit.

Archives Widget
  • January 2010
  • December 2009
  • November 2009
  • October 2009
Categories
  • Entertainment
  • Technology
  • Sports & Recreation
  • Jobs & Lifestyle
Search
  • facebook
  • twitter
  • rss

Powered by WordPress  |  Business Directory by InkThemes.

This site uses cookies: Find out more.