Usuario
Tengo un error a la hora de pasar parámetros a un sp en sql server

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.
Todas las respuestas
-
-
-
-
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.
-
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
-
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.- Editado Willams Morales jueves, 11 de diciembre de 2014 16:54
-
-
-
-
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.
- Editado Willams Morales jueves, 11 de diciembre de 2014 18:31
- Propuesto como respuesta Miguel.Vazquez.MSDN lunes, 15 de diciembre de 2014 17:57