Você está na página 1de 7

Guardar Archivos Binarios en SQL Server | ->Developers->Null

->Developers->Null
Desarrolladores apuntando a Null

Hello world!
Autonumricos en Oracle

Guardar Archivos Binarios en SQLServer


Extraido de Picacodigos
Mon Feb 20 2006
En mi proyecto actual, una aplicacin ASP .NET, el cliente expres el deseo de guardar en base de datos
las cartas, basadas en plantillas Word y generadas mediante la aplicacin. Quieren guardarlas en la base de
datos porque, al ser documentos oficiales, tienen que poder volver a imprimirse o visualizarse
exactamente igual a como se crearon en su da. Por lo tanto, necesitamos un mtodo para guardar los
ficheros Word en la base de datos en formato binario, como stream de datos y ser capaces de poder
recuperarlos despus para su visualizacin.

Nota: no es el objetivo de este post la creacin de ficheros Word desde cdigo C#. Podis usar para ello la
automatizacin Word, o componentes de terceros como los publicados por Aspose, que son excelentes.
Vamos a crear una tabla simple en SQL Server para alojar los documentos. Para este ejemplo, la
llamaremos DocsBinarios, y tendr la siguiente estructura:
Campo
DocId
Documento
NombreDoc

Tipo
Int (identity)
Image
VarChar(100)

Nulos?
No
No
No

Es bastante autoexplicativo: el campo DocId es un campo de clave primaria autogenerado. El campo


Documento es el que va a almacenar los streams de bits, es decir los propios ficheros Word en formato
binario. El campo NombreDoc almacenar el nombre que se proporcion originalmente al documento
cuando se gener.
Despus crearemos un procedimiento almacenado, UploadDocs, que servir para guardar registros en
esta tabla:
CREATEPROCEDURE UploadDoc(@doc AS Image,@nombre ASVarChar(100))
AS
INSERTINTO DocsBinarios(Documento,NombreDoc) values (@doc,@nombre)
GO
Colorized by: CarlosAg.CodeColorizer

http://developersnull.wordpress.com/2008/07/02/guardar-archivos-binarios-en-sql-server/[31/05/2014 11:32:22 a. m.]

Guardar Archivos Binarios en SQL Server | ->Developers->Null

Tambin es bastante autoexplicativo: un simple INSERT INTO que recibe como parmetros un Image y un
VarChar
Y ste es el mtodo que guarda los datos en la base de datos:
privatevoid GuardarFicheroBDD(string sRuta, string sFichero)
{
//CreamosunnuevoobjetodetipoFileStreamparaleerelfichero
//Wordenmodobinario
System.IO.FileStreamfs =new FileStream(sRuta+sFichero,
System.IO.FileMode.Open);
//Creamosunarraydebytesparaalmacenarlosdatosledosporfs.
Byte[]data =newbyte[fs.Length];
//Yguardamoslosdatosenelarraydata
fs.Read(data, 0,Convert.ToInt32(fs.Length));
//Abrimosunaconexion.Enestecasolosdatosdelacadenade
//conexionalabasededatos se recuperan de una seccin del
//ficheroweb.configmediante ConfigurationSettings
SqlConnectioncnn =
new SqlConnection(ConfigurationSettings.AppSettings["conexionBD"]);
cnn.Open();
//CreamosuncomandodetipoStoredProcedureparainvocara
//UploadDocs
SqlCommandcmd =new SqlCommand(UploadDoc,cnn);
cmd.CommandType = CommandType.StoredProcedure;
//Aadimoslosparametrosesperadosylosvaloresdelosmismos
cmd.Parameters.Add(@doc,data); //losdatosdelficheroWord
cmd.Parameters.Add(@nombre,sFichero); //ysunombre
//Ejecutamoselprocedimientoalmacenado,queinsertaunnuevo
//registroenDocsBinarios conlosdatosquequeremosintroducir
cmd.ExecuteNonQuery();
//Cerramoslaconexinyelfichero
cnn.Close();
fs.Close();
}
Colorized by: CarlosAg.CodeColorizer

