Guardar Archivos Binarios en SQL Server | ->Developers->Null
->Developers->Null Desarrolladores apuntando a Null
« Hello world! Autonuméricos en Oracle… » Oracle… »
Guardar Archivos Binarios en SQL Server Extraido de Picacodigos Mon Feb 20 2006 En mi proyecto actual, una aplicación ASP .NET, el cliente expresó el deseo de guardar en base de datos las cartas, basadas en plantillas Word y generadas mediante la aplicación. 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 día. Por lo tanto, necesitamos un método para guardar los ficheros ficheros Word en la base de datos en formato binario, como como stream de de datos y ser capaces de poder recuperarlos después para su visualización. Nota: no es el objetivo de este post la creación creación de ficheros Word desde código código C#. Podéis usar usar para ello la automatización Word, o componentes de terceros como los publicados por Aspose por Aspose , que son excelentes. Vamos a crear una tabla simple en SQL Server para alojar los documentos. docu mentos. Para este ejemplo, la llamaremos DocsBinarios, y tendrá la siguiente estructura: Campo
Tipo
Nulos?
Do c I d Documento NombreDoc
Int (identity) No Image No VarChar(100) 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ó. generó. Después crearemos un procedimiento almacenado, UploadDocs, que servirá para guardar registros en esta tabla: CREATE PROCEDURE UploadDoc(@doc AS UploadDoc(@doc AS Image, @nombre AS @nombre AS VarChar( VarChar ( 100 100)) )) AS INSERT INTO DocsBinarios (Documento, NombreDoc) values (@doc, @nombre) GO Colorized by: CarlosAg.CodeColorizer
Guardar Archivos Binarios en SQL Server | ->Developers->Null
También es bastante autoexplicativo: un simple INSERT INTO que recibe como parámetros un Image y un VarChar Y éste es el método que guarda los datos en la base de datos: private void GuardarFicheroBDD(string sRuta, string sFichero) { //Creamos un nuevo objeto de tipo FileStream para leer el fichero //Word en modo binario System.IO.FileStream fs = new FileStream(sRuta + sFichero, System.IO.FileMode.Open); //Creamos un array de bytes para almacenar los datos leídos por fs. Byte[] data = new byte[fs.Length]; //Y guardamos los datos en el array data fs.Read(data, 0, Convert.ToInt32(fs.Length)); //Abrimos una conexion. En este caso los datos de la cadena de //conexion a la base de datos se recuperan de una sección del //fichero web.config mediante ConfigurationSettings SqlConnection cnn = new SqlConnection(ConfigurationSettings.AppSettings["conexionBD"]); cnn.Open(); //Creamos un comando de tipo StoredProcedure para invocar a //UploadDocs SqlCommand cmd = new SqlCommand( “UploadDoc” , cnn); cmd.CommandType = CommandType.StoredProcedure; //Añadimos los parametros esperados y los valores de los mismos cmd.Parameters.Add( “@doc” , data); //los datos del fichero Word cmd.Parameters.Add( “@nombre” , sFichero); //y su nombre //Ejecutamos el procedimiento almacenado, que inserta un nuevo //registro en DocsBinarios con los datos que queremos introducir cmd.ExecuteNonQuery(); //Cerramos la conexión y el fichero cnn.Close(); fs.Close(); } Colorized by: CarlosAg.CodeColorizer
Ahora veamos el método para recuperar esos datos de la base de datos y mostrarlos como un fichero Word: private void LeerDeBD() { //Abrimos la conexion, exactamente igual que antes SqlConnection cnn = new SqlConnection(ConfigurationSettings.AppSettings["conexionBD"]); cnn.Open(); //Este es el comando que abre el registro que deseamos. Para este //ejemplo abrimos siempre el primer registro, habría que modificar // este código para que el método recibiera como parámetro el //registro que queremos abrir, claro. SqlCommand comm = new SqlCommand( “SELECT * FROM DocsBinarios ” + ” WHERE docId = 1″ , cnn); comm.CommandType = CommandType.Text; SqlDataAdapter da = new SqlDataAdapter(comm); DataSet ds = new DataSet( “Binarios” ) ; da.Fill(ds);
Guardar Archivos Binarios en SQL Server | ->Developers->Null
//Creamos un array de bytes que contiene los bytes almacenados //en el campo Documento de la tabla byte[] bits = ((byte[])(ds.Tables[0].Rows[0].ItemArray[1])); cnn.Close(); //Vamos a guardar ese array de bytes como un fichero en el //disco duro, un fichero temporal que después se podrá descartar. //Para evitar problemas de concurrencia de usuarios, //generamos un nombre único para el mismo string sFile = “tmp” + GenerarNombreFichero() + “.doc” ; //Creamos un nuevo FileStream, que esta vez servirá para //crear un fichero con el nombre especificado FileStream fs = new FileStream(Server.MapPath( “.” ) + @”\DocsGenerados\” + sFile, FileMode.Create); //Y escribimos en disco el array de bytes que conforman //el fichero Word fs.Write(bits, 0, Convert.ToInt32(bits.Length)); fs.Close(); //Para mostrar el fichero, utilizamos una función //JavaScript llamada mostrarFichero (que lo único que //hace es cargar el fichero especificado) //y hacemos que se ejecute en un pop-up. string script = “<script languaje=’javascript’> “; script += “mostrarFichero(‘DocsGenerados/” + sFile + “‘) “; script += “” + Environment.NewLine; Page.RegisterStartupScript( “mostrarFichero” ,script); } Colorized by: CarlosAg.CodeColorizer
Y listo. Mediante éste último método el fichero Word se carga desde la base de datos y se muestra en un popup y en todo su esplendor. Para que tengáis el código completo, ésta es la función JavaScript que carga el fichero generado desde base de datos: <script language= “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(); } Colorized by: CarlosAg.CodeColorizer
Y éste el método GenerarNombreFichero(), que utiliza la cuenta de ticks del servidor para crear nombres cuasi únicos de fichero. private string GenerarNombreFichero() { int ultimoTick = 0; while(ultimoTick ==Environment.TickCount) { System.Threading.Thread.Sleep(1); } ultimoTick =Environment.TickCount;
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 SQL Server” 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 práctico, 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 cómo le hago para (luego de recuperarlo) guardar ese archivo en una ubicación 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 más detenimiento y ya lo apliqué a mi proyecto… FileStream fs = new FileStream(@”C:\” + sFile, FileMode.Create);
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 años 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/
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 código 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 gustaría 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 c�digo casi se explica solo
saludos! Enviado de mi dispositivo tecnol�gico super secreto… eehh… no… Por que as� nos ha mandado el se�or diciendo: te he puesto para luz de los gentiles, a fin de que seas para salvaci�n 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:
Guardar Archivos Binarios en SQL Server | ->Developers->Null