sábado, 9 de mayo de 2015

Conectar una base de datos ACCESS con una aplicación VISUAL STUDIO 2005

Tengo una base de datos Access y la quiero gestionar a través de una aplicación de Visual StudioPara conectar ambas hay que seguir unos pasos muy sencillos.

Primero hay que crear la aplicación de Visual Studio y copiar la Base de Datos Access en el directorio Bin\Debug de dicha aplicación para evitar luego problemas.


Luego desde mi aplicación de Visual Studio elijo Ver y la opción Explorador de Servidores.

Abrir el explorador de servidores



Esto nos abre una ventana desde la que crearemos la conexión de nuestra Base de datos Access con nuestra aplicación. Para ello,  sobre conexiones de datos botón derecho del ratón  y agregar conexión.

Agregar conexión access a Visual Studio

Esto nos abre un cuadro de diálogo que tiene por defecto la conexión SQL Server, pulsamos cambiar.

Cambiar tipo de conexión a BBDD en Visual Studio

Y podemos elegir la conexión a una base de datos de Access.

Conectar Access con Visual Studio

Pulsamos aceptar y volvemos al diálogo anterior pero modificado para Access. Pulsamos examinar.

elegir la base de datos de access

Y esto nos permitirá elegir  nuestra base de datos Access.  Hecho esto podemos probar la conexión para asegurarnos de que es una conexión correcta.

Una vez hemos agregado nuestra base de datos veremos esto en el explorador de servidores.

Ver base de datos access desde Visual Studio

Ahora podemos elegir un objeto (una tabla por ejemplo) y pulsando el botón derecho del ratón nos permite mostrar los datos de la tabla.

Mostrar datos de la tabla desde Visual Studio

Ahora para ver los datos en nuestra aplicación directamente añadimos un formulario a nuestra aplicación y colocamos un control de texto sencillo.

Formulario muy básico

Ahora en el código de la aplicación ponemos esto:
(He añadido comentarios en verde para explicar  lo que hace cada línea de código)

Imports System.Data.OleDb

Public Class Form1

    'Objeto que recoje los datos leidos de la tabla
    Dim dt As New DataTable
    'Contador del número de filas
    Dim intFila As Integer = 0

    'Se activa al cargarse el formulario
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Objeto conexión para conectarse a la base de datos de Access
        Dim strConexion As New OleDbConnection("Provider=Microsoft.jet.Oledb.4.0;Data Source=" + My.Application.Info.DirectoryPath + "\Database21.mdb")
        'Variable que contiene la select a ejecutar sobre la base de datos
        Dim strSQL As String = "Select * from tbConstelaciones"
        'Adaptador de la base de datos con la aplicación
        Dim adaptador As New OleDb.OleDbDataAdapter(strSQL, strConexion)
        Dim ds As New DataSet

        'Rellena al adaptador con el primer dato leído
        adaptador.Fill(dt)
        'Vacía la memoria del adaptador
        adaptador.Dispose()
        'llama a la subrutina qu emuestra el texto en la caja
        ActualizaTexto()
      
    End Sub
    Private Sub ActualizaTexto()
        'Muestra en la caja de texto el campo descripción de la tabla leída.
        TextBox1.Text = CStr(dt.Rows(intFila)("Descripcion"))
    End Sub
End Class

Si ahora ejecutamos la aplicación, podemos encontrarnos con esto:

Formulario sin datos

O incluso puede salirnos un mensaje de error diciendo que no reconoce Microsoft.jet.Oledb.4.0.

La aplicación no está leyendo correctamente de la base de datos. (En mi caso particular es porque el equipo es de 64 bits)  Podemos solucionarlo del siguiente modo:
Abrimos las propiedades del proyecto.

Propiedades del proyecto

En la carpeta compilar elegimos  Opciones de compilación avanzadas.

Propiedades avanzadas de compliación


Esto nos abre un cuadro de diálogo donde ponemos lo que proceda (en mi caso x86)

compilación CPU de destino

Ahora al ejecutar la aplicación ya si lee el primer campo de la tabla.

Formulario relleno

A partir de aquí ya podemos empezar a complicar nuestra aplicación como queramos para acceder a los datos.
Por ejemplo podemos añadir dos botones de avance hacia atrás y hacia delante para navegar por los registros de la tabla con muy poco código. Basta con esto:

Botones de avance-retroceso

Y ahora en el código basta añadir.
Private Sub btnAnterior_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnterior.Click
If intFila > 0 Then
            intFila -= 1
            ActualizaTexto()
      End If
End Sub

Private Sub btnSiguiente_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSiguiente.Click
      If intFila < dt.Rows.Count Then
         intFila += 1
            ActualizaTexto()
      End If
End Sub

Por último voy a poner otro ejemplo de un procedimiento similar al anterior pero en este caso a través de código almacena el resultado de la SELECT (que pueden ser varias filas) en un array.

'Este procedimiento busca un resultado de una columna de una tabla de la base de datos el valor a buscar se introduce como Valor_Campo en este caso es un integer pero podría ser de cualquier otro tipo
Public Sub BusquedaGenerica(ByVal Nombre_Tabla As String, ByVal Nombre_Campo As String, ByVal strConexion As Object, Optional ByVal Valor_Campo As Integer = 0)

        'Variable que contiene la select a ejecutar sobre la base de datos

        Dim strSQL As String
        Dim i As Integer = 0
        Dim cuenta As Integer
        Dim Salida() As String  'Este array almacenará el resultado de la SELECT

Try
           cuenta = CuentaRegistros(strConexion, "SELECT COUNT(*) FROM " & Nombre_Tabla & " WHERE " & Nombre_Campo & " = " & Valor_Campo) 'cuenta el número de registros que devuelve la select

'Nombre_Campo_X es otro campo de la tabla diferente del introducido por parámetro

            strSQL = "SELECT Nombre_Campo_X FROM " & Nombre_Tabla & " WHERE & Nombre_Campo &  = " & Valor_Campo  'selecciona todos los que cumplen la condición

            Dim cmd As New OleDb.OleDbCommand(strSQL, strConexion
            ReDim Preserve Salida(cuenta)
           'Crea un objeto que guardará el resultado de la SELECT
            Dim reader As OleDb.OleDbDataReader = cmd.ExecuteReader
            i = 0
            'Recorre el resultado del SELECT y lo almacena en el array
            While reader.Read
                Salida(i) = reader.Item(0)
                i = i + 1
            End While
            reader.Close()

        Catch ex As Exception
            MessageBox.Show(ex.Message)
            BusquedaGenerica = "Error en BuscaGenerica"
        End Try
    End Sub
'Devuelve el número de registros de una SELECT de tipo COUNT
    Private Function CuentaRegistros(ByVal strConexion As Object, ByVal Query As String) As Integer

        'Busca la cantidad de registros
        Dim cmd1 As New OleDb.OleDbCommand(Query, strConexion)
        CuentaRegistros = cmd1.ExecuteScalar()

    End Function


No hay comentarios:

Publicar un comentario