Foros del Web » Programación para mayores de 30 ;) » .NET »

Problema para conectar con clase BD en visual Basic

Estas en el tema de Problema para conectar con clase BD en visual Basic en el foro de .NET en Foros del Web. Saludos a todos la comunidad, bueno el caso es que he retomado un antiguo ejercicio que tenía de VB, y me estoy encontrando problemas. De ...
  #1 (permalink)  
Antiguo 22/12/2013, 17:08
 
Fecha de Ingreso: octubre-2012
Mensajes: 24
Antigüedad: 11 años, 6 meses
Puntos: 0
Problema para conectar con clase BD en visual Basic

Saludos a todos la comunidad,
bueno el caso es que he retomado un antiguo ejercicio que tenía de VB, y me estoy encontrando problemas.

De momento es muy sencillo, he declarado una clase BaseDatos.vb y ademas
tengo una funcion(listarCategorias) que tiene que retornar un arrayList

Código:
Imports System.Data.OleDb
Imports System.Collections.ArrayList


Public Class BaseDatos

    'Dim conexion As OleDbConnection
    Private Shared conexion As OleDbConnection
    Private Shared comado As OleDbCommand
    Private Shared cadenaConexion As String


    Public Sub New(ByVal BaseDatos As String)
        'cadenaConexion = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|" + BaseDatos + ";Persist Security info=True"
        cadenaConexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\muebles.accdb"
        conexion = New OleDbConnection(cadenaConexion)

    End Sub
    Public Sub New()

    End Sub

    Public Shared Function abrirBase() As Boolean

        Try
            If (conexion.State = System.Data.ConnectionState.Open) Then
                Return True
                conexion.Open()
                Return True



            End If

        Catch ex As OleDbException
            Return False

        End Try
    End Function

    Public Shared Function cerrarBase() As Boolean

        Try
            conexion.Close()
            Return True




        Catch ex As OleDbException
            Return False



        End Try
    End Function


    Public Shared Function listarCategorias(ByVal mibase As BaseDatos) As ArrayList
        Dim cat As New ArrayList()
        Dim cadena As String = "SELECT*FROM categorias"
        Try
            conexion.Open()
            comado = New OleDbCommand(cadena, conexion)
            Dim registros As OleDbDataReader = comado.ExecuteReader
            While (registros.Read())

                cat.Add(registros.GetInt16("codigo"))
                cat.Add(registros.GetString("nombre_categoria"))


            End While
            Return cat


        Catch ex As Exception

        End Try


    End Function


End Class

En mi clase FormCat.vb, invoco el metodo en un evento de boton (ButtonVerCategorias_Click)

El objetivo como podreis ver es agregar los datos del arrayList a un listBox
(ListBoxCategorias)

Código:
Imports System.Data
Imports System.Data.OleDb
Imports System.Windows.Forms.DataGridView
Imports Muebles_DAW.BaseDatos



Public Class FormCat
    Public Shared mibase As New BaseDatos("muebles.accdb")

    Private Sub ButtonVerCategorias_Click(sender As Object, e As EventArgs) Handles ButtonVerCategorias.Click
        Dim mibase As New BaseDatos
        Dim listaCat As New ArrayList


        Try
            BaseDatos.abrirBase()
            listaCat = BaseDatos.listarCategorias(mibase)
           


  22      For i As Integer = 0 To listaCat.Count
                ListBoxCategorias.Items.Add(listaCat(i))

            Next

            BaseDatos.cerrarBase()


        Catch ex As OleDbException

        End Try

    End Sub
End Class
Aqui viene el error, al ejecutar me aparece una ventana de error en la linea 22:
del tipo null Reference Exception: señalado en rojo

System.NullReferenceException: Referencia a objeto no establecida como instancia de un objeto.
en Muebles_DAW.FormCat.ButtonVerCategorias_Click(Obje ct sender, EventArgs e) en C:\Users\mario\Documents\Visual Studio 2012\Projects\Muebles_DAW\Muebles_DAW\FormCat.vb:l ínea 22

La verdad, no se que se me está escapando, no se si es el texto de la cadena de conexion... la base de datos la tengo activada en el "Server Explorer" y tambien la tengo en el "Serch Solution explorer" junto con los demás formularios y clases.
El visual estudio es el 2012 y el archivo de Acces es del tipo accdb

Agradeceré cualquier tipo de ayuda.
Muchas gracias por anticipado
  #2 (permalink)  
Antiguo 01/01/2014, 13:24
 
Fecha de Ingreso: noviembre-2002
Ubicación: DF
Mensajes: 1.056
Antigüedad: 21 años, 5 meses
Puntos: 37
Respuesta: Problema para conectar con clase BD en visual Basic

Si metes el codigo como CLASE deberas instanciarlo primero, algo asi:
dim myBaseDatos as BaseDatos = new BaseDatos()

Otra opcion es que tu codigo lo metas como MODULO y entonces ya no deberas instanciarlo, lo usas directo como lo quieres con:
BaseDatos.abrirBase()
  #3 (permalink)  
Antiguo 02/01/2014, 15:41
 
Fecha de Ingreso: octubre-2012
Mensajes: 24
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: Problema para conectar con clase BD en visual Basic

Hola!!
muchas gracias por tu respuesta,

bueno hice lo que me dijiste:

Código:

 Private Sub ButtonVerCategorias_Click(sender As Object, e As EventArgs) Handles ButtonVerCategorias.Click
        'Dim mibase As New BaseDatos
        Dim mibase As BaseDatos = New BaseDatos()
        Dim listaCat As New ArrayList


        Try
            BaseDatos.abrirBase()
            listaCat = BaseDatos.listarCategorias(mibase)

            For i As Integer = 0 To listaCat.Count
                ListBoxCategorias.Items.Add(listaCat(i))

            Next

            BaseDatos.cerrarBase()


        Catch ex As OleDbException

        End Try

    End Sub
End Class
pero me dió el mismo error de NullReferenceException...no se
si me pudes dar alguna otra idea te voy a dejar la cadena de conexion
ya aprovecho y te pongo un copia y pega de la clase BaseDatos:

Código:
Imports System.Data.OleDb
Imports System.Collections.ArrayList


Public Class BaseDatos

    'Dim conexion As OleDbConnection
    Private Shared conexion As OleDbConnection
    Private Shared comado As OleDbCommand
    Private Shared cadenaConexion As String


    Public Sub New(ByVal BaseDatos As String)
        Dim cadenaConexion As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\muebles.accdb"
        ' cadenaConexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\mario\Documents\Visual Studio 2012\Projects\Muebles_DAW\Muebles_DAW\muebles.accdb"
        conexion = New OleDbConnection(cadenaConexion)

    End Sub
    Public Sub New()

    End Sub

    Public Shared Function abrirBase() As Boolean

        Try
            conexion.Open()


        Catch ex As Exception

        End Try
        Return False
    End Function

    Public Shared Function cerrarBase() As Boolean

        Try
            conexion.Close()
            Return True




        Catch ex As OleDbException
            Return False



        End Try
    End Function


    Public Shared Function listarCategorias(ByVal mibase As BaseDatos) As ArrayList
        Dim cat As New ArrayList()
        Dim cadena As String = "SELECT codigo,nombre_categoria FROM categorias"
        Try
            'conexion.Open()
            comado = New OleDbCommand(cadena, conexion)
            Dim registros As OleDbDataReader = comado.ExecuteReader
            While (registros.Read())

                cat.Add(registros.GetInt16("codigo"))
                cat.Add(registros.GetString("nombre_categoria"))


            End While
            Return cat
            'conexion.Close()


        Catch ex As Exception

        End Try


    End Function


End Class
Gracias de nuevo y ...Feliz Año!!
  #4 (permalink)  
Antiguo 03/01/2014, 13:18
 
Fecha de Ingreso: noviembre-2002
Ubicación: DF
Mensajes: 1.056
Antigüedad: 21 años, 5 meses
Puntos: 37
Respuesta: Problema para conectar con clase BD en visual Basic

No deberias haber hecho esto?:
mibase ES LA INSTANCIA
entonces... si te sigue tronando aqui:

For i As Integer = 0 To listaCat.Count

Es x que no recupero nada en "listacat"

Ya que deberias haber cargado asi:
mibase.abrirBase()
listaCat = mibase.listarCategorias(mibase)

ve depurando tu aplicacion y viendo que el objeto "listaCat" no tenga "nothing" (o sea que no se devolvio nada)
Ve quedentro de la funcion "listarCategorias" si se este cargando bien el array
  #5 (permalink)  
Antiguo 03/01/2014, 15:18
 
Fecha de Ingreso: octubre-2012
Mensajes: 24
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: Problema para conectar con clase BD en visual Basic

Hola de nuevo,

a ver he depurado tal como me dijiste, puse dos puntos de depuracion, que te los marco en negrita:


Código:
Imports System.Data
Imports System.Data.OleDb
Imports System.Windows.Forms.DataGridView
Imports Muebles_DAW.BaseDatos



Public Class FormCat
    Public Shared mibase As New BaseDatos("muebles.accdb")

    Private Sub ButtonVerCategorias_Click(sender As Object, e As EventArgs) Handles ButtonVerCategorias.Click
        'Dim mibase As New BaseDatos
        Dim mibase As BaseDatos = New BaseDatos()
        Dim listaCat As New ArrayList







        Try
            BaseDatos.abrirBase()

            listaCat = BaseDatos.listarCategorias(mibase)

            For i As Integer = 0 To listaCat.Count
                ListBoxCategorias.Items.Add(listaCat(i))

            Next

            BaseDatos.cerrarBase()


        Catch ex As OleDbException

        End Try

    End Sub
End Class
vale el otro punto de interrupcion lo puse en la clase BaseDatos, donde esta el metodo/funcion

Código:
Imports System.Data.OleDb
Imports System.Collections.ArrayList


Public Class BaseDatos

    'Dim conexion As OleDbConnection
    Private Shared conexion As OleDbConnection
    Private Shared comado As OleDbCommand
    Private Shared cadenaConexion As String


    Public Sub New(ByVal BaseDatos As String)
        Dim cadenaConexion As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\muebles.accdb"
        ' cadenaConexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\mario\Documents\Visual Studio 2012\Projects\Muebles_DAW\Muebles_DAW\muebles.accdb"
        conexion = New OleDbConnection(cadenaConexion)

    End Sub
    Public Sub New()

    End Sub

    Public Shared Function abrirBase() As Boolean

        Try
            conexion.Open()


        Catch ex As Exception

        End Try
        Return False
    End Function

    Public Shared Function cerrarBase() As Boolean

        Try
            conexion.Close()
            Return True




        Catch ex As OleDbException
            Return False



        End Try
    End Function


    Public Shared Function listarCategorias(ByVal mibase As BaseDatos) As ArrayList
        Dim cat As New ArrayList()
        Dim cadena As String = "SELECT codigo,nombre_categoria FROM categorias"
        Try
            'conexion.Open()
            comado = New OleDbCommand(cadena, conexion)
            Dim registros As OleDbDataReader = comado.ExecuteReader
            While (registros.Read())

                cat.Add(registros.GetInt16("codigo"))
                cat.Add(registros.GetString("nombre_categoria"))


            End While
            Return cat
            'conexion.Close()


        Catch ex As Exception

        End Try


    End Function



End Class
vale cuando voy dando saltos llega hasta la parte de código que está en rojo, pero, no entra en el while, directamente se va a la excepcion con el mensaje:

"InvalidOperationException was caught"
Execute Reader requiere una conexion abierta y disponible,el estado de la
conexion es cerrada

No se si se me escapa algún pequeño detalle..
Saludos y gracias

Etiquetas: visual
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:41.