none
Como cerrar completamente una Base de datos para abrir otra RRS feed

  • Pregunta

  • Hola buen dia a todos.

    En mi proyecto utilizo un boton para abrir una base de datos Access y cargo los datos en un datagridview, luego edito los datos y con otro boton actualizo la base de datos. Esa parte funciona perfectamente. El problema viene cuando intento abrir otra base de datos distinta sin cerrar el programa... Me sale este error:

    este es el codigo que estoy utilizando:

    Dim con As New OleDbConnection
    Dim ds As New DataSet
    Dim dt As New DataTable
    Dim da As New OleDbDataAdapter
    
      Private Sub Load_btn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Load_btn.Click
    
           OpenFileDialog1.Filter = "mdb Files | *.mdb"
    
            OpenFileDialog1.DefaultExt = "mdb"
            OpenFileDialog1.Title = "Abrir Base de datos"
            OpenFileDialog1.FileName = ""
            OpenFileDialog1.Multiselect = False
            Dim RutaArchivo As String = ""
    
            If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
                DataGridView1.DataSource = Nothing
                DataGridView1.Rows.Clear()
    
                RutaArchivo = OpenFileDialog1.FileName
    
                con.Close()
                con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & RutaArchivo
                con.Open()
                ds.Tables.Add(dt)
                da = New OleDbDataAdapter("Select * from MiTabla", con)
                Dim cb = New OleDbCommandBuilder(da)
                da.Fill(dt)
                DataGridView1.DataSource = dt.DefaultView
                con.Close()
    
            End If
    
        End Sub
    
      Private Sub save_btn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles save_btn.Click
            da.Update(dt)
        End Sub

    Igual es una tonteria, pero nunca he trabajado con bases de datos y no se como hay que hacer para cerrar completamente una base de datos para poder abrir otra y editarla..

    • Cambiado Enrique M. Montejo lunes, 13 de febrero de 2017 11:06 Pregunta relacionada con objetos de acceso a datos.
    viernes, 10 de febrero de 2017 14:34

Todas las respuestas

  • Hola, una consulta porque necesitas llenar un dataset si ya estas trabajando con el datatable, no deberías declarar los objetos de manera global sino

     Private Sub Load_btn_Click(sender As System.Object, e As System.EventArgs) Handles Load_btn.Click
            Dim con As New OleDbConnection
            Dim ds As New DataSet
            Dim dt As New DataTable
            Dim da As New OleDbDataAdapter
            OpenFileDialog1.Filter = "mdb Files | *.mdb"
            ...............................

    lo que ocurre es que ya encuentra la referencia del datatable agregada a otro dataset por la forma como lo haz declarado en cambio con el código proporcionado la instancia se crea en cada click del boton, con el codigo como lo tienes podrias hacer

        da = New OleDbDataAdapter("Select * from MiTabla", con)
            da.Fill(dt)
            ds.Tables.Add(dt.Copy)
            DataGridView1.DataSource = dt.DefaultView
            con.Close()

    Pero como te decía no le veo mucho sentido al dataset a no ser que lo estes usando para algo mas


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.



    • Editado Augusto1982 viernes, 10 de febrero de 2017 14:48
    • Propuesto como respuesta Joyce_AC viernes, 10 de febrero de 2017 15:15
    • Votado como útil JaviPatch viernes, 10 de febrero de 2017 16:51
    viernes, 10 de febrero de 2017 14:45
  • Gracias por responder..

    Lo utilizo nada mas que para editar bases de datos y actualizarlas. El declarar los objetos en modo global es porque si no no puedo actualizar la base de datos despues de hacer los cambios:

      Private Sub save_btn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles save_btn.Click
            da.Update(dt)
        End Sub


    Si lo declaro como tu dices, me sale el error "da" no esta declarado..


    Lo unico que necesito es que al abrir una base de datos distinta, cierre todos los procesos de la antigua base de datos.. como si cerrase el programa y lo volviera a abrir..
    • Editado JaviPatch viernes, 10 de febrero de 2017 15:57
    viernes, 10 de febrero de 2017 15:42
  • Gracias por responder..

    Lo utilizo nada mas que para editar bases de datos y actualizarlas. El declarar los objetos en modo global es porque si no no puedo actualizar la base de datos despues de hacer los cambios:

      Private Sub save_btn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles save_btn.Click
            da.Update(dt)
        End Sub


    Si lo declaro como tu dices, me sale el error "da" no esta declarado..


    Lo unico que necesito es que al abrir una base de datos distinta, cierre todos los procesos de la antigua base de datos.. como si cerrase el programa y lo volviera a abrir..
    Hola ,pero podrías nuevamente declarar el objeto dataadapter localmente como en el botón anterior.

    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.

    viernes, 10 de febrero de 2017 16:07