none
Error al llamar SP desde VS2017 / ASP.net, solo muestra informaión del primer campo. RRS feed

  • Pregunta

  • Saludos amigos!

    Se me presenta el siguiente inconveniente, en los form web se utilizan procedimientos almacenados para traer o insertar información en BD de SQL.

    El problema consiste que al llamar un SP de consulta, solo el primer dato de la consulta viene con información mientras que el resto viene como Nothing o {}, estamos sobre VS 2017 / VB / SQL Server 2008 R2 / ASP Net 4.5 , este es mi codigo para llamar al SP y vaciar la información a controles, no marca error pero solo el primer campo tiene información de la consulta el resto viene vacio:

        Sub MostrarInformacion()

            Dim myCommand As Data.SqlClient.SqlCommand
            Dim myDataReader As Data.SqlClient.SqlDataReader
            Dim Conn As New Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("SacpTecConn").ConnectionString)
            myCommand = New Data.SqlClient.SqlCommand("sp_MostrarInformacion_Prestatario", Conn)
            myCommand.CommandType = Data.CommandType.StoredProcedure

            myCommand.Parameters.Add("@cve_servicio", Data.SqlDbType.NVarChar, 5)
            myCommand.Parameters("@cve_servicio").Value = TxtPrestatario.Text.Trim

            myCommand.Parameters.Add("@cnombre", Data.SqlDbType.NVarChar, 30)
            myCommand.Parameters("@cnombre").Direction = ParameterDirection.Output

            myCommand.Parameters.Add("@capellido_pat", Data.SqlDbType.NVarChar, 30)
            myCommand.Parameters("@capellido_pat").Direction = ParameterDirection.Output

            myCommand.Parameters.Add("@capellido_mat", Data.SqlDbType.NVarChar, 30)
            myCommand.Parameters("@capellido_mat").Direction = ParameterDirection.Output

            myCommand.Parameters.Add("@csexo", Data.SqlDbType.NVarChar, 1)
            myCommand.Parameters("@csexo").Direction = ParameterDirection.Output

            myCommand.Parameters.Add("@ccontrasena", Data.SqlDbType.NVarChar, 10)
            myCommand.Parameters("@ccontrasena").Direction = ParameterDirection.Output

            myCommand.Parameters.Add("@dfecha_ing", Data.SqlDbType.Date)
            myCommand.Parameters("@dfecha_ing").Direction = ParameterDirection.Output

            myCommand.Parameters.Add("@dfecha_sal", Data.SqlDbType.Date)
            myCommand.Parameters("@dfecha_sal").Direction = ParameterDirection.Output

            myCommand.Parameters.Add("@ihoras", Data.SqlDbType.NVarChar, 3)
            myCommand.Parameters("@ihoras").Direction = ParameterDirection.Output

            myCommand.Parameters.Add("@cve_estudiante", Data.SqlDbType.NVarChar, 10)
            myCommand.Parameters("@cve_estudiante").Direction = ParameterDirection.Output

            Try
                Try
                    Conn.Open()
                    myDataReader = myCommand.ExecuteReader()
                    If myDataReader.Read() Then
                        TxtPrestatario.Text = myDataReader("@cve_servicio")
                        TxtNombre.Text = myDataReader("@cnombre").Value.ToString
                        TxtApellidoP.Text = myDataReader("@capellido_pat").Value.ToString
                        TxtApellidoM.Text = myDataReader("@capellido_mat").Value.ToString
                        OpSexos.Text = myDataReader("@csexo").Value.ToString
                        TxtPassword.Text = myDataReader("@ccontrasena").Value.ToString
                        TxtFecha1.Text = myDataReader("@dfecha_ing").Value.ToString
                        TxtFecha2.Text = myDataReader("@dfecha_sal").Value.ToString
                        TxtTotalHoras.Text = myDataReader("@ihoras").Value.ToString
                        TxtCveEstudiante.Text = myDataReader("@cve_estudiante").Value.ToString
                    End If
                    myDataReader.Close()
                Catch SqlEx As SqlException
                    TxtPrestatario.Text = SqlEx.Errors.ToString
                End Try
            Catch exc As Exception
                Label1.Visible = True
                Label1.Text = exc.ToString      ' Enviamos el error a la etiqueta
            Finally
                If Conn.State = Data.ConnectionState.Open Then
                    Conn.Close()
                End If
            End Try

    End Sub

    Aquí el procedimiento almacenado el cual es muy simple:

    ALTER PROCEDURE [dbo].[sp_MostrarInformacion_Prestatario] 
    @cve_servicio nvarchar(5),
    @cnombre nvarchar(30) output,
    @capellido_pat nvarchar(30) output,
    @capellido_mat nvarchar(30) output,
    @csexo nvarchar(1) output,
    @ccontrasena nvarchar(10) output,
    @dfecha_ing as date output,
    @dfecha_sal as date output,
    @ihoras as nvarchar(3) output,
    @cve_estudiante as nvarchar(10) output

    -- @cve_depto nvarchar(5) output,
    -- @cve_tiposer as nvarchar(5) output,
    -- @cve_procedencia as nvarchar(5) output,


    AS
    BEGIN
    SET NOCOUNT ON;
    select Prestadores.cnombre, Prestadores.capellido_pat, Prestadores.capellido_mat, Prestadores.csexo, Prestadores.ccontrasena,
    RegistroServicio.dfecha_ing, RegistroServicio.dfecha_sal, RegistroServicio.ihoras, RegistroServicio.cve_estudiante
    from Prestadores, RegistroServicio 
    where Prestadores.cve_servicio = @cve_servicio and RegistroServicio.cve_servicio = @cve_servicio
    END

    Muchas gracias por su ayuda.

    jueves, 7 de diciembre de 2017 22:40

Respuestas

  • De acuerdo,

    Por qué pasas como parámetros output? cuál es la necesidad? listar en los textbox? solo basta con pasar el parámetro cve_servicio, quién es el filtro para listar los otros campos de tu procedimiento almacenado, observa lo que está en negrita y los comentarios en el código:

    Dim myCommand As Data.SqlClient.SqlCommand Dim myDataReader As Data.SqlClient.SqlDataReader Dim Conn As New Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("SacpTecConn").ConnectionString) myCommand = New Data.SqlClient.SqlCommand("sp_MostrarInformacion_Prestatario", Conn) myCommand.CommandType = Data.CommandType.StoredProcedure myCommand.Parameters.Add("@cve_servicio", Data.SqlDbType.NVarChar, 5).Value = TxtPrestatario.Text.Trim Try Try Conn.Open() myDataReader = myCommand.ExecuteReader() If myDataReader.Read() Then TxtPrestatario.Text = myDataReader("@cve_servicio") TxtNombre.Text = myDataReader("cnombre").Value.ToString TxtApellidoP.Text = myDataReader("capellido_pat").Value.ToString 'aquí tienes que hacer sucesivamente por cada nombre de campo End If myDataReader.Close() Catch SqlEx As SqlException TxtPrestatario.Text = SqlEx.Errors.ToString End Try Catch exc As Exception Label1.Visible = True Label1.Text = exc.ToString ' Enviamos el error a la etiqueta Finally If Conn.State = Data.ConnectionState.Open Then Conn.Close() End If End Try

    Asimismo, solo necesitarías un parámetro en tu procedimiento almacenado y solo coloca un alias para que le pases al reader como lo hicimos en la codificación de VB,

    ALTER PROCEDURE [dbo].[sp_MostrarInformacion_Prestatario] 
    @cve_servicio nvarchar(5),
    AS
    BEGIN
    SET NOCOUNT ON;
    select Prestadores.cnombre as 'cnombre', 
    Prestadores.capellido_pat as 'capellido_pat', 
    Prestadores.capellido_mat ,--coloca alias a todos y lo pones en el reader
    Prestadores.csexo, Prestadores.ccontrasena, RegistroServicio.dfecha_ing, RegistroServicio.dfecha_sal, RegistroServicio.ihoras, RegistroServicio.cve_estudiante from Prestadores, RegistroServicio where Prestadores.cve_servicio = @cve_servicio and RegistroServicio.cve_servicio = @cve_servicio END
    Saludos


    Brayan De la Cruz
    Lima - Perú

    • Propuesto como respuesta Pablo RubioModerator viernes, 8 de diciembre de 2017 16:05
    • Marcado como respuesta Marco Bueno viernes, 8 de diciembre de 2017 17:31
    viernes, 8 de diciembre de 2017 0:49

Todas las respuestas

  • Hola

    Lo que sucede es que solo estás haciendo un solo recorrido al colocar If, deberías hacerlo con while para que lea todo el reader que estás llenando desde tu BD:

    While myDataReader.Read() Then
                        TxtPrestatario.Text = myDataReader("@cve_servicio")
                        TxtNombre.Text = myDataReader("@cnombre").Value.ToString
                        TxtApellidoP.Text = myDataReader("@capellido_pat").Value.ToString
                        TxtApellidoM.Text = myDataReader("@capellido_mat").Value.ToString
                        OpSexos.Text = myDataReader("@csexo").Value.ToString
                        TxtPassword.Text = myDataReader("@ccontrasena").Value.ToString
                        TxtFecha1.Text = myDataReader("@dfecha_ing").Value.ToString
                        TxtFecha2.Text = myDataReader("@dfecha_sal").Value.ToString
                        TxtTotalHoras.Text = myDataReader("@ihoras").Value.ToString
                        TxtCveEstudiante.Text = myDataReader("@cve_estudiante").Value.ToString
    End While
    Saludos


    Brayan De la Cruz
    Lima - Perú

    jueves, 7 de diciembre de 2017 22:52
  • Saludos Gracias por responder Brayan, pero por comentarte el primer registro me refiero a que solo trae el valor del primer campo por ej. 

    TxtPrestatario.Text = myDataReader("@cve_servicio")

    Mientras que la info de los demas campos estan vacios... no se a que se deba. el procedimiento almacenado me funciona bien hago una prueba y me muestra el resultado del select con toda la información de cada campo.

    Muchas gracias.


    • Editado Marco Bueno jueves, 7 de diciembre de 2017 23:03
    jueves, 7 de diciembre de 2017 23:02
  • De acuerdo,

    Por qué pasas como parámetros output? cuál es la necesidad? listar en los textbox? solo basta con pasar el parámetro cve_servicio, quién es el filtro para listar los otros campos de tu procedimiento almacenado, observa lo que está en negrita y los comentarios en el código:

    Dim myCommand As Data.SqlClient.SqlCommand Dim myDataReader As Data.SqlClient.SqlDataReader Dim Conn As New Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("SacpTecConn").ConnectionString) myCommand = New Data.SqlClient.SqlCommand("sp_MostrarInformacion_Prestatario", Conn) myCommand.CommandType = Data.CommandType.StoredProcedure myCommand.Parameters.Add("@cve_servicio", Data.SqlDbType.NVarChar, 5).Value = TxtPrestatario.Text.Trim Try Try Conn.Open() myDataReader = myCommand.ExecuteReader() If myDataReader.Read() Then TxtPrestatario.Text = myDataReader("@cve_servicio") TxtNombre.Text = myDataReader("cnombre").Value.ToString TxtApellidoP.Text = myDataReader("capellido_pat").Value.ToString 'aquí tienes que hacer sucesivamente por cada nombre de campo End If myDataReader.Close() Catch SqlEx As SqlException TxtPrestatario.Text = SqlEx.Errors.ToString End Try Catch exc As Exception Label1.Visible = True Label1.Text = exc.ToString ' Enviamos el error a la etiqueta Finally If Conn.State = Data.ConnectionState.Open Then Conn.Close() End If End Try

    Asimismo, solo necesitarías un parámetro en tu procedimiento almacenado y solo coloca un alias para que le pases al reader como lo hicimos en la codificación de VB,

    ALTER PROCEDURE [dbo].[sp_MostrarInformacion_Prestatario] 
    @cve_servicio nvarchar(5),
    AS
    BEGIN
    SET NOCOUNT ON;
    select Prestadores.cnombre as 'cnombre', 
    Prestadores.capellido_pat as 'capellido_pat', 
    Prestadores.capellido_mat ,--coloca alias a todos y lo pones en el reader
    Prestadores.csexo, Prestadores.ccontrasena, RegistroServicio.dfecha_ing, RegistroServicio.dfecha_sal, RegistroServicio.ihoras, RegistroServicio.cve_estudiante from Prestadores, RegistroServicio where Prestadores.cve_servicio = @cve_servicio and RegistroServicio.cve_servicio = @cve_servicio END
    Saludos


    Brayan De la Cruz
    Lima - Perú

    • Propuesto como respuesta Pablo RubioModerator viernes, 8 de diciembre de 2017 16:05
    • Marcado como respuesta Marco Bueno viernes, 8 de diciembre de 2017 17:31
    viernes, 8 de diciembre de 2017 0:49
  • Gracias amigo Brayan, mejor opción de codigo como lo comentastes y funcional 100%. Te agradezco compartir tu conocimiento.

    Hasta pronto.

    viernes, 8 de diciembre de 2017 17:32