none
Como consultar imagenes que estan en BD desde VS a traves de procimientos en capa de datos. RRS feed

  • Pregunta

  • Saludos amigos!

    Solicito de su ayuda, me encuentro trabajando en VS2013 / SQL Server 2008 / C# con WinForms

    Les comento tengo el siguiente SP:

    -- =============================================

    ALTER PROCEDURE [dbo].[DSIsp_Datos_FDRelacionImgPorDoc_BuscarRelacionDeImagenesPorDocumentos]
    @idDocumento int
    ,@cve_alumno nvarchar(7)
    ,@imgdigitalizado image output
    AS
    BEGIN
    SET NOCOUNT ON;
    select imgdigitalizado from RelDigPorDocumento where (idDocumento = @idDocumento and cve_alumno = @cve_alumno)
    END

    Tengo en la capa de Datos FDRelacionImgPorDocs el siguiente codigo para llamar al SP anterior:

               

            public static Image[] BuscarRelacionDeImagenesPorDocumentos(int lnIdDocumento, string lpClaveAlumno)
            {
                SqlParameter[] dbParams = new SqlParameter[]
                    {
                        FDBHelperReDi.MakeParam("@idDocumento", SqlDbType.Int, 0, lnIdDocumento),
                        FDBHelperReDi.MakeParam("@cve_alumno", SqlDbType.NVarChar, 0, lpClaveAlumno)
                    };
    return FDBHelperReDi.ExecuteScalar("DSIsp_Datos_FDRelacionImgPorDoc_BuscarRelacionDeImagenesPorDocumentos", dbParams);
            }

    Es en el codigo previo donde tengo el primer error, como declarar al procedimiento para que recolecte dato de tipo imagen procedente del SP.....?

    El siguiente codigo que intento hacer en el form para recuperar la imagen y luego se lo asignare a un listview, El cual evidentemente esta mal.... base el codigo que realizo en un ejemplo muy bueno publicado por Leandro pero solo extraje fragmentos, por ejemplo de la capa de datos para guardar la imagen y para leerla...:

                Byte ImgBinario = FDRelacionImgPorDoc.BuscarRelacionDeImagenesPorDocumentos(Convert.ToInt16(txtflag.Text.Trim()), pClaveAlumno);
                picdigitalizada.Image = FDHelperImagen.ByteArrayToImage(ImgBinario);

    Cabe resaltar que ya lo habia realizado pero trabajaba con las imagenes extraidas desde el escaner y grabadas en carpetas que estaban en ciertas rutas en la PC, ahora tengo que trabajarlas directo en la BD por seguridad de la información...

    Aquí la ventana de lo que tengo e intento hacer ahora trabajando con las imagenes desde la BD.

    Muchas gracias por su ayuda....

    Atentamente.- Marco Bueno


    • Editado Marco Bueno jueves, 2 de julio de 2015 16:41 Corrección de titulo
    jueves, 2 de julio de 2015 16:39

Todas las respuestas

  • Es en el codigo previo donde tengo el primer error, como declarar al procedimiento para que recolecte dato de tipo imagen procedente del SP.....?

    Me temo que estás mezclando el tipo IMAGE del servidor con el tipo System.Drawing.Image de .Net. Los dos son muy distintos aunque contengan la palabra "image".

    El IMAGE del servidor te da un servicio parecido al más moderno VARBINARY(MAX), es decir, guarda una secuencia de bytes, y (pese a su nombre) en realidad no "entiende" esos bytes y no sabe si corresponden a una imagen o no. Cuando lees el IMAGE desde .NET lo que te devuelve es un array de bytes.

    El Image de .NET (suponiendo que tengas un "using System.Drawing;") representa una imagen, y este sí que entiende el contenido como tal, por lo que no acepta bytes arbitrarios como contenido.

    Para hacer la conversión, puedes sustituir la línea donde haces return FDBHelperReDi.ExecuteScalar por una secuencia de pasos parecida a esta:

    byte[] b = (byte[]) FDBHelperReDi.ExecuteScalar;
    MemoryStream ms = new MemoryStream(b);
    Image img = Image.FromStream(ms);
    return img;
    Requiere un using System.IO.
    jueves, 2 de julio de 2015 17:33
  • Saludos Alberto Población!

    Muchas gracias amigo, en efecto lo que comentas tiene gran razón... espero no te parezca encajoso de mi parte, pero si me pudieras auxiliar...

    Te comento ya aplique el codigo que me recomendastes que era te comento era la parte del FDHelperImagen.ByteArrayToImage(ImgBinario);... y es aquí donde tengo el problema, si se tratase de por ejemplo 4 imagenes resultantes del SP que esta en SQL, como podria hacer para vaciar el resultado en un listview de todas las imagenes, yo pretendi hacer algo asi, pero no me fue funcional:

     Image lImgBinario = FDRelacionImgPorDoc.BuscarRelacionDeImagenesPorDocumentos(Convert.ToInt16(txtflag.Text.Trim()), pClaveAlumno);
                picdigitalizada.Image = lImgBinario;
                this.ImgList.Images.Add(lImgBinario);
                this.lvDigitalizaciones.View = View.LargeIcon;
                this.ImgList.ImageSize = new Size(110, 90);
                this.lvDigitalizaciones.LargeImageList = this.ImgList;

    Donde lvDigitalizaciones es mi listview, pero lo deja en blanco....

    Muchas gracias.

    jueves, 2 de julio de 2015 18:03