Ahora veamos el mtodo para recuperar esos datos de la base de datos y mostrarlos como un fichero
Word:
privatevoid LeerDeBD()
{
//Abrimoslaconexion,exactamenteigualqueantes
SqlConnectioncnn =
new SqlConnection(ConfigurationSettings.AppSettings["conexionBD"]);
cnn.Open();
//Esteeselcomandoqueabreelregistroquedeseamos.Paraeste
//ejemploabrimossiempreelprimer registro,habraquemodificar
// estecdigo paraqueelmtodorecibieracomoparmetroel
//registroquequeremosabrir,claro.
SqlCommandcomm =new SqlCommand(SELECT*FROMDocsBinarios +
WHEREdocId=1,cnn);
comm.CommandType = CommandType.Text;
SqlDataAdapterda =new SqlDataAdapter(comm);
DataSetds =new DataSet(Binarios);
da.Fill(ds);

http://developersnull.wordpress.com/2008/07/02/guardar-archivos-binarios-en-sql-server/[31/05/2014 11:32:22 a. m.]

Guardar Archivos Binarios en SQL Server | ->Developers->Null

//Creamosunarraydebytesquecontienelosbytesalmacenados
//enelcampoDocumento delatabla
byte[]bits = ((byte[])(ds.Tables[0].Rows[0].ItemArray[1]));
cnn.Close();
//Vamosaguardaresearraydebytescomounficheroenel
//discoduro,unfichero temporalquedespussepodrdescartar.
//Paraevitarproblemasdeconcurrencia deusuarios,
//generamosunnombrenicoparaelmismo
string sFile = tmp +GenerarNombreFichero()+ .doc;
//CreamosunnuevoFileStream,queestavezservirpara
//crearunfichero conelnombreespecificado
FileStreamfs =new FileStream(Server.MapPath(.)+
@\DocsGenerados\ +sFile,FileMode.Create);
//Yescribimosendiscoelarraydebytesqueconforman
//elficheroWord
fs.Write(bits, 0,Convert.ToInt32(bits.Length));
fs.Close();
//Paramostrarelfichero,utilizamosunafuncin
//JavaScriptllamada mostrarFichero(quelonicoque
//haceescargarelficheroespecificado)
//yhacemosqueseejecuteenunpop-up.
string script = <scriptlanguaje=javascript>;
script+= mostrarFichero(DocsGenerados/ +sFile+ );
script+= </script> +Environment.NewLine;
Page.RegisterStartupScript(mostrarFichero,script);
}
Colorized by: CarlosAg.CodeColorizer

Y listo. Mediante ste ltimo mtodo el fichero Word se carga desde la base de datos y se muestra en un
popup y en todo su esplendor.
Para que tengis el cdigo completo, sta es la funcin JavaScript que carga el fichero generado desde
base de datos:
<scriptlanguage=javascript>
function mostrarFichero(destino){
window.open(destino,null,directories=no,height=600,
width=800,left=0,top=0,location=no,menubar=yes,
status=no,toolbar=yes,resizable=yes)
document.forms(0).submit();
}
</script>
Colorized by: CarlosAg.CodeColorizer

Y ste el mtodo GenerarNombreFichero(), que utiliza la cuenta de ticks del servidor para crear
nombres cuasi nicos de fichero.
privatestring GenerarNombreFichero()
{
int ultimoTick = 0;
while(ultimoTick==Environment.TickCount)
{
System.Threading.Thread.Sleep(1);
}
ultimoTick=Environment.TickCount;

http://developersnull.wordpress.com/2008/07/02/guardar-archivos-binarios-en-sql-server/[31/05/2014 11:32:22 a. m.]

Guardar Archivos Binarios en SQL Server | ->Developers->Null

return DateTime.Now.ToString(yyyyMMddhhmmss)+ . +
ultimoTick.ToString();
}
Colorized by: CarlosAg.CodeColorizer

Like this:

This entry was posted on July 2, 2008 at 1:24 pm and is filed under .net. You can follow any responses to this entry through the
RSS 2.0 feed. You can leave a response, or trackback from your own site.

19 Responses to Guardar Archivos Binarios en SQLServer


1. Franklin Says:

July 4, 2008 at 4:03 am | Reply

Ok, so good example


2. Antonio Says:

July 4, 2008 at 6:06 pm | Reply

Todo perfectamente explicado el ejemplo muy prctico, sigo esperando mas posts
3. Julia Says:

July 7, 2008 at 9:22 pm | Reply

jejeje que bueno el codigo. x___x


para cranearse.
Saludos!
4. tamara Says:

June 24, 2010 at 1:22 am | Reply

puta madre gracias men


5. XoKo! Says:

May 20, 2011 at 6:00 pm | Reply

oye bro! y cmo le hago para (luego de recuperarlo) guardar ese archivo en una ubicacin local??
6. bpbrainiak Says:

May 20, 2011 at 6:53 pm | Reply

