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

  • Pregunta

  • Cordial saludo

    La idea es que al darle un "Id" tome los datos de una base de datos (sql server) que pertenezcan a ese Id y los cargue en un datagridview, hasta ahi todo bien, lo que no logro es que al no haber datos en la base de datos me general el error "referencia a objeto no establecida como instancia de un objeto"

    cree una clase

    Public Class CPrincipal
        Private _adaptador As New SqlDataAdapter
        Public dt As DataTable

    Sub consultaAsistencia(ByVal Documento As String, ByVal dgv As DataGridView)
            Try
                conexion_Global()
                _adaptador = New SqlDataAdapter("select Id_Documento, Fecha, Nombre, Sede from Asistencia Where Documento like '" & Documento + "%" & "'Order By Fecha Desc", _Conexion)
                dt = New DataTable
                _adaptador.Fill(dt)
                dgv.DataSource = dt
            Catch ex As Exception
                MessageBox.Show("Error al cargar Consulta en la Grilla" + ex.ToString)
            End Try
        End Sub

    Y en el formulario incluyo la instancia:

    Dim obj As New CPrincipal

    obj.consultaAsistencia(txtIdDocumento.Text, DataAsistencia) 'donde DataAsistencia es el datagridView

    Como puedo Solucionar este problema; al no encontrar datos no genere el error

    Muchas Gracias

    domingo, 4 de octubre de 2015 5:09

Respuestas

  • Tal como está escrito, NO debería generar ningún error de "referencia no establecida" por el mero hecho de que la base de datos no tenga datos. Eso simplemente generará un dt con cero Rows, que es perfectamente legítimo vincular con el DataSource de un datagrdview sin que ocasione ningún error (simplemente el dgv apaecerá vacío).

    Así que el problema tiene que estar en algún otro sitio. Sigue la ejecución con el debugger hasta que encuentres la línea exacta en la que da el error (posiblemente te resulte más fácil si quitas provisionalmente el try...catch), y una vez que esté parado en esa línea examina las variables a ver cuál es la que vale Nothing. Escríbenos aquí en un mensaje cuál es la línea y la variable errónea, y trataremos de inferir cómo se ha llegado a producir el error.

    Por cierto, hay un error en tu sentencia SQL (falta cerrar una comilla), y además es vulnerable ante ataques de inyección de SQL. Pero ninguna de esas dos cosas puede causar el error de "referencia no establecida...".

    domingo, 4 de octubre de 2015 8:18
  • "Walo77" escribió:

    > La idea es que al darle un "Id" tome los datos de una base de datos (sql server)
    > que pertenezcan a ese Id y los cargue en un datagridview, hasta ahi todo bien,
    > lo que no logro es que al no haber datos en la base de datos me general el error
    > "referencia a objeto no establecida como instancia de un objeto"

    Hola:

    El código fuente que has publicado no puede generar la excepción que comentas, por lo que entiendo que ésta se producirá en alguna otra parte de tu proyecto que no has publicado.

    ¡Eso sí! El código fuente que has mostrado es mejorable, ya que tu procedimiento 'consultaAsistencia' debería devolver un objeto DataTable, y no pasarle el control DataGridView que deseas enlazar con el objeto DataTable obtenido.

    Si deseas hacer una prueba, modifica tu clase CPrincipal por esta otra:

    Imports System.Data.SqlClient
    
    Friend Class CPrincipal
    
        ' Modificar el valor de la cadena de conexión con la base
        ' de datos de SQL Server.
        Private Shared CadenaConexion As String =
            "Data Source=(local);Initial Catalog=Prueba;Integrated Security=SSPI"
    
        Friend Shared Function ConsultaAsistenciaPorDocumento(ByVal documento As String) As DataTable
    
            Dim dt As DataTable = Nothing
    
            Using cnn As New SqlConnection(CadenaConexion)
    
                Dim cmd As SqlCommand = cnn.CreateCommand()
    
                cmd.CommandText =
                    "SELECT Id_Documento, Fecha, Nombre, Sede FROM Asistencia " &
                    "WHERE Documento Like @documento + '%' ORDER BY Fecha Desc"
    
    
                ' Añadimos el único parámetro de entrada existente.
                cmd.Parameters.AddWithValue("@documento", documento)
    
                Dim da As New SqlDataAdapter(cmd)
                dt = New DataTable()
                da.Fill(dt)
    
            End Using
    
            ' Devolver el objeto DataTable.
            Return dt
    
        End Function
    
    End Class

    Cuando desees mostrar los datos en el control DataGridView, tan solo tienes que llamar al procedimiento ConsultaAsistenciaPorDocumento como indico a continuación:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                DataAsistencia.DataSource = CPrincipal.ConsultaAsistenciaPorDocumento(txtIdDocumento.text)
    
            Catch ex As Exception
                MessageBox.Show("Error al cargar Consulta en la Grilla: " & ex.Message)
    
            End Try
    
        End Sub

    Y lo dicho, que el mensaje de error Referencia a objeto no establecida como instancia de un objeto se tiene que producir en otra parte de tu proyecto cuyo código no has publicado.

    Un saludo


    Enrique Martínez Montejo
            [MS MVP - VB]

    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.


    domingo, 4 de octubre de 2015 8:24
    Moderador
  • si quieres que durante la depuración de tu aplicación la ejecución se detenga donde se produzca una excepción debes ir a la opción de menú. Depurar/Excepciones/marcar Common Language Runtime. Así cuando se lance la excepción que comentas la ejecución se parará en la linea que la provoca


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    domingo, 4 de octubre de 2015 11:06

