none
Error muy raro en tiempo de ejecucion: "referencia a objeto no establecida como instancia de un objeto" aun estando todo bien programado RRS feed

  • Pregunta

  • ------------------------------En la clase Form----------------------------------------------
    Public Class LogicaCliente
        Dim obl_cliente As New LogicaCliente
        Dim ds_datos As New DataSet       
    ds_datos = obl_cliente.Conexion_datagridview1()
    Datagridview1.Datasource = ds_datos
    -----------------------------En la Clase Logica--------------------------------------         
    Public Class LogicaCliente
        Dim obd_cliente As New GestorCliente
        Dim ds_receptor As New DataSet       
        Public Function Conexion_datagridview1() As DataSet
            ds_receptor = obd_cliente.Cargar_Datos() 
             Return ds_receptor 
        End Function 
    End class
    ------------------------------En la Clases Datos ------------------------------------------
    Public Class GestorCliente
        Private obd_con As New Cls_Conexion
        Public ds As New DataSet
        Public Function Cargar_Datos() As Data.DataSet
            If obd_con.abrirBaseDatosAccess Then
                Dim Consulta As String = "SELECT * FROM cliente ORDER BY nombre"
                Dim adapter As New OleDb.OleDbDataAdapter(Consulta, obd_con.getConexionAccess)
                adapter.Fill(ds)
                Return ds
            Else
                Return Nothing
            End If
        End Function
    End class
    */*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/**/*/*/*/*/*/**/*/*/*/*/*/*/*/*/*
    Tengo una aplicacion con un Form1 (1) , un clase "LogicaCliente" (2), y otra "GestorCliente" (3)...y una 4ta clase que me otorga la conexion sin problemas. 
    Como veran "toooooodo"...... "toooooodo" el codigo esta bien escrito, el problema es este:
    EN TIEMPO DE EJECUCION ME VOTA "referencia a objeto no establecida como instancia de un objeto", de una forma caprichosa y que no logro explicarme, de un segundo para otro, de una compilacion para otra no conecto mas , y comenzo a salir el mensaje donde no salia una y otra vez como si nada estuviera inastanciado, he leido algo y puede ser:
    *error en algun producto visual studio
    *error en algun producto microsoft
    Puedo programarlo desde 0 y me vuelve a mostrar lo mismo (pareciera ser error de plataforma o framework , ya es segunda vez que me 
    sucede, la primera tambien se arreglo solito ,  pero esta vez quiero saber que pasa
    • Cambiado Enrique M. Montejo jueves, 1 de diciembre de 2011 8:54 acceso a datos (De:Lenguaje VB.NET)
    martes, 22 de noviembre de 2011 14:40

Respuestas

  • Hola:

    Deberías 'debugar' el código para ver cuando no abre Access cual es el error que da. En teoría, deberías comprobar el error en:

    Catch ex As Exception

       cn.Close()

    ''' Aquí deberías mirar que error te lanza cuando no abre Access. (no existe el fichero, está abierto de modo exclusivo, etc.) y mostrar el mensaje correspondiente.

    Return False

    End Try

    Saludos

    • Marcado como respuesta Junior_net jueves, 1 de diciembre de 2011 14:48
    jueves, 1 de diciembre de 2011 8:32

Todas las respuestas

  • cuando se produce el error se detiene el codigo en alguna linea en concreto?

    o cuando atrapas el Exception puedes loguerarlo para poder ver la propeidad StackTrace del error y analizar en que linea se produce

     

    recuerda definir Try..Catch en el codigo para poder controlar el error y loguarlo, asi podrias analizarlo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 22 de noviembre de 2011 15:25
  • Ante todo muchisimas gracias por responder vengo aprendiendo mucho de Social MSDN y muchas veces de las luces que vas brindando.

    Te comento nuevamente Todo esta definido bajo Try...Catch desde luego, solamente los quite para agilizar la consulta , pero bueno te mostrare

    Hacer:

    ds_datos = obl_cliente.Conexion_datagridview1()
    Datagridview1.Datasource = ds_datos
    o....
     ds_datos = obd_cliente.Cargar_Datos() 
    Datagridview1.Datasource = ds_datos
    El error se posiciona, siempre en el Dataset, cualquiera sea la clase. Ahora algo tan simple como esto no funciona y lo que es peor Ya no lo muestra el error. Tendre que reinstalar Visual ? 
    ---------------------------------------------------------------------------------------------------------------------------------------
    Imports System.Data.OleDb
    Public Class Form1

        Public cn As New OleDbConnection
        Public comando As New OleDbCommand
        Public ds As New DataSet
        Dim respuesta As String
        Dim Consulta As String

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            cn = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source= C:\base_de_datos.accdb;")
            cn.Open()
            Consulta = " SELECT * FROM cliente "
            Dim adapter As New OleDb.OleDbDataAdapter(Consulta, cn)
            adapter.Fill(ds)
        End Sub

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            DataGridView1.DataSource = ds
        End Sub
    End Class  
    ----------------------------------------------------------------------------------------------------------------------------------
    Saludos y Gracias de antemano.

    martes, 22 de noviembre de 2011 19:38
  • Imports System.Data.OleDb
    Public Class Form1


        Public cn As New OleDbConnection
        Public comando As New OleDbCommand
        Public ds As New DataSet
        Dim respuesta As String
        Dim Consulta As String


        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            cn = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source= C:\base_de_datos.accdb;")
            cn.Open()
            Consulta = " SELECT * FROM cliente "
            Dim adapter As New OleDb.OleDbDataAdapter(Consulta, cn)
            'adapter.Fill(ds) 'Esta linea la sustituyes por la de abajo
            adapter.Fill(ds, "TABLA")

        End Sub


        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            DataGridView1.DataSource = ds
            'Añades la linea de abajo
            DataGridView1.DataMember = "TABLA"
        End Sub
    End Class 

    miércoles, 23 de noviembre de 2011 9:33
  • Hola:

    En la función CargarDatos As Dataset de GestorCliente tienes un:

    If obd_con.abrirBaseDatosAccess Then

    Si por alguna razón no se 'abre' Access, te devuelve un DataSet Nothing, y a partir de aquí es posible que sea el origen de los errorres. Deberías controlar cuando la condición es falsa, para ver que está sucediendo.

    Saludos

    miércoles, 23 de noviembre de 2011 11:46
  • Hola:

     Perdon por la demora, fui al fondo de todo e hice lo siguiente :

    ---------------------Form ----------------------------

        Din obd_con  as new cls_Conexion

        Private Sub Button1_Click_1(ByVal sender As......, ByVal e As System.........) _ Handles Button1.Click

            obd_con.abrirBaseDatosAccess()

        End Sub

    ---------------------Clase de Conexion-----------------------------
    Public Class Cls_Conexion
        Public cn As New OleDbConnection
        Public comando As New OleDbCommand
        Public Function abrirBaseDatosAccess() As Boolean
            Try
                cn = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=         C:\base_de_datos.accdb;")
                cn.Open()
                If cn.State = ConnectionState.Open Then
                    MessageBox.Show("Nos conectamos exitosamente")
                Else
                    Return False
                End If
                Return True
            Catch ex As Exception
                cn.Close()
                Return False
            End Try
        End Function
     
    end class
    -----------------------------------------------------------------------------------------------------
    Solo con el objeto de que muestre un MessageBox como Test para saber que conecta y sorepresa !!!!
    !!!! NO CONECTA !!!!

    Tendre algun Problema con la  referencia a "Imports System.Data.OleDb"... tengo que agregarla de nuevo? se hecho a perder ?, tengo que bajar alguna dll nuevamente ? , O Podria venir desde Acces el problema ?
    Saludos y gracias de Antemano.

    lunes, 28 de noviembre de 2011 0:47
  • Hola:

    Deberías 'debugar' el código para ver cuando no abre Access cual es el error que da. En teoría, deberías comprobar el error en:

    Catch ex As Exception

       cn.Close()

    ''' Aquí deberías mirar que error te lanza cuando no abre Access. (no existe el fichero, está abierto de modo exclusivo, etc.) y mostrar el mensaje correspondiente.

    Return False

    End Try

    Saludos

    • Marcado como respuesta Junior_net jueves, 1 de diciembre de 2011 14:48
    jueves, 1 de diciembre de 2011 8:32
  • Muy Bien.....
                 !!!!  BINGO !!!! 

    Hacer  "Try...Catch" a cn.open() dada la indicacion de Focus Media, sirvio para llegar al meollo y detectar el siguiente error, que por si acaso esta en la web ya expuesto y directamente resuelto sin tanto analisis como lo hemos hecho aqui. Pero que desde luego no esta ni siquiera en lo minimo, demas....  

    Me vota el siguiente cuadro de dialogo : 

    "El proveedor Microsoft.ACE.OLEDB.12.0 no está registrado en el equipo local"

    El error se debe a que en algun momento que no recuerdo , cambie la Opcion de Compilacion a x64 lo que no es compatible con Acces 2007 , porque para este no existen Drivers x64 Bits. 

     Ahora cambie a x86 la Opcion de Compilacion y todo volvio a la normalidad.

    Gracias a todos aqui les dejo el link de la solucion encontrada a partir de nuestro analisis. 

    http://hectorperez.wordpress.com/2010/01/26/el-proveedor-microsoft-ace-oledb-12-0-no-est-registrado-en-el-equipo-local/

     

    jueves, 1 de diciembre de 2011 14:46