Editar documentos almacenados como array de bits en SQL Server [FileStream] (1/n)
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:
-
Activar FILESTREAM en nuestro servidor SQL Server.
-
Crear una base de datos habilitada para FILESTREAM
-
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:
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! 😀