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

  • Pregunta

  • Por favor su ayuda, estoy trabajando en visual basic 2010 y la base de datos esta MYSQLSERVER, y al llegar a esta linea del  programa sale error  If dt.Rows.Count <> 0 Then 

    Imports MySql.Data.MySqlClient
    Imports System.Data
    Imports MySql.Data.Types

    Public Class Fcentro
        Inherits Conexion
        Dim cmd As New MySqlCommand
        Public dr As MySqlDataReader


        Public Function mostrar() As DataTable
            Try
                conectado()
                cmd = New MySqlCommand("mostrar_Centro")
                cmd.CommandType = CommandType.StoredProcedure

                cmd.Connection = cnn
                If cmd.ExecuteNonQuery Then
                    Dim dt As New DataTable
                    Dim da As New MySqlDataAdapter(cmd)
                    da.Fill(dt)
                    Return dt
                Else
                    Return Nothing
                End If
            Catch ex As Exception
                MsgBox(ex.Message)
                Return Nothing
            Finally
                desconectado()
            End Try
        End Function

    -----------------------------------------------------------------------------------------------

    Private Sub mostrar()

            Try
                Dim func As New Fcentro
                dt = func.mostrar
                Datalistado.Columns.Item("eliminar").Visible = False

    If dt.Rows.Count <> 0 Then
                    Datalistado.DataSource = dt
                    Txtbuscar.Enabled = True
                    Datalistado.ColumnHeadersVisible = True
                    Inexistente.Visible = False

                Else
                    Datalistado.DataSource = Nothing
                    Txtbuscar.Enabled = False
                    Datalistado.ColumnHeadersVisible = False
                    Inexistente.Visible = True
                End If

            Catch ex As Exception
                MsgBox(ex.Message)

            End Try
            btnnuevo.Visible = True
            Btneditar.Visible = False

            buscar()

        End Sub

        Private Sub buscar()
            Try
                Dim ds As New DataSet
                ds.Tables.Add(dt.Copy)
                Dim dv As New DataView(ds.Tables(0))

                dv.RowFilter = Cbocampo.Text & " like'" & Txtbuscar.Text & "%'"

                If dv.Count <> 0 Then
                    Inexistente.Visible = False
                    Datalistado.DataSource = dv
                    ocultar_columnas()

                Else
                    Inexistente.Visible = True
                    Datalistado.DataSource = Nothing

                End If

            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub

               
    sábado, 13 de abril de 2019 20:23

Todas las respuestas

  • Hola donde declaras al objeto dt, podrías validar que no este en Nothing antes de ingresar a esa línea.

      Try
                Dim func As New Fcentro
                dt = func.mostrar
    		    Datalistado.Columns.Item("eliminar").Visible = False
    	 If(Not dt Is Nothing) Then 
                If dt.Rows.Count <> 0 Then
                    Datalistado.DataSource = dt
                    Txtbuscar.Enabled = True
                    Datalistado.ColumnHeadersVisible = True
                    Inexistente.Visible = False
                Else
                    Datalistado.DataSource = Nothing
                    Txtbuscar.Enabled = False
                    Datalistado.ColumnHeadersVisible = False
                    Inexistente.Visible = True
                End If
             End If
      Catch ex As Exception
                MsgBox(ex.Message)
      End Try


    Votar y marcar respuestas es agradecer.
    Saludos.
    Lima-Perú


    • Editado Augusto1982 sábado, 13 de abril de 2019 20:44
    sábado, 13 de abril de 2019 20:43
  • Hay un error aquí:

     If cmd.ExecuteNonQuery Then

    El método ExecuteNonQuery devuelve el número de filas afectadas por la consulta. Para una consulta de selección, ese número siempre es cero (la consulta no modifica ninguna fila). El cero es interpretado como "False" por el If. Por tanto, no se ejecuta el bloque de código que asigna un valor al dt. Entonces se sale del método sin haber asignado nada al resultado, que por tanto vale Noting. Cuando el código llamante llama a dt.Rows y dt vale Noting, se produce el error de "referencia no establecida...".


    EDITADO: Por cierto, por si no es evidente, la solución más sencilla es suprimir el ExecuteNonQuery (y su If y su bloque Else) que en ese código no sirve ara nada. Simplemente llama al Fill como haces más abajo, y el Fill ya te dejará el DataTable vacío si no hay ningún registro devuelto por la consulta.
    domingo, 14 de abril de 2019 7:19