Creamos dentro de la tabla correspondiente un campo varbinary(max) que alojará nuestro fichero. Dentro de un formulario metemos un FileUpload que capturé el fichero a subir y un botón que será el que capturé el evento de guardarlo.
Bien en el codebehind del botón ponemos lo siguiente:
if (FileUpload1.HasFile)
{
//Creamos un array de bytes para almacenar los datos leídos por fs.
Byte[] data = FileUpload1.FileBytes;
//Y guardamos los datos en el array data
Incidencias.Incidencia.fichero = data;
}
Esto está por LINQ to SQL pero por ADO.NET sería exactamente igual, se lo pasaríamos como un parámetro más a la inserción y listo.
En el momento de querer descargar el fichero, los pasos a seguir son los siguientes. Metemos en el formulario un botón descargar y en la parte de código lo siguiente:
protected void btnDescargar_Click(object sender, ImageClickEventArgs e)
{
try
{
IncidencyManager Incidencias = new IncidencyManager(int.Parse(idPruebaGuardar));
Response.ClearContent();
Response.ClearHeaders();
Response.Buffer = true;
Response.ContentType = "text/plain";
Response.AddHeader("Content-Disposition", "attachment; filename=" + txtFichero.Text);
Response.BinaryWrite(Incidencias.Incidencia.fichero.ToArray());
Response.Flush();
Response.Close();
}
catch (Exception ex)
{
}
}
Lo mismo, está en LINQ pero sino en al BinaryWrite le pasaís el parametro correspondiente y perfecto. Dejar el catch sin nada porque en el caso de querer cancelar el usuario la descarga, se produce una excepción, pero que en mi opinión no se debería de capturar.