Bienvenido a la cuarta parte de nuestra serie sobre el almacenamiento de imágenes y archivos BLOB en SQL Server. En los artículos anteriores, discutimos el concepto de BLOBs y cuándo es apropiado almacenarlos dentro de SQL Server en lugar del sistema de archivos. También exploramos diferentes tipos de VARBINARIES, con un enfoque en el tipo de datos VARBINARY(MAX).
En este artículo, continuaremos expandiendo y mejorando los ejemplos de los artículos anteriores. Crearemos una aplicación web para insertar imágenes en SQL Server y exploraremos los beneficios de usar procedimientos almacenados en lugar de declaraciones SQL.
Creación de una base de datos de prueba
Antes de comenzar, creemos una base de datos de prueba y una tabla para almacenar imágenes. Ejecute el siguiente script de TSQL:
USE master;
GO
CREATE DATABASE BLOBTest4;
GO
USE BLOBTest4;
GO
CREATE TABLE BLOBFromWeb (
BLOBData varbinary(max)
);
GO
Este script crea una base de datos de prueba llamada “BLOBTest4” y una tabla llamada “BLOBFromWeb” con una columna única llamada “BLOBData”. La columna “BLOBData” utiliza la palabra clave MAX, lo que le permite almacenar binarios de cualquier tamaño.
Creación de un procedimiento almacenado
A continuación, creemos un procedimiento almacenado que será utilizado por nuestra página web para cargar imágenes. Ejecute el siguiente script:
CREATE PROCEDURE WebUp (
@FileData varbinary(max)
)
AS
INSERT INTO BLOBFromWeb (BLOBData)
VALUES (@FileData);
Este procedimiento almacenado toma un parámetro, “@FileData”, que representa la imagen que se cargará en SQL Server. Utilizaremos procedimientos almacenados en lugar de declaraciones SQL para el resto de los ejemplos en esta serie, ya que ofrecen beneficios como mayor seguridad, prevención de ataques de inyección SQL, portabilidad y rendimiento.
Inserción en SQL desde la web
Ahora, creemos un formulario web utilizando Microsoft Visual Studio para permitir al usuario final navegar y cargar un archivo en SQL Server. Siga estos pasos:
- Cree un nuevo sitio web en Visual Studio.
- Agregue una página ASPX al proyecto.
- Arrastre y suelte un control FileUpload y un control Button en el formulario.
- En la vista de origen de la página, cambie la etiqueta <form> predeterminada por la siguiente:
<form id="form1" runat="server" enctype="multipart/form-data">
El atributo “enctype” especifica cómo se codifican los datos del formulario.
- Haga doble clic en el botón para crear un evento On Click.
Esto abrirá la página de código detrás. En la parte superior de la página, agregue las siguientes declaraciones de uso:
using System.Data.Sql; using System.Data.SqlClient; using System.IO;
A continuación, agregue el siguiente código en el evento Button1_Click:
string sConn = @"server=.; database=BLOBTest4; Integrated Security=True";
SqlConnection objConn = new SqlConnection(sConn);
objConn.Open();
SqlCommand objCmd = new SqlCommand("WebUp", objConn);
objCmd.CommandType = CommandType.StoredProcedure;
SqlParameter paramFileData = objCmd.Parameters.Add("@FileData", SqlDbType.VarBinary);
paramFileData.Direction = ParameterDirection.Input;
byte[] bImage = new byte[FileUpload1.PostedFile.ContentLength];
Stream objStream = FileUpload1.PostedFile.InputStream;
objStream.Read(bImage, 0, FileUpload1.PostedFile.ContentLength);
paramFileData.Value = bImage;
objCmd.ExecuteNonQuery();
objConn.Close();
Este código establece una conexión con SQL Server, abre la base de datos, crea un objeto de comando SQL vinculado al procedimiento almacenado “WebUp” y establece el CommandType en Stored Procedure. Luego, crea un parámetro para los datos de la imagen y lee la imagen en una matriz de bytes. Finalmente, pasa los datos de la imagen al parámetro SQL y ejecuta el procedimiento almacenado.
Ahora, puede ejecutar la aplicación web, buscar un archivo y hacer clic en el botón para cargar el archivo en SQL Server.
Visualización de los resultados
A estas alturas, es posible que se pregunte cómo ver las imágenes cargadas en SQL Server. Desafortunadamente, SQL Server no proporciona un visor de BLOB incorporado. Sin embargo, podemos crear un visor simple utilizando un procedimiento almacenado. Ejecute el siguiente script para crear el visor:
CREATE PROCEDURE BLOBViewer AS SELECT BLOBData FROM BLOBFromWeb;
A continuación, cree una página ASPX con código detrás. En la página de código detrás, agregue las siguientes declaraciones de uso:
using System.Data.Sql; using System.Data.SqlClient;
En la sección Page_Load, use el siguiente código para ejecutar el procedimiento almacenado:
string sConn = @"server=.; database=BLOBTest4; Integrated Security=True";
SqlConnection objConn = new SqlConnection(sConn);
objConn.Open();
SqlCommand objCmd = new SqlCommand("BLOBViewer", objConn);
objCmd.CommandType = CommandType.StoredProcedure;
SqlDataReader dr = objCmd.ExecuteReader();
dr.Read();
Response.BinaryWrite((byte[])dr["BLOBData"]);
objConn.Close();
Este código establece una conexión con SQL Server, abre la base de datos, crea un objeto de comando SQL vinculado al procedimiento almacenado “BLOBViewer” y establece el CommandType en Stored Procedure. Luego, ejecuta el procedimiento almacenado y escribe los datos binarios en la respuesta, lo que permite que la imagen se muestre en el navegador.
Conclusión
Trabajar con BLOBs y SQL Server puede ser un poco diferente a trabajar con datos ASCII. Los datos almacenados dentro de SQL Server no son visibles como datos de caracteres y se requiere un manejo especial de los datos, como el uso de una matriz de bytes, antes de enviarlos a SQL Server. Sin embargo, los beneficios de almacenar imágenes y archivos BLOB en SQL Server, como mayor seguridad y rendimiento, hacen que valga la pena.
Manténgase atento a la próxima parte de nuestra serie, donde exploraremos técnicas más avanzadas para trabajar con imágenes y archivos BLOB en SQL Server.