@XoKo!
hola que tal, mira fijate bien en el codigo hay un metodo que se llama LeerDeBD() y otro que se
llama mostrarFichero() de js que te permite hacer ese trabahjo
7. XoKo! Says:

May 20, 2011 at 9:38 pm | Reply

:S s, lo v con ms detenimiento y ya lo apliqu a mi proyecto


FileStream fs = new FileStream(@C:\ + sFile, FileMode.Create);
http://developersnull.wordpress.com/2008/07/02/guardar-archivos-binarios-en-sql-server/[31/05/2014 11:32:22 a. m.]

Guardar Archivos Binarios en SQL Server | ->Developers->Null

en mi caso estoy haciendo pruebas con archivos dll y exe y funciona correctamente!
Grax!
8. El Principito Says:

May 27, 2011 at 5:16 pm | Reply

Excelente post! Muy util! Muchas gracias!


9. eureka Says:

August 10, 2011 at 10:17 pm | Reply

esta muy bueno este post, una consulta tendras de la forma en asp
10. bpbrainiak Says:

August 10, 2011 at 11:44 pm | Reply

hola eureka, no lamentablemente no lo tengo, ya que hace ya varios aos que no programo en asp
old school
11. william Says:

October 24, 2011 at 5:20 pm | Reply

hola, antes de guardar el archivo no es necesario escanearlo por si viene con virus?

bpbrainiak Says:

October 24, 2011 at 5:26 pm | Reply

Estimado, si el monitor de virus de tu antivirus analiza los archivos al momento de crearlos, este
deberia bloquear el acceso a el (por ende el programa fallar) y mantener tu sistema sano,
pero eso ya es alcance del administrador del server
Saludos Ulises Ruz Puga
while(true) {yo.Programo(this)}
12. implantacion erp Says:

January 3, 2012 at 1:46 am | Reply

implantacion erp
[...]Guardar Archivos Binarios en SQL Server ->Developers->Null[...]
13. cms dle Says:

January 20, 2012 at 1:53 am | Reply

cms dle
[...]Guardar Archivos Binarios en SQL Server ->Developers->Null[...]
14. julian Says:

February 9, 2012 at 9:28 pm | Reply

hola me podrias ayudar con este problema GRacias


http://social.msdn.microsoft.com/Forums/es-ES/netfxwebes/thread/7b335901-d297-419a-90321a5dae24691e/

http://developersnull.wordpress.com/2008/07/02/guardar-archivos-binarios-en-sql-server/[31/05/2014 11:32:22 a. m.]

Guardar Archivos Binarios en SQL Server | ->Developers->Null

15. Victor Hugo Gutierrez Carvajal Says:


April 9, 2012 at 4:42 pm | Reply

como puedo realizar el mismo procedimiento, pero en vb.net 2008 para adjuntar los documentos y
poder recuperarlos
Gracias por la atencion prestada.
16. nelson mateo Says:

January 11, 2013 at 1:35 pm | Reply

amigo como , yo lo que necesito es el cdigo para poder insertar una imagen a mi db sql 2005 en
visual web developer c#, ya puedo cargar a un directorio de mi disco, pero me gustara cargarla a mi
base de datos, para cargar la imagen al directorio de mi disco utilizo FileUpload1

bpbrainiak Says:

January 11, 2013 at 1:58 pm | Reply

bueno puedes basarte en el codigo que esta ahi para poder recuperar tus datos desde tu base
de datos y para guardarla, si lees bien el cdigo casi se explica solo
saludos!
Enviado de mi dispositivo tecnolgico super secreto eehh no
Por que as nos ha mandado el seor diciendo: te he puesto para luz de los gentiles, a fin de
que seas para salvacin hasta lo ultimo de la tierra (Hechos 13:47)
17. soins chiropratiques Sherbrooke Says:
May 1, 2014 at 10:51 am | Reply

This is a topic that is close to my heart


Best wishes! Exactly where are your contact details though?

Leave a Reply

The Kubrick Theme. Create a free website or blog at WordPress.com.


Entries (RSS) and Comments (RSS).
Follow

Follow ->Developers->Null
Get every new post delivered to your Inbox.
Enter your email address

Sign me up

Powered by WordPress.com
%d bloggers like this:

http://developersnull.wordpress.com/2008/07/02/guardar-archivos-binarios-en-sql-server/[31/05/2014 11:32:22 a. m.]

Guardar Archivos Binarios en SQL Server | ->Developers->Null

http://developersnull.wordpress.com/2008/07/02/guardar-archivos-binarios-en-sql-server/[31/05/2014 11:32:22 a. m.]

Você também pode gostar