Conexiones .Net Con Access 2007 o 2010

12 noviembre, 2010 at 14:14 (Ado.Net, C#, SharpDevelop, WindowsForm)

Introducción.

Ado.net provee varia formas de conectarnos a varios gestores de base de datos.

Pero a veces también es útil crearnos aplicaciones que usen Access para poder guardar los datos. Si bien no es la mejor forma pero puede llegar a ser muy útil para ciertos aspectos como guardar ciertos datos que no sea muy relevantes pero sean útiles en nuestra aplicación (configuración etc.).

Para una seguridad extra podemos agregar a Access un password para poder tener mayor grado de confianza de que nuestros datos están seguros.

Usaremos la librería Oledb que provee Microsoft para la conexión de la base de datos esta librería llamara a un driver especifico que es distinto en Access 2003 y 2007 y superiores, ya que en la versión de 2007 de Access se guarda el archivo como accdb. Y en Access 2003 mdb.

En este tutorial usaremos Access 2010 aunque el 2007 no tiene diferencias importantes.

Usaremos Windows Form para la prueba y uso de esta librería. Aunque para este ejemplo usamos Visual Studio 2010 con cualquier versión de Visual Studio podremos realizar la conexión también con las versiones Express o podemos usar SharpDevelop los pasos serán los mismos.

Materiales.

1. Access 2007 o 2010

2. Visual Studio 2010 o SharpDevelop

Manos a la Obra.

1.- Primero Crearemos la base de datos en Access.

clip_image002

Para el ejemplo usaremos la base de datos DbInscripcion la cual contendrá una tabla alumno y materia la cuales se relación con inscripción.

clip_image004

El diagrama de base de datos es el siguiente:

clip_image006

2.- Creamos un proyecto de Windows Form.

3.- Importaremos a Visual Studio la base de datos en Access haciendo click derecho al proyecto y agregando elemento existente.

clip_image008

Buscamos el archivo.

2010-11-11 19h43_53

Cuando Adicionemos el archivo a nuestro proyecto VS nos desplegara un asistente para adicionar un Data Set Tipado. Escogemos cancelar para que no agregue este data set.

clip_image012

Nota.- Existe un problema con los driver de Access en Windows de 64 así que si son de 64 pueden ocurrir un error diciéndole que no se encuentra el controlador de Access.Oledb.12.

2010-11-11 20h00_37

Para que nuestra solución funcione y podamos probar el ejemplo tenemos que cambiar la arquitectura de nuestra aplicación. De 86 a Any Pc si queremos que funcione en todas las PC.

clip_image016

Recuerden que esto solo es para Windows de 64.

4.- Insertamos un botón al formulario Windows para probar la conexión a la base de datos. Generamos el evento clic del boton

2010-11-11 20h01_37

5.- Agregamos las librerías al formulario con using System.Data.OleDb;

.

2010-11-11 19h40_46

6.- Ahora comenzamos a crearnos el Objeto OdbcConnection para verificar si estamos conectados a la base de datos.

2010-11-11 20h02_38

Hacemos ejecutamos la aplicación y verificamos que realmente estamos conectados.

clip_image024

6.- Una vez verificado que la conexión está bien y la cadena de conexión es la correcta creamos el formulario para adicionar datos a la tabla Alumno.

clip_image026

7.- Ahora creamos los objetos necesarios para poder interactuar con la base de datos e insertamos los datos hacia el archivo Access.

clip_image028

La instrucción |DataDirectory|\DbInscripcion.accdb la ruta hace referencia a que el archivo de Access está en la misma ruta que el ejecutable de la aplicación. También podemos poner una ruta del disco duro como C:\DbInscripcion.accdb pero si queremos que nuestra aplicación pueda ser portable nos sirve de mejor manera la primera forma.

Una vez ejecutada la aplicación agrega los datos con éxito.

clip_image030

Y verificamos si realmente ha agregado a la base de datos nuestro nuevo alumno, sin embargo como el archivo Access está dentro de nuestra solución. Cuando se genera el ejecutable también se copia el archivo y es ahí donde inserta nuestros datos y no el archivo que está en nuestro proyecto. Es decir está en la carpeta bin\debug

clip_image032

clip_image034

Abrimos el archivo que está junto con el ejecutable y veremos que ahí se encuntra nuestro datos ingresados.

clip_image036

Conclusión

Para ingresar datos y obtenerlos de un archivo de Access no hay mayor dificultad que decirle donde esta nuestro archivo. También tenemos que cuidar que nuestro archivo solo puede ser accedido por una aplicación y no por múltiples aplicaciones o instancias de nuestra aplicación al mismo tiempo.

Urlgrafía.

http://www.conectionstring.org

Editado

Les dejo el codigo fuente del ejemplos aca
Codigo Fuente

33 comentarios

  1. Los números de 2010 « Blog de Giovanni Callisaya said,

    […] Conexiones .Net Con Access 2007 o 2010 noviembre, 2010 4 […]

  2. Rafa Reyes said,

    PANA CUANDO LO CORRO Y LE DOY AL BOTON PARA PROBAR LA CONEXION ME DICE QUE NO ENCUENTRA ESTO:

    |DataDirectory|\DbDescription.accdb;Persist Security Info=TruE

  3. Rafa Reyes said,

    COPIE EXACTAENTE EL CODIGO COMO LO PUSISTE EN LA FOTO Y CUANDO INTENTO METER DATOS ME SALE ESTO

    {«Error al convertir el valor del parámetro de TextBox a String.»}

    Y ME PONE EN AMARILLO LA PARTE DEL CODIGO donde declaro int resultado..

    • Giovanni Vladimir said,

      Creo que no estas cambiando el tipo en el texbox a string. en la edad. tiene que ser txtedad.text

  4. Rafa Reyes said,

    private void btnGuardar_Click(object sender, EventArgs e)
    {
    OleDbConnection conex = new OleDbConnection();
    conex.ConnectionString = @»Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\r\Documents\Visual Studio 2010\Base de Datos\dbprueba1.accdb»;

    OleDbCommand cmd = new OleDbCommand();
    cmd.Connection = conex;
    cmd.CommandText = «INSERT into ALUMNO (ID,Nombre,Direccion,Edad) values(@ID,@Nombre,@Direccion,@Edad)»;
    cmd.Parameters.Add(«@ID», OleDbType.VarChar, 10).Value = txtID;
    cmd.Parameters.Add(«@Nombre», OleDbType.VarChar, 200).Value = txtNombre;
    cmd.Parameters.Add(«@Direccion», OleDbType.VarChar, 200).Value = txtDireccion;
    cmd.Parameters.Add(«@Edad», OleDbType.Integer).Value = Convert.ToInt32(txtEdad.Text);

    conex.Open();

    int resultado = cmd.ExecuteNonQuery(); //ejecuta una sentencia SQL contra la base de datos y devuelve el nro de registros afectados

    conex.Close();

    if (resultado > 0)// si al menos un registro resulto afectado
    MessageBox.Show(«datos ingresados con exito»);
    else
    MessageBox.Show(«No se ingresaro datos»);

    cmd.Parameters.Clear();

    }

    ahi esta el codigo … y me pone en amarillo esta parte

    int resultado = cmd.ExecuteNonQuery();

    • Giovanni Vladimir said,

      te envio el codigo fuente y espero que te sirva

    • Giovanni Vladimir said,

      umm lo que pasa es que no esta afectando a ninguna fila o bien el archivo accsess esta siendo usado por otra aplicacion o no esta bien direccionado pero, dejo el codigo fuente del proyecto para que revises en articulo.

    • Daniel Albarracín said,

      El problema que tiens en el código es que estas llamando al archivo de access desde una ruta que visual no interpreta debido a los permisos de usuario, si colocas el archivo por ejemplola ruta: ..C:\dbprueba1.accdb;Persist Security Info=False»; si te funcionará. Mi recomendación en este caso es que alojes el archivo de tu proyecto directamente a C:\ y en tu proyecto colocas la ruta como te explique pero con las carpetas adicionales que anticipan la dirección del archivo. Comenta los resultados a ver como te va

      • Daniel Albarracín said,

        Por cierto, lo que explico está referido a un archivo access sin contraseña (;Persist Security Info=False;), en caso de tener una contraseña solo colocasrias «..JET OLEDB:Database Password=tuclave»; y no colocas el Persist Security en falso porque sino le dices al compilador que interprete la conexión sin clave. Espero serva mi aporte, cualquier duda pienses en pedirla

  5. Mario said,

    Mira soy nuevo en C# no se como conectarlo, si podes enviarme la fuente para verlo, soy de la vieja escuela de turbo C y VB 6.0
    Saludos.

    • Yuke Ishida said,

      Hola!!! primero que todo te doy las gracias por este ejemplo, me ayudo bastante , per tengo un pequeño problema, resulta que el cuando abro el programa, escribo los datos, y a la hora de presionar el boton grabar, me sale un error que dice asi : » Error de sintaxis en la instrucción INSERT INTO.» que puede ser, te cuento que el acces esta en español y el visual studio en ingles, seria de gran ayuda si me pedes ayudar con este problema, gracias!!!!!

  6. Mario said,

    A te dejo mi correo por las dudas
    mmalfaro64@hotmail.com

    • Giovanni Vladimir said,

      ya ten envie el link dodnde esta el codigo fuente pero tambien esta al final del articulo. esta en skydrive solo tienes que descargalo.

  7. Marco said,

    Buenas, fijate que ya lo hice, cuando estoy dentro del programa si hace como que agrega o modifica registros, pero si reinicio la aplicacion y reviso el access , no refleja ningun cambio que se supone debio hacer, alguna sugerencia?

    • Giovanni Vladimir said,

      um lo que pasa es que cuando se compila de nuevo, el archivo q esta en el Explorador de solucion el de Access se vuelve a compiar al directorio bin y remplaza el anterior donde introdujiste los datos. si te creas un instalador veras que los datos persiste pq ya no habra remplazo en la compilacion. espero que te sirva y cualquier duda me avisas

      • Joaquin said,

        men como es eso de crear un instalador???? me pasa lo mismo que a Marco

      • Giovanni Vladimir said,

        Lo que pasa es el archivos de access podemo colocarlo dentro de nuestro proyecto como en ejemplo y cada ves que se compila este archivo se copia a la ruta del bin junto con el exe del proyecto, como cada ves que ejecutamos vuelve a copiar el access no aparece los datos que en una corrida previa pusimos esto se debe por el copiado que ocurre cada ves que compilamos. ya que cuando se ejcuta el exe no lee los datos del archivo que esta en el proyecto si no del bin y como cada ves es nuevo se remplaza. pero cuando llevemos nuestro poryecto en habiente real ya no se compilara mas pq se supone que lo llevas compilado y ya no habra borrado de datos, si no queremos que se borren los datos,en ves de llamar desde nuestro proyecto podemos direccionar la cadena de conexion a una ruta fisica asi no se borraria los datos cada ves que compilamos el proyecto.

  8. Mariano Arredondo said,

    estoy haciendo una aplicacion pero no es .cs sinó .vs
    donde puedo encontrar esta informacion equivalente.
    por favor estoy desesperado

    Mariano

    • Mariano Arredondo said,

      quise decir .vb

      gracias

      • Giovanni Vladimir said,

        Casi es el mismo codigo o varia en casi nada lo que puedes hacer es buscar la equivalencia en codigo por ejemplo.
        Si uso int x; tu usar Dim x as Integer, y asi vas cambiando de a poco intentalo y veras que es mas facil de lo que parece.

  9. roger said,

    Muchas gracias me sirvió muchísimo

  10. samzalem said,

    En la parte de cone.Open(); me da el error de «No se pudo encontrar el archivo ‘C:\examen\Prueba\Prueba\bin\Debug\Prueba.accdb’.»
    pero allí está, en esa dirección, la dirección es la correcta, todo parece que no es un error de dirección.

    ¿Alguien sabe que podría ser?

    • Giovanni Vladimir said,

      Sí estas en win vista o 7 te va dar ese error pq tú aplicación no tiene permisos para escribir en la unidad c. Cambia de unidad a la d y seguro funciona

  11. Reynaldo said,

    Como Elimino los Datos y Actualizo

  12. Reynaldo said,

    Como Elimino los Datos y chequeo los datos en mi programa…..

  13. rullo said,

    hola una pregunta me dice que el provider.microsoft no esta registrado me da error tengo el acces 2010 ya intale un componente engine_64. que es para acces y me sigue dando ese error nose que se si alguien me puede ayudar……

  14. Isaias Torres Martinez said,

    Gracias Bro. me sirvio mucho muy entendible todo y gracias tanbien al Daniel Albarracín me resolvio un error a la hora de compilar :S jjaja
    saludos 😉

  15. ALFREDO said,

    Tengo una base de datos realizada con acces 2003 y ahora cuando intento ejecutarla en acces 2010 solo me funcionan algunas cosas, en otras me dice lo siguiente: en el visual basic para aplicaciones, no se puede encontrar el proyecto o la biblioteca. ¿como puedo meter las bibliotecas que tengo en acces de 2003 en acces 2010?

    muchas gracias.

  16. Hannis said,

    es un buen ejemplo a mi si me funciono y ya no tengo problemas para conectar una base de datos, ese boton de probar ayuda bastante, si no no continuas, debo hacer una consulta, en la que busque un registro especifico que inserte en un text y se compare con la base de datos, si lo encuentra, que se muestre en un datagridview pero hasta ahora no lo he logrado, aparece pero toda la tabla no el que busco estoy trabajando con access 2007 y c# 2010, agradezco de antemano su colaboración…

  17. DMENDEZ said,

    using System.Text;
    using System.Windows.Forms;
    using System.Data.OleDb;
    using System.Data;

    namespace WindowsFormsApplication10
    {
    public partial class Form1 : Form
    {
    OleDbConnection conexion;
    public Form1()
    {

    conexion = new OleDbConnection(«Provider=Microsft.ACE.OLEDB.4.O;Data source= \\base de datos profesor»);
    InitializeComponent();
    }
    public void INSERTAR()
    {
    try
    {
    int id = int.Parse(idTextBox.Text);
    string nombres = nombresTextBox.Text;
    string apellidos = apellidosTextBox.Text;

    string q = «INSERT INTO datos general(id,nombres,apellidos)VALUES(@id,@nombres,@apellidos)»;
    OleDbCommand comando = new OleDbCommand(q, conexion);

    comando.Parameters.Add(new OleDbParameter(«@id», OleDbType.VarChar, 20));
    comando.Parameters[«id»].Value = id;

    comando.Parameters.Add(new OleDbParameter(«@nombres», OleDbType.VarChar, 20));
    comando.Parameters[«nombres»].Value = nombresTextBox.Text;

    comando.Parameters.Add(new OleDbParameter(«@apellidos», OleDbType.VarChar, 20));
    comando.Parameters[«apellidos»].Value = apellidosTextBox.Text;

    comando.Connection.Open();
    comando.ExecuteNonQuery();
    comando.Connection.Close();

    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    conexion.Close();
    }
    }

    private void datos_generalBindingNavigatorSaveItem_Click(object sender, EventArgs e)
    {
    this.Validate();
    this.datos_generalBindingSource.EndEdit();
    this.tableAdapterManager.UpdateAll(this.base_de_datos_profesorDataSet);

    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {
    INSERTAR();
    }

    private void button2_Click(object sender, EventArgs e)
    {
    idTextBox.Clear();
    nombresTextBox.Clear();
    apellidosTextBox.Clear();
    nombresTextBox.Focus();
    }

    private void idTextBox_TextChanged(object sender, EventArgs e)
    {

    }
    }
    }

    AYUDENME NO MEDEJA INGRESAR LOS DATOS EN LA BASE DE DATOS ME DA UN ERROR OLEDBPARAMETER COLLETION NO CONTIENE CON PARAMETER NAME ID ME PODRIAN AYUDAR PORFA

  18. alberto said,

    hola, tengo un problema soy nuevo en esto hice el ejemplo de conectar una base de datos access 2007 con csharp pero no la conecta si alguien me puede ayudar no se si la directiva»provider=microsoft.ace.oledb.12.0; no la toma.

  19. Kar said,

    Oye me marca error en mis txt dice que no existe en el contexto actual!!! Que puedo hacer??

  20. Kar said,

    Porfa responde!!!

Replica a Giovanni Vladimir Cancelar la respuesta