jueves, 3 de septiembre de 2009

Descarga de adjuntos desde SQL Server

La forma soportada de descargar ficheros documentada en la SDK de CRM 4.0 nos obliga a una petición por cada uno de los ficheros adjuntos que deseamos descargar, lo cual podría ser bastante lento.
Por eso he intentado buscar alguna forma no soportada de realizarlo, ya que al final los ficheros en CRM están almacenados en el SQL Server.
Los adjuntos se encuentran en el campo "DocumentBody" de la tabla "Annotation" y están almacenados en campos de tipo "text" en formato Base64.
Para accededer a los mismos hay que hacer una consulta SQL como la siguiente:

SELECT FileName,FileSize, DocumentBody
FROM FilteredAnnotation
WHERE FileName is not null
AND ObjectId=<Guid de la entidad>

Así, una vez recogidos los resultados de la consulta, hay que convertir esos ficheros en Base64 a ficheros físicos en el disco duro.

Byte[] filebytes = Convert.FromBase64String(Registro["DocumentBody"].ToString());
FileStream fs = new FileStream("C:\\Adjuntos\\" + Registro["FileName"].ToString() , FileMode.CreateNew, FileAccess.Write, FileShare.None);
fs.Write(filebytes, 0, filebytes.Length);
fs.Close();

En este ejemplo de código "Registro" es un DataRow, que se ha recogido de hacer la consulta SQL anterior, y los ficheros son almacenados en la carpeta "C:\Adjuntos\".

un saludo

1 comentario:

  1. Hola buenos dias, antes que nada gracias por este post es justo lo que estoy buscando, tengo una pregunta, este codigo donde lo ejecutas "Byte[] filebytes = Convert.FromBase64String(Registro["DocumentBody"].ToString());
    FileStream fs = new FileStream("C:\\Adjuntos\\" + Registro["FileName"].ToString() , FileMode.CreateNew, FileAccess.Write, FileShare.None);
    fs.Write(filebytes, 0, filebytes.Length);
    fs.Close();"

    Gracias por el apoyo

    Saludos

    ResponderEliminar