none
Error en linea: myCommand.ExecuteScalar() con el siguiente mensaje: "La propiedad Size tiene un tamaño no válido de 0...." RRS feed

  • Pregunta

  • Saludos amigos !

    Estamos trabajando sobre ASP.net / SQL Server / VS 2010 / VB

    Les solicito de su ayuda, estamos tratando de traer una imagen de la BD y mostrarla en una pagina web. La estructura es la siguiente:

    Perfil.aspx tiene un boton con el siguiente codigo:

            Dim CveUnica As String = "0149384"
            Dim NumDoc As String = "1"

            Dim sUrl As String = "MostrarImagen.aspx?ClaveAlumno=" + CveUnica + "&NumeroDocumento=" + NumDoc
            Dim sScript As String = "<script language =javascript> "
            sScript += "window.open('" & sUrl & "',null,'toolbar=0,scrollbars=1,location=0,statusbar=0,menubar=0,resizable=0,width=800,height=380,left=150,top=60');"
            sScript += "</script> "
            Response.Write(sScript)

    MostrarImagen.aspx es la web que mostrara a la imagen al recibir los 2 parametros, esto los recibimos en el Load y mandamos llamar al procedimiento de sql.... aquí el codigo:

        Protected Sub form1_Load(sender As Object, e As System.EventArgs) Handles form1.Load

            Dim myCommand As Data.SqlClient.SqlCommand
            'Dim myDataReader As Data.SqlClient.SqlDataReader

            Dim Conn As New Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("ConReDi").ConnectionString)
            myCommand = New Data.SqlClient.SqlCommand("DSIsp_Web_BuscaImagenDeDocumentosSeleccionado", Conn)
            myCommand.CommandType = Data.CommandType.StoredProcedure

            Dim cve_alumno As New Data.SqlClient.SqlParameter("@cve_alumno", Data.SqlDbType.NVarChar, 7)
            cve_alumno.Direction = Data.ParameterDirection.Input
            cve_alumno.Value = txt1.Text.Trim
            myCommand.Parameters.Add(cve_alumno)

            Dim idDocumento As New Data.SqlClient.SqlParameter("@idDocumento", Data.SqlDbType.Int)
            idDocumento.Direction = Data.ParameterDirection.Input
            idDocumento.Value = Convert.ToInt32(txt2.Text.Trim)
            myCommand.Parameters.Add(idDocumento)

            Dim imgdigitalizado As New Data.SqlClient.SqlParameter("@imgdigitalizado", Data.SqlDbType.Image)
            imgdigitalizado.Direction = Data.ParameterDirection.Output
            myCommand.Parameters.Add(imgdigitalizado)
            Try
                If Conn.State = 0 Then
                    Conn.Open()
                    Dim byteImage As Byte() = DirectCast(myCommand.ExecuteScalar(), Byte())
                    If byteImage IsNot Nothing Then
                        Response.ContentType = "image/jpeg"
                        Response.Expires = 0
                        Response.Buffer = True
                        Response.Clear()
                        Response.BinaryWrite(byteImage)
                        Response.End()
                    End If
                    Conn.Close()
                End If
            Catch exc As Exception
                lblexc.Text = exc.ToString
            End Try

        End Sub

    Pero me esta marcando un error en myCommand.ExecuteScalar() el cual a continuación listo:

    System.InvalidOperationException: Byte[][2]: la propiedad Size tiene un tamaño no válido de 0. en System.Data.SqlClient.SqlParameter.Validate(Int32 index, Boolean isCommandProc) en System.Data.SqlClient.SqlCommand.SetUpRPCParameters(_SqlRPC rpc, Int32 startCount, Boolean inSchema, SqlParameterCollection parameters) en System.Data.SqlClient.SqlCommand.BuildRPC(Boolean inSchema, SqlParameterCollection parameters, _SqlRPC& rpc) en System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds) en System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) en System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) en System.Data.SqlClient.SqlCommand.ExecuteScalar() en MostrarImagen.form1_Load(Object sender, EventArgs e) en F:\Intranet\SecretariaEscolar\MostrarImagen.aspx.vb:línea 37

    No se como solucionarlo, me pueden porfavor ayudar, muchisimas gracias.

    Atentamente.- Marco

    viernes, 17 de julio de 2015 19:39

Respuestas

  • hola

    cuando usas el procedure cual es el objetivo del parametro de salida @imgdigitalizado ? digo porque estas usando el ExecuteScalar() no el parametro de salida

    ----

    si revisas esta linea

    string sql = "Select imgdigitalizado From ActaNacimientoImg  Where cve_alumno = " + txt1.Text " and " + txt2.Text

    a que campo aplica el txt2.Text ? ademas porque no usas parametros

    string sql = "Select imgdigitalizado From ActaNacimientoImg  Where cve_alumno = alumno";
    
    SqlCommand cmd= new SqlCommand(sql, SqlConn);
    cmd.Parameters.AddWithValue("@alumno", txt1.Text);

    no se concatena en un string los valores

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Marco Bueno lunes, 20 de julio de 2015 14:51
    viernes, 17 de julio de 2015 23:28

