Un Combo, Una MDB, Un DataGridView y una MDF

Aquí una idea de cómo utilizar MDF y MDB’s.

En este ejemplo utilizamos la tabla de proveedores de una MDB para rellenar un DataGridView de los productos del proveedor en la MDF de ‘NorthWnd’ seleccionado en el Combo. 

Combo+Datagrid

Debo advertir que el siguiente codigo no ejemplo de metodologia, tan solo pretende enseñar en un solo ejemplo como conectar una BD Access y otra de SQL, pero en ningun caso es un modelo de uso, pues en realidad nunca he trabajado con una aplicacion que utilice los dos formatos conjuntamente.

Imports System.Data.OleDb

Imports System.Data.SqlClient

 

Public Class Form1

    Private WithEvents ComboBox1 As New ComboBox

    Private WithEvents DataGridView1 As New DataGridView

   

    ‘Definir enlace a datos y objetos del form

    Private SQLConexion As New SqlConnection( _

        “Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Temp\Northwnd.mdf” + _

        “;Integrated Security=True;Connect Timeout=30;User Instance=True”)

 

    Private MDBConexion As New OleDbConnection( _
        “Provider=Microsoft.Jet.OLEDB.4.0;” + _

        “Data Source=C:\Temp\bd1.mdb”)

 

    Private Sub Form1_Load() Handles Me.Load

        Me.Controls.Add(ComboBox1)

        Me.ComboBox1.Dock = DockStyle.Top

        AddHandler ComboBox1.SelectedIndexChanged, AddressOf Obtener_Articulos

 

        Me.Controls.Add(Me.DataGridView1)

        Me.DataGridView1.Dock = DockStyle.Fill

 

        Me.ComboBox1.DisplayMember = “CompanyName”

        Me.ComboBox1.ValueMember = “SupplierID”

        Me.ComboBox1.DataSource = Obtener_Proveedores()

    End Sub

   

    ‘ Cargar el DGV con la seleccion de articulos segun el proveedor

    Private Sub Obtener_Articulos()

        Dim Articulos = _
          “SELECT * FROM Products Where SupplierId = “ + _
          ComboBox1.SelectedValue.ToString

        SQLConexion.Open()

        Dim MiSqladapter As New SqlDataAdapter

        MiSqladapter.SelectCommand = New SqlCommand(Articulos, SQLConexion)

        Dim MiTabla As New DataTable()

        MiSqladapter.Fill(MiTabla)

        SQLConexion.Close()

        Me.DataGridView1.DataSource = MiTabla

    End Sub

   

    ‘ Obtener la tabla de proveedores como ‘datasource del ComboBox’

    Private Function Obtener_Proveedores()

        MDBConexion.Open()

        Dim MDBadapter As New OleDbDataAdapter(“Select * from Suppliers”, MDBConexion)

        Dim MiTabla As New DataTable()

        MDBadapter.Fill(MiTabla)

        Return MiTabla

    End Function

 

End Class

El proveedor ‘Microsoft.Jet.OLEDB.4.0’ no está registrado en el equipo local

Sorprendentemente continúan llegando inquietudes preguntando cómo se abre una BD de Access en las nuevas versiones de VB.  Algunos asiduos a este formato han sufrido el desconcertante mensaje… no está en el equipo local? Cuando la realidad es que no esta implementado!

Para dar una buena explicación, recibimos este mensaje cuando utilizamos ‘OLEDB’ en un sistema X64 y ese es el detalle. No existe una implementación de ‘OLEDB’ para 64 bits.

La única solución es desarrollar en 32Bits, aunque esto ultimo NO signifique que tengamos que reinstalar el sistema operativo… tan solo nesitaremos seleccionar ‘X86’ como ‘CPU de destino’ en las ‘Opciones de Compilación Avanzadas’ de la pestaña ‘Compilar’ en las propiedades de ‘My Project’

Espero que esto os ahorre alguna que otra hora de busqueda.
Pep Lluis,

Error de sintaxis en la instrucción INSERT INTO.

Este es uno de los textos de error que mas amenudo se enfrenta a los que intentan actualizar la informacion enlazada de un DGV’s y una MDB.

Aunque en muchos otros foros/post se advierte de debemos utilizar nombres de campo que no esten reservados, caemos y volvemos a caer en el error de usar nombres con caracteres no admitidos. Un simple espacio al nombrar el campo provocara una excepcion tanto en la operación de ‘INSERT’ Como ‘UPDATE’. Suerte que a grandes males… grandes remedios J

Ejemplo :   el Nombre ‘Columna A’ generara una excepcion
Sin embargo  el nombre ‘Columna_A’ no genera ninguna excepcion… asi de simple.

Os recuerdo el enlace con la lista de palabras reservadas que no pueden utilizarse para nombrar los campos de una MDB que posteriormente utilizaremos enlazada con un DataGridView y un ‘OleDb.OleDbCommandBuilder(MiMdbAdaptador)’

http://support.microsoft.com/kb/248738

En caso contrario las únicas opciones disponibles para continuar utilizando dichos nombres, será construir el’INSERT’… ‘UPDATE’ commands de forma manual o utilizar la opción de ‘Origen de Datos’ generado por Visual Studio.

Saludos,
Pep Lluis,

Yo solo quiero Numeros!

Independientemente de las mil y una formas para filtrar/formatear entradas de texto, me gustan las sencillas sin retorcimientos. Aquí te dejo una idea de cómo aplicar reglas cuando se trata de todo un form, aunque trabajandolo puedes customizar el comportamiento en funcion al control que tiene el foco. No olvides que tambien dispones de un espacio de nombres sensacional :

Imports System.Text.RegularExpressions

Aunque como te digo, en determinadas ocasiones cabe aplicar lo sencillo si con ello cubrimos las necesidades. 😉
El siguiente ejemplo demuestra como filtrar la pulsación de cualquier tecla que no sea numerica o coma.

Private Sub Form1_Load() Handles MyBase.Load
    Me.KeyPreview = True
End Sub 

Protected Overrides Function ProcessDialogKey(ByVal keyData As System.Windows.Forms.Keys) As Boolean
    Select Case keyData
        ‘ 48 a 57  = numericas encima teclado alfabetico
        ‘ 97 a 106 = Numericas teclado numerico
        Case 48 To 57, 97 To 106, Keys.Oemcomma
            ‘Solo devolver las pulsaciones que pasan el filtro
            Return MyBase.ProcessDialogKey(keyData)
        Case Else
            ‘Evitar la propagacion de la pulsacion
            ‘de teclas que no nos interesan
            Return True
    End Select
End Function

Lo Bueno y simple… Dos veces bueno!
Pep Lluis