Todas las respuestas

  • Tal como está escrito, NO debería generar ningún error de "referencia no establecida" por el mero hecho de que la base de datos no tenga datos. Eso simplemente generará un dt con cero Rows, que es perfectamente legítimo vincular con el DataSource de un datagrdview sin que ocasione ningún error (simplemente el dgv apaecerá vacío).

    Así que el problema tiene que estar en algún otro sitio. Sigue la ejecución con el debugger hasta que encuentres la línea exacta en la que da el error (posiblemente te resulte más fácil si quitas provisionalmente el try...catch), y una vez que esté parado en esa línea examina las variables a ver cuál es la que vale Nothing. Escríbenos aquí en un mensaje cuál es la línea y la variable errónea, y trataremos de inferir cómo se ha llegado a producir el error.

    Por cierto, hay un error en tu sentencia SQL (falta cerrar una comilla), y además es vulnerable ante ataques de inyección de SQL. Pero ninguna de esas dos cosas puede causar el error de "referencia no establecida...".

    domingo, 4 de octubre de 2015 8:18
  • "Walo77" escribió:

    > La idea es que al darle un "Id" tome los datos de una base de datos (sql server)
    > que pertenezcan a ese Id y los cargue en un datagridview, hasta ahi todo bien,
    > lo que no logro es que al no haber datos en la base de datos me general el error
    > "referencia a objeto no establecida como instancia de un objeto"

    Hola:

    El código fuente que has publicado no puede generar la excepción que comentas, por lo que entiendo que ésta se producirá en alguna otra parte de tu proyecto que no has publicado.

    ¡Eso sí! El código fuente que has mostrado es mejorable, ya que tu procedimiento 'consultaAsistencia' debería devolver un objeto DataTable, y no pasarle el control DataGridView que deseas enlazar con el objeto DataTable obtenido.

    Si deseas hacer una prueba, modifica tu clase CPrincipal por esta otra:

    Imports System.Data.SqlClient
    
    Friend Class CPrincipal
    
        ' Modificar el valor de la cadena de conexión con la base
        ' de datos de SQL Server.
        Private Shared CadenaConexion As String =
            "Data Source=(local);Initial Catalog=Prueba;Integrated Security=SSPI"
    
        Friend Shared Function ConsultaAsistenciaPorDocumento(ByVal documento As String) As DataTable
    
            Dim dt As DataTable = Nothing
    
            Using cnn As New SqlConnection(CadenaConexion)
    
                Dim cmd As SqlCommand = cnn.CreateCommand()
    
                cmd.CommandText =
                    "SELECT Id_Documento, Fecha, Nombre, Sede FROM Asistencia " &
                    "WHERE Documento Like @documento + '%' ORDER BY Fecha Desc"
    
    
                ' Añadimos el único parámetro de entrada existente.
                cmd.Parameters.AddWithValue("@documento", documento)
    
                Dim da As New SqlDataAdapter(cmd)
                dt = New DataTable()
                da.Fill(dt)
    
            End Using
    
            ' Devolver el objeto DataTable.
            Return dt
    
        End Function
    
    End Class

    Cuando desees mostrar los datos en el control DataGridView, tan solo tienes que llamar al procedimiento ConsultaAsistenciaPorDocumento como indico a continuación:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                DataAsistencia.DataSource = CPrincipal.ConsultaAsistenciaPorDocumento(txtIdDocumento.text)
    
            Catch ex As Exception
                MessageBox.Show("Error al cargar Consulta en la Grilla: " & ex.Message)
    
            End Try
    
        End Sub

    Y lo dicho, que el mensaje de error Referencia a objeto no establecida como instancia de un objeto se tiene que producir en otra parte de tu proyecto cuyo código no has publicado.

    Un saludo


    Enrique Martínez Montejo
            [MS MVP - VB]

    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.


    domingo, 4 de octubre de 2015 8:24
    Moderador
  • si quieres que durante la depuración de tu aplicación la ejecución se detenga donde se produzca una excepción debes ir a la opción de menú. Depurar/Excepciones/marcar Common Language Runtime. Así cuando se lance la excepción que comentas la ejecución se parará en la linea que la provoca


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    domingo, 4 de octubre de 2015 11:06