martes, 8 de septiembre de 2009

Guardar Imágen/BLOB en SQL Server

Recientemente tuve la necesidad de insertar imágenes en un campo VARBINARY(MAX) de SQL Server 2008.

No me interesaba tanto la funcionalidad de realizar la insercción desde mi pequeño proyectito de C#, me quería enfocar a leer dicho dato para luego serializarlo y exponerlo en un Web Service.

Esto fue lo que me encontré por ahi:

T-SQL
1:  CREATE TABLE MiTabla   
2:    (id int, image varbinary(max))  
3:  INSERT INTO MiTabla  
4:    SELECT   1 as id  
5:      ,(SELECT * FROM OPENROWSET(  
6:        BULK 'C:\popita.jpg', SINGLE_BLOB) as image )  

Recordar, estamos guardando la imagen como bytes no un objeto Image ó Bitmap.

Para leer este desde C# es bastante sencillo:
(Ustedes hagan todo su rollo de la conección a la base de datos...pondré solo lo sustancial...)

C#
1:  SqlDataReader rdrGetData=(new SqlCommand("SELECT * FROM MiTabla WHERE id=1",miSQLConn)).ExecuteReader();  
2:  if(rdrGetData.HasRows)  
3:  {  
4:    rdrGetData.Read();  
5:    if (!rdrGetData.IsDBNull(1))  
6:    {  
7:      SqlBytes bytes = rdrGetData.GetSqlBytes(1);  
8:      FileStream fs = new FileStream("g:\\popis.jpg", FileMode.OpenOrCreate, FileAccess.Write);  
9:      byte[] byteImage = new byte[bytes.Length];  
10:     int readedBytes=bytes.Stream.Read(byteImage, 0, Convert.ToInt32(bytes.Length));  
11:     fs.Write(byteImage, 0, byteImage.Length);                 
12:     fs.Close();                        
13:  }  

No olviden cerrar el DataReader

No hay comentarios: