
Imports System.Data.OleDb

Public Class FTestDB
    ' En el ejemplo inicial, este DIM. Aqui, para poder ser visto de otro Form, es FRIEND o PUBLIC
    Friend MiConexion As New OleDbConnection
    Friend MisDatos As New DataSet
    Friend NombreTablaEnDB As String
    Friend MiComando As New OleDbCommand

    Dim CargaArticleCompleta As Boolean = False   ' Para evitar los procedimientos que dan errores si activados durante la carga.

    Private Sub BCargarAdapter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BCargarAdapter.Click
        CargarLaTablaConAdapter()
    End Sub

    Private Sub BCargarDataReader_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BCargarDataReader.Click
        CargarLaTablaConDataReader()
    End Sub

    Friend Sub ParametroConexion()    'FRIEND a lugoar de Private para ser vista en otros Forms del proyecto

        Dim RutaYNombreDB As String = "D:\Tmp\TestAccesDBSimpleConMostrarYAgregar\MonStock2013.accdb"
        MiConexion.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & RutaYNombreDB & ";"  ' Ejecutar en x64

        NombreTablaEnDB = "TProductos"   ' este es LaTablaQueMeGusta  
    End Sub

    Private Sub CargarLaTablaConAdapter() ' con DataAdapter   Este es mas simple porque la DataTabla es creada automaticamente

        If MisDatos.Tables.Count > 0 Then  ' Para muchas pruebas
            MisDatos.Tables.Clear()
        End If

        ParametroConexion()

        Dim UnaTabla As New DataTable
        Dim Consulta As String

        Consulta = "SELECT * FROM " & NombreTablaEnDB

        Dim MiAdapter As OleDbDataAdapter = New OleDbDataAdapter(Consulta, MiConexion)

        MiAdapter.Fill(UnaTabla)
        UnaTabla.TableName = NombreTablaEnDB
        MisDatos.Tables.Add(UnaTabla)

        MiAdapter.Dispose()
        MiConexion.Close()

        MostrarDatos()

    End Sub

    Private Sub CargarLaTablaConDataReader()   ' con DataReader

        If MisDatos.Tables.Count > 0 Then  ' Para muchas pruebas
            MisDatos.Tables.Clear()
        End If

        ParametroConexion()
        MiConexion.Open()

        Dim UnaTabla As New DataTable

        ' Connexion effective 
        MiComando = MiConexion.CreateCommand()
        MiComando.CommandType = CommandType.Text
        MiComando.CommandText = "SELECT * FROM " & NombreTablaEnDB

        Dim UnosDatos As OleDbDataReader
        UnosDatos = MiComando.ExecuteReader()
        ' Crear colunas en  DataTabla
        For C As Integer = 0 To UnosDatos.FieldCount - 1
            UnaTabla.Columns.Add(UnosDatos.GetName(C))
        Next

        UnaTabla.TableName = NombreTablaEnDB

        Do While UnosDatos.Read
            UnaTabla.Rows.Add()
            For C As Integer = 0 To UnosDatos.FieldCount - 1
                UnaTabla.Rows(UnaTabla.Rows.Count - 1)(C) = UnosDatos.Item(C)
            Next
        Loop
        MisDatos.Tables.Add(UnaTabla)

        UnosDatos.Close()
        MiConexion.Close()

        MostrarDatos()

    End Sub

    Private Sub MostrarDatos()

        For Each C As Control In Me.Controls  ' Para muchas pruebas, es necesario de borrar anticas enlaces
            Try
                C.DataBindings.Clear()
            Catch
            End Try
        Next

        ' DataGridView
        DGVTest.DataSource = MisDatos.Tables(NombreTablaEnDB)

        ' ComboBox
        CBTest.DataSource = MisDatos.Tables(NombreTablaEnDB)
        CBTest.DisplayMember = "Articulos"
        Try    ' Try porqué no es disponible el Id con la consulta GROUP BY 
            CBTest.ValueMember = "Id"
        Catch
            CBTest.ValueMember = ""
        End Try

        ' ListBox
        LBTest.DataSource = MisDatos.Tables(NombreTablaEnDB)
        LBTest.DisplayMember = "Articulos"

        ' TextBox
        TBTest.DataBindings.Add("Text", MisDatos.Tables(NombreTablaEnDB), "Stock_A")
        TBColor.DataBindings.Add("Text", MisDatos.Tables(NombreTablaEnDB), "Colores")

        CargaArticleCompleta = True

    End Sub

    ' El bloque de gestión de lectura. Un solo procedimiente evento responde a 4 fuentes de Click : BPrimero, BAnterior, BSiguiente y BUltimo
    Private Sub LecturaCircular_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BUltimo.Click, BAnterior.Click, BSiguiente.Click, BPrimero.Click
        ' No es necesario intentar un movimiento si el DataSet no contiene ninguna tabla.
        If MisDatos.Tables.Count > 0 Then
            ' El BindingContext pertenece a un contenedor, el formulario en este caso.

            '' '' Las 2 lineas siguiente esta para evitar de registrar modificaciones accidentales. 
            '' '' No activadas aqui porque el objtecto de este ejemplo es de mostrar estos cambios.
            ' ''MisDatos.Tables(NombreTablaEnDB).RejectChanges()
            ' ''Me.BindingContext(MisDatos.Tables(NombreTablaEnDB)).CancelCurrentEdit()

            With Me.BindingContext(MisDatos.Tables(NombreTablaEnDB))
                ' Modificacion de la propiedad Position segun el boton seleccionado.
                Select Case sender.Name
                    Case "BPrimero"
                        .Position = 0
                    Case "BAnterior"
                        If .Position = 0 Then
                            .Position = .Count - 1              ' Lectura circular (como un reloj pero al revés)
                        Else
                            .Position -= 1
                        End If
                    Case "BSiguiente"
                        If .Position = .Count - 1 Then
                            .Position = 0                       ' Lectura circular (como un reloj)
                        Else
                            .Position += 1
                        End If
                    Case "BUltimo"
                        .Position = .Count - 1
                End Select
            End With
        End If
    End Sub

    Private Sub CBTest_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles CBTest.SelectedIndexChanged
        If Not CargaArticleCompleta Then
            Exit Sub
        End If

        Try    ' No programado en este ejemplo 

        Catch

        End Try
    End Sub

    Private Sub FTestDB_Load(sender As Object, e As EventArgs) Handles Me.Load
        '
    End Sub

    Private Sub BAgregar_Click(sender As Object, e As EventArgs) Handles BAgregar.Click
        FAgregarProducto.ShowDialog()
    End Sub
End Class