Todas las respuestas

  • hola

    pero estas ejecutando un procedure, como es el SELECT que define ?

    recuerda que si usas por ejemplo un MAX() este puede dar null por lo que se suele usar

    SELECT ISNULL(MAX(campo), 0) FROM ....

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 17 de julio de 2015 19:54
  • Saludos Leandro!

    Este es el codigo del SP en SQL, devuelve exclusivamente la imagen, de hecho cada clave por default tiene una imagen...

    ALTER PROCEDURE [dbo].[DSIsp_Web_BuscaImagenDeDocumentosSeleccionado]
    @cve_alumno nvarchar(7)
    , @idDocumento int
    , @imgdigitalizado image output
    AS
    BEGIN
    SET NOCOUNT ON;
    if @idDocumento = 1
    begin
    select imgdigitalizado as imgdigitalizado from ActaNacimientoImg where (cve_alumno = @cve_alumno)
    end
    if @idDocumento = 2
    begin
    select imgdigitalizado as imgdigitalizado from CurpImg where (cve_alumno = @cve_alumno)
    end
    if @idDocumento = 3
    begin
    select imgdigitalizado as imgdigitalizado from ComprobantePagoImg where (cve_alumno = @cve_alumno)
    end
    END

    Incluso renombre con as a los campos de las tablas para asegurarme de el campo imgdigitalizado regrese con el valor del campo image....

    Muchas gracias...

    viernes, 17 de julio de 2015 20:27
  • Saludos !

    Probe este codigo directamente y me es funcional, se muestra la imagen.. para este ejemplo solo envie un parametro...:

            Dim sql As String = "Select imgdigitalizado From ActaNacimientoImg  Where cve_alumno = " + txt1.Text
            Dim SqlConn As New SqlConnection("Data Source=SERVER; Initial Catalog=BASE;Persist Security Info=False; User ID=USUARIO;Password=PASWORD")
            Dim SqlCom As New SqlCommand(sql, SqlConn)
            Try
                If SqlConn.State = 0 Then
                    SqlConn.Open()
                    Dim byteImage As Byte() = DirectCast(SqlCom.ExecuteScalar(), Byte())
                    If byteImage IsNot Nothing Then
                        Response.ContentType = "image/jpeg"
                        Response.Expires = 0
                        Response.Buffer = True
                        Response.Clear()
                        Response.BinaryWrite(byteImage)
                        Response.End()
                    End If
                    SqlConn.Close()
                End If
            Catch exc As Exception
                lblexc.Text = exc.ToString
            End Try

    No se a que se deba que con el codigo anterior no me funcione... 

    viernes, 17 de julio de 2015 20:41
  • hola

    pero que pasa si @idDocumento toma un valor que no coincide con ninguno de los valores que defines en el if ?

    deberias hacer el cast solo si el valor no es nulo

    Dim result As Object = myCommand.ExecuteScalar()
    
    
    If result IsNot DbNull.Value Then
    
        Dim byteImage As Byte() = DirectCast(result , Byte())
    
       'resto codigo
    
    End If

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    viernes, 17 de julio de 2015 20:50
  • Saludos!

    En verdad muchas gracias por la ayuda, pero sigo sin resolver, incluso opte por aplicar otros codigos para conectar y leer el procedimiento almacenado...

    Aqui en VB el codigo, el cual marca error en la linea: Dim result As Object = cmd.ExecuteScalar()

            Dim cnn As SqlConnection = Nothing
            Dim cmd As SqlCommand = Nothing
            Try
                cnn = New SqlConnection(ConfigurationManager.ConnectionStrings("ConReDi").ConnectionString)
                cmd = New SqlCommand("DSIsp_Web_BuscaImagenDeDocumentosSeleccionado", cnn)
                cmd.CommandType = CommandType.StoredProcedure

                Dim cve_alumno As New Data.SqlClient.SqlParameter("@cve_alumno", Data.SqlDbType.NVarChar, 7)
                cve_alumno.Direction = Data.ParameterDirection.Input
                cve_alumno.Value = txt1.Text.Trim
                cmd.Parameters.Add(cve_alumno)

                Dim idDocumento As New Data.SqlClient.SqlParameter("@idDocumento", Data.SqlDbType.Int)
                idDocumento.Direction = Data.ParameterDirection.Input
                idDocumento.Value = 1 ' Convert.ToInt32(txt2.Text.Trim)
                cmd.Parameters.Add(idDocumento)

                Dim imgdigitalizado As New Data.SqlClient.SqlParameter("@imgdigitalizado", Data.SqlDbType.Image)
                imgdigitalizado.Direction = Data.ParameterDirection.Output
                cmd.Parameters.Add(imgdigitalizado)

                cnn.Open()
                Dim result As Object = cmd.ExecuteScalar()
                If result IsNot DBNull.Value Then
                    Dim byteImage As Byte() = DirectCast(result, Byte())
                    'Dim byteImage As Byte() = DirectCast(SqlCom.ExecuteScalar(), Byte())
                    lblexc.Text = "Entro"
                    If byteImage IsNot Nothing Then
                        Response.ContentType = "image/jpeg"
                        Response.Expires = 0
                        Response.Buffer = True
                        Response.Clear()
                        Response.BinaryWrite(byteImage)
                        Response.End()
                    Else
                        lblexc.Text = "No leyo imagen"
                    End If
                Else
                    lblexc.Text = "Hay valor nullo"
                End If
            Catch ex As Exception
                lblexc.Text = ex.ToString
            Finally
                If cnn IsNot Nothing AndAlso cnn.State <> ConnectionState.Closed Then
                    cnn.Close()
                End If
            End Try

    Lo hice desde programa en C# y si me funciona!!!, solo que no uso un SP lo hice para prueba de lectura de la imagen....

               string sql = "Select imgdigitalizado From ActaNacimientoImg  Where cve_alumno = " + txt1.Text " and " + txt2.Text
            SqlConnection SqlConn = new SqlConnection("Data Source=XEONR710; Initial Catalog=DSIReDi;Persist Security Info=False; User ID=DSIFulgore;Password=Temporal1");
            SqlCommand SqlCom = new SqlCommand(sql, SqlConn);
            SqlConn.Open();
            byte[] byteImage = (byte[])SqlCom.ExecuteScalar();
            if (byteImage!= null)
            {
                Response.ContentType = "image/jpeg";
                Response.Expires = 0;
                Response.Buffer = true;
                Response.Clear();
                Response.BinaryWrite(byteImage);
                Response.End();
            }
            SqlConn.Close();

    Aún me persiste el error: 

    System.InvalidOperationException: Byte[][2]: la propiedad Size tiene un tamaño no válido de 0. en System.Data.SqlClient.SqlParameter.Validate(Int32 index, Boolean isCommandProc) en System.Data.SqlClient.SqlCommand.SetUpRPCParameters(_SqlRPC rpc, Int32 startCount, Boolean inSchema, SqlParameterCollection parameters) en System.Data.SqlClient.SqlCommand.BuildRPC(Boolean inSchema, SqlParameterCollection parameters, _SqlRPC& rpc) en System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds) en System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) en System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) en System.Data.SqlClient.SqlCommand.ExecuteNonQuery() en MostrarImagen.form1_Load(Object sender, EventArgs e) en F:\Intranet\SecretariaEscolar\MostrarImagen.aspx.vb:línea 50

    Que error estare teniendo que no me permite, consultar correctamente la imagen...

    Muchas gracias...

    viernes, 17 de julio de 2015 22:16
  • hola

    cuando usas el procedure cual es el objetivo del parametro de salida @imgdigitalizado ? digo porque estas usando el ExecuteScalar() no el parametro de salida

    ----

    si revisas esta linea

    string sql = "Select imgdigitalizado From ActaNacimientoImg  Where cve_alumno = " + txt1.Text " and " + txt2.Text

    a que campo aplica el txt2.Text ? ademas porque no usas parametros

    string sql = "Select imgdigitalizado From ActaNacimientoImg  Where cve_alumno = alumno";
    
    SqlCommand cmd= new SqlCommand(sql, SqlConn);
    cmd.Parameters.AddWithValue("@alumno", txt1.Text);

    no se concatena en un string los valores

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Marco Bueno lunes, 20 de julio de 2015 14:51
    viernes, 17 de julio de 2015 23:28
  • Saludos Leandro...

    txt1 = clave alumno y txt2 = iddocumento, y son 2 cajas de texto que puse para corroborar los valores que se recibian...  en cuanto a la variable de salida, por lo que me comentas estoy aplicando mal, ya que yo en el procedimiento puse como variable de salida a la imagen para que sea recibida y depositada en el control....

    Creo que entonces no es necesario que lo indique verdad ?, con tan solo dejar el executescalar me recuperara el primer elemento resultado de la consulta sin necesidad de indicarlo como parametro de salida.... ? aplicare tambien lo de los parametros que me comentas, vere si se me da el resultado esperado... 

    Muchas gracias Leandro.

    sábado, 18 de julio de 2015 3:09
  • Gracias amigo Leandro!

    Ya quedo, mi problema era la mala utilización de ExecuteScalar()

    lunes, 20 de julio de 2015 14:52