none
Tengo un error a la hora de pasar parámetros a un sp en sql server RRS feed

  • Pregunta

  • A la hora de llamar al método buscarProfesor, del cual adjunto el código debajo, me arroja el mensaje de la excepción: 

    "String[2]: la propiedad Size tiene un valor no válido de 0"

    Public Sub buscarProfesor()
            Dim dni As String
            Dim estaa As String
            dni = frmProfesor.txtDniProf.Text
            estaa = ""
            Try
                cn.Open()
                cmd.CommandType = CommandType.StoredProcedure
                cmd.CommandText = "buscarProfesor"
                cmd.Parameters.AddWithValue("@dniPf", dni)
                cmd.Parameters.AddWithValue("@existe", estaa)
                cmd.Parameters("@existe").Direction = ParameterDirection.Output
                cmd.Connection = cn
                cmd.ExecuteNonQuery()
                estaa = CType(cmd.Parameters("@existe").Value, String)
                MsgBox(estaa)
                cn.Close()
            Catch ex As Exception
                MsgBox("aqui: " & ex.Message)
                cn.Close()
            End Try
        End Sub

    • Cambiado Enrique M. Montejo lunes, 15 de diciembre de 2014 7:56 Pregunta relacionada con acceso a datos.
    jueves, 11 de diciembre de 2014 16:04

Todas las respuestas

  • Hola prueba poniendo así:

    estaa = CType(cmd.Parameters("@existe").Value, SqlDbType.Char)

    Salu2

    jueves, 11 de diciembre de 2014 16:12
  • en la parte de SqlDbType.Char me sale como no definido :( ... o también tendría que cambiar el tipo la variable a algún otro? 

    Help me  y gracias por la respuesta ;)

    jueves, 11 de diciembre de 2014 16:19
  • System.Data.SqlDbType.Char creo que es así.

    jueves, 11 de diciembre de 2014 16:22
  • Espero no equivocarme pero veo algo raro cuando implementas el parámetro de salida. El parámetro @existe lo usas tanto de entrada (INPUT) como de salida (OUTPUT). Imagino que el objetivo de ese procedimiento es que te devuelva un valor indicando si el profesor existe, ese valor lo retorna @existe. A ver haré algunos cambios en el código, revisalo, pruebalo y me comentas.

    Public Sub buscarProfesor()
      Dim dni As String  
      dni = frmProfesor.txtDniProf.Text
      Dim registrado As string
    
      Try
        cn.Open()
        cmd.CommandType = CommandType.StoredProcedure
        cmd.CommandText = "buscarProfesor"
        cmd.Parameters.AddWithValue("@dniPf", dni)
        cmd.Parameters.AddWithValue("@existe", "").Direction = ParameterDirection.Output
    
      cmd.Connection = cn
      cmd.ExecuteNonQuery()
    
      registrado = CType(cmd.Parameters("@existe").Value, String)
      MsgBox(registrado)
      cn.Close()
            Catch ex As Exception
                MsgBox("aqui: " & ex.Message)
                cn.Close()
            End Try
    End Sub

    Ahora, tendrás que hacer cambios en tu procedimiento almacenado que básicamente quedaría así

    CREATE PROCEDURE buscarProfesor
      @dniPf nvarchar(100) /**/,
      @existe nvarchar(100) OUTPUT /*Estoy asumiendo los tipos de datos, considera los que son correctos*/
    AS
    BEGIN
      ...
    END

    Ahora, si sólo devolverás un dato considera el uso de ExecuteScalar.


    Espero haberte ayudado con mi respuesta, si te fue útil no olvides marcarla como correcta.

    jueves, 11 de diciembre de 2014 16:23
  • probé el código e igualmente retorna el mismo error, aunque eliminé la línea que daba a confusión, pero la idea que sólo declaraba una vez y en la sgte instrucción le indico que es de salida, pero es el mismo mensaje...

    la parte del sp estaba igual: 

    ALTER PROCEDURE [dbo].[buscarProfesor]
    @dniPf char(8),
    @existe char(10) output 
    AS
    begin
    set @existe = 'no__habido'
    if exists(SELECT * from profesor where dni = @dniPf)
    begin 
    set @existe = 'si__habido'
    end;
    end;

    lo de ExecuteScalar, veré la funcionalidad, es que estoy empezando con vb  ;)

    Gracias por tu rspta  

    jueves, 11 de diciembre de 2014 16:37
  • Lo que sucede con AddWithValue que infiere el tipo de datos de la variable que recibe.

    Sólo para salir de dudas coloca un texto en el valor que envías al parámetro de salida

    cmd.Parameters.AddWithValue("@existe", "no__habido").Direction = ParameterDirection.Output

    De ser eso creo que deberíamos cambiar el tema de recibir las variables con Add, sólo para el caso del parámetro de salida.

    SqlParameter outParam = cmd.Parameters.Add("@existe", SqlDbType.Char);
    outParam.Direction = ParameterDirection.Output;

    Espero haberte ayudado con mi respuesta, si te fue útil no olvides marcarla como correcta.


    jueves, 11 de diciembre de 2014 16:53
  • nada :c
    jueves, 11 de diciembre de 2014 17:06
  • Jorge, podrías indicar exactamente en que línea de tú código te genera la excepción?
    jueves, 11 de diciembre de 2014 17:18
  • el sms que aparece es este: al parecer lo toma del segundo parámetro del sp

    String[2]: la propiedad Size tiene un valor no válido de 0

    jueves, 11 de diciembre de 2014 17:33
  • Jorge pon un punto de interrupción en la línea  

    cmd.CommandType = CommandType.StoredProcedure

     (Para poner un punto de interrupción sitúate en la línea y presiona F9)

    Al momento de ejecutar tu código la ejecución se detendrá en ese punto, luego presiona F11 para pasar entre instrucción e instrucción e indícanos exactamente en que línea está deteniéndose y generando el error.


    jueves, 11 de diciembre de 2014 18:31