none
Referencia a objeto no establecida como instancia de un objeto. RRS feed

  • Pregunta


  • Tengo este codigo cuando solo tenia el "Public Sub llenar_comboidpro()" si funcionaba pero cuando agregue el "Public Sub llenar_comboidptetermi() " me marcaba ese error, tengo este codigo y el error aparece en la linea: 
    ComboBox2.DataSource = ds_termi.Tables(0)
    Public Sub llenar_comboidpro()
    
            Dim ds_partes As DataSet
    
            ds_partes = conexion_Baan.selectTable("Select id, proceso from proceso")
    
            ComboBox1.DataSource = ds_partes.Tables(0)
            Me.ComboBox1.ValueMember = "id"
            Me.ComboBox1.DisplayMember = "proceso"
    
    
    
    
        End Sub
    
        Public Sub llenar_comboidptetermi()
    
            Dim ds_termi As DataSet
    
            ds_termi = conexion_Baan.selectTable("Select id, numero_parte from proceso")
    
            ComboBox2.DataSource = ds_termi.Tables(0)
            Me.ComboBox2.ValueMember = "id"
            Me.ComboBox2.DisplayMember = "numero_parte"
    
    
        End Sub


    Cristian Murillo

    miércoles, 31 de enero de 2018 17:46

Respuestas

  • "Cristian Murillo" escribió:

    > Mi error esto es lo que trae el selectTable
    >
    >  Public Function selectTable(ByRef query As String) As DataSet
    >        Try
    >            dbcomand = New SqlCommand(query, conexion)
    >            dbcomand.CommandTimeout = 0
    >            'dbcomand.CommandType = CommandType.StoredProcedure
    >            dbcomand.CommandType = CommandType.Text
    >            conexion.Open()
    >            Dim dat As New SqlDataAdapter(dbcomand)
    >            Dim ds As New DataSet
    >            dat.Fill(ds)
    >            conexion.Close()
    >            Return ds
    >        Catch ex As Exception
    >            'MsgBox("Falla de seleccion")
    >            Return Nothing
    >        End Try
    >    End Function

    Fíjate que estás capturando cualquier error que se produzca en el bloque Catch, pero estás devolviendo un valor Nothing en lugar de devolver la excepción producida, por tanto, si se ha producido un error, que es lo más seguro que te está sucediendo, la función devolverá el valor Nothing, y por tanto, el objeto DataSet tendrá el valor Nothing. Ello quiere decir que si utilizas cualquier propiedad o método del objeto DataSet, obtendrás la excepción Referencia a objeto no establecida como instancia de un objeto.

    Deja la función selectTable como indico a continuación:

    Public Function SelectTable(query As String) As DataTable dbcomand = New SqlCommand(query, conexion) Dim dat As New SqlDataAdapter(dbcomand) Dim ds As New DataSet() dat.Fill(ds)

    ' Devolver el primer objeto DataTable
    ' existente en el objeto DataSet
    Return ds.Tables(0)

    End Function

    Observa que en lugar de devolver un objeto DataSet, la función devuelve ahora un objeto DataTable.

    Y el código llamador lo encierras entre su correspondiente bloque Try ... Catch ... End Try:

        Public Sub Llenar_Comboidptetermi()
    
            Try
    ' Referenciar el objeto DataTable ComboBox2.DataSource = conexion_Baan.SelectTable("Select id, numero_parte from proceso") Me.ComboBox2.ValueMember = "id" Me.ComboBox2.DisplayMember = "numero_parte" Catch ex As Exception ' Se ha procudido un error MessageBox.Show(ex.Message) End Try End Sub



    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    • Editado Enrique M. MontejoModerator miércoles, 31 de enero de 2018 19:26 Actualizar el código de la función SelectTable.
    • Marcado como respuesta JuanAurich23 miércoles, 31 de enero de 2018 19:27
    miércoles, 31 de enero de 2018 19:11
    Moderador

Todas las respuestas

  • "Cristian Murillo" escribió:

    >  ... el error aparece en la linea:  ComboBox2.DataSource = ds_termi.Tables(0)
    >
    >
    >    Public Sub llenar_comboidptetermi()
    >
    >        Dim ds_termi As DataSet
    >
    >        ds_termi = conexion_Baan.selectTable("Select id, numero_parte from proceso")
    >
    >        ComboBox2.DataSource = ds_termi.Tables(0)

    Hola, Cristian:

    Lo único que te puedo decir es que verifiques que la función llamada selectTable existente en el clase o módulo conexion_Baan devuelve un objeto DataSet cuyo valor no sea Nothing:

        ' Referenciar el objeto DataSet
    Dim ds_termi As DataSet = conexion_Baan.selectTable("Select id, numero_parte from proceso") If (Not ds_termi Is Nothing) Then ComboBox2.DataSource = ds_termi.Tables(0) Else MessageBox.Show("Objeto DataSet no válido: su valor es Nothing") End If

    Si obtienes el mensaje descrito, es porque el valor de la variable ds_termi es Nothing. ¿Por qué es Nothing? Pues tendrás que buscar la respuesta en el código que se ejecuta en la función selectTable. ;-)

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    miércoles, 31 de enero de 2018 17:54
    Moderador
  • "Cristian Murillo" escribió:

    > Ya revise pero la verdad no encuentro nada raro, esto trae el modulo
    > conexion_Baan
    >
    > Dim conexion_Baan As New Clss_ConexionSql("server02", "Datos_Maestros_Estampado", "sa", "a......a")

    Y ¿qué código "trae" el procedimiento llamado selectTable existente en el módulo conexion_Baan, que es la función a la que me refería en mi respuesta anterior? El código de la función selectTable es el que debes de revisar.

    ¿Quieres un consejo gratuito? No publiques contraseñas en un foro público, y menos la del usuario 'sa' de SQL Server. Y te aconsejaría que tampoco escribas en tu código la contraseña como texto plano porque cualquier persona la podrá obtener con tan solo abrir el archivo ejecutable con el Bloc de Notas de Windows o programa similar.

    Y en lugar de utilizar la propia autenticación de SQL Server (usuario y contraseña), procura utilizar la autenticación de Windows en la cadena de conexión, que es lo recomendable, siempre y cuando puedas utilizar dicha autenticación, claro está.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.





    miércoles, 31 de enero de 2018 18:22
    Moderador
  • Lo unico Donde esta el selectTable es lo que mande en los primeros codigos

    Cristian Murillo

    miércoles, 31 de enero de 2018 18:27
  • "Cristian Murillo" escribió:

    > Lo unico Donde esta el selectTable es lo que mande en los primeros codigos

    Discúlpame, pero no me entero. ¿A este código te refieres?

    >  Public Sub llenar_comboidptetermi()
    >
    >        Dim ds_termi As DataSet
    >
    >        ds_termi = conexion_Baan.selectTable("Select id, numero_parte from proceso")
    >
    >        ComboBox2.DataSource = ds_termi.Tables(0)
    >        Me.ComboBox2.ValueMember = "id"
    >        Me.ComboBox2.DisplayMember = "numero_parte"
    >
    >    End Sub

    ¿Estás diciendo que la palabra 'selectTable' solo aparece en el procedimiento llenar_comboidptetermi? Me extraña porque si no existe el procedimiento 'selectTable' en el módulo 'conexion_Baan', ni tan siquiera podrías compilar tu aplicación.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    miércoles, 31 de enero de 2018 18:36
    Moderador
  • y gracias por el consejo, soy nuevo en esto de los foros

    Cristian Murillo

    miércoles, 31 de enero de 2018 18:53
  • Mi error esto es lo que trae el selectTable
    Public Function selectTable(ByRef query As String) As DataSet
            Try
                dbcomand = New SqlCommand(query, conexion)
                dbcomand.CommandTimeout = 0
                'dbcomand.CommandType = CommandType.StoredProcedure
                dbcomand.CommandType = CommandType.Text
                conexion.Open()
                Dim dat As New SqlDataAdapter(dbcomand)
                Dim ds As New DataSet
                dat.Fill(ds)
                conexion.Close()
                Return ds
            Catch ex As Exception
                'MsgBox("Falla de seleccion")
                Return Nothing
            End Try
        End Function


    Cristian Murillo

    miércoles, 31 de enero de 2018 18:54
  • "Cristian Murillo" escribió:

    > Mi error esto es lo que trae el selectTable
    >
    >  Public Function selectTable(ByRef query As String) As DataSet
    >        Try
    >            dbcomand = New SqlCommand(query, conexion)
    >            dbcomand.CommandTimeout = 0
    >            'dbcomand.CommandType = CommandType.StoredProcedure
    >            dbcomand.CommandType = CommandType.Text
    >            conexion.Open()
    >            Dim dat As New SqlDataAdapter(dbcomand)
    >            Dim ds As New DataSet
    >            dat.Fill(ds)
    >            conexion.Close()
    >            Return ds
    >        Catch ex As Exception
    >            'MsgBox("Falla de seleccion")
    >            Return Nothing
    >        End Try
    >    End Function

    Fíjate que estás capturando cualquier error que se produzca en el bloque Catch, pero estás devolviendo un valor Nothing en lugar de devolver la excepción producida, por tanto, si se ha producido un error, que es lo más seguro que te está sucediendo, la función devolverá el valor Nothing, y por tanto, el objeto DataSet tendrá el valor Nothing. Ello quiere decir que si utilizas cualquier propiedad o método del objeto DataSet, obtendrás la excepción Referencia a objeto no establecida como instancia de un objeto.

    Deja la función selectTable como indico a continuación:

    Public Function SelectTable(query As String) As DataTable dbcomand = New SqlCommand(query, conexion) Dim dat As New SqlDataAdapter(dbcomand) Dim ds As New DataSet() dat.Fill(ds)

    ' Devolver el primer objeto DataTable
    ' existente en el objeto DataSet
    Return ds.Tables(0)

    End Function

    Observa que en lugar de devolver un objeto DataSet, la función devuelve ahora un objeto DataTable.

    Y el código llamador lo encierras entre su correspondiente bloque Try ... Catch ... End Try:

        Public Sub Llenar_Comboidptetermi()
    
            Try
    ' Referenciar el objeto DataTable ComboBox2.DataSource = conexion_Baan.SelectTable("Select id, numero_parte from proceso") Me.ComboBox2.ValueMember = "id" Me.ComboBox2.DisplayMember = "numero_parte" Catch ex As Exception ' Se ha procudido un error MessageBox.Show(ex.Message) End Try End Sub



    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    • Editado Enrique M. MontejoModerator miércoles, 31 de enero de 2018 19:26 Actualizar el código de la función SelectTable.
    • Marcado como respuesta JuanAurich23 miércoles, 31 de enero de 2018 19:27
    miércoles, 31 de enero de 2018 19:11
    Moderador
  • Ahora me dice que la columna numero_parte no es valida

    Cristian Murillo

    miércoles, 31 de enero de 2018 19:21
  • Ya quedo resuelto , Muchas gracias amigo me ayudo mucho

    Saludos....


    Cristian Murillo

    miércoles, 31 de enero de 2018 19:28
  • "Cristian Murillo" escribió:

    > Ahora me dice que la columna numero_parte no es valida

    Ese es el error que obtenías pero que no eras consciente de ello, porque estabas devolviendo el valor Nothing en el bloque Catch en lugar de atrapar el error en el código llamador.

    > ComboBox2.DataSource = conexion_Baan.SelectTable("Select id, numero_parte from proceso")

    Pues lo único que te puedo decir es que revises si en la tabla Proceso existe una columna llamada numero_parte, porque si no existe, está claro que no la puedes seleccionar. ;-)

    Por cierto, revisa de nuevo mi anterior respuesta porque he modificado el código fuente existente en la misma.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    miércoles, 31 de enero de 2018 19:31
    Moderador