26 de enero de 2012

C# - ACCESS

Conexión a la base de datos ACCESS desde C#     

Usaré para la conexión una base de datos en ACCESS 2007 llamada img, en donde se mostrarán los datos de la tabla imagen, cuyos campos son nombre_foto, comentarios y ruta_foto:




Aquí se usará el mismo proceso para crear nuestra cadena de conexión y así tenerla en el app.config, esto es: dar click derecho sobre nuestro proyecto en el Solution Explorer, escoger propiedades y luego la pestaña Settings, modificando los valores a fin que queden tal como se ve:






y el app.config quedará así:

xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
    configSections>
    <connectionStrings>
        <add name="cnn" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Documents and Settings\XXXX\Escritorio\img.accdb"
            providerName="System.Data.OleDb" />
    connectionStrings>
configuration>

es importante que el nombre sea solo cnn, si tiene algo mas agregado por parte del VS hay que quitarlo, además modificamos un poco el form para que los datos de la tabla se muestren en un DataGridView, en los Textbox correspondientes y movilizarce a través de ellos utilizando un BindingNavigator, el formulario queda así:


ahora no usaremos modulo pues estos no existen en C# ni tampoco usaremos una clase, mas bien añadiremos la referencia System.Configuration a nuestro proyecto y trabajaremos el cargado de los datos desde el evento Load del formulario, luego el código del form quedaría así:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using System.Configuration;

namespace ACCESS_C__
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        OleDbConnection conn;   
        DataTable dt;
            OleDbDataAdapter da;
            BindingSource bs;
           
            private void Form1_Load(object sender, EventArgs e)
            {
                string miCadenaConexion = System.Configuration.ConfigurationManager.ConnectionStrings["cnn"].ConnectionString;
                using (conn =
                       new OleDbConnection(miCadenaConexion))
                {
                    //cnn=new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source= C:\Documents and Settings\Pablo\Escritorio\img.accdb");
                    da = new OleDbDataAdapter("select * from imagen", conn);
                    dt = new DataTable("imagen");
                    da.Fill(dt);
                    bs = new BindingSource();
                    bs.DataSource = dt;
                    bindingNavigator1.BindingSource = bs;
                    dataGridView1.DataSource = bs;
                    textBox1.DataBindings.Add("text", bs, "nombre_foto");
                    textBox2.DataBindings.Add("text", bs, "comentarios");
                    textBox3.DataBindings.Add("text", bs, "ruta_foto");
                }}}}

Compilamos, ejecutamos y ya.






 ACME sobre la base de datos ACCESS desde C#     

Siempre sobre el mismo proyecto creado anteriormente y usando el mismo string de conexion guardado en el app.config del proyecto, lo diferente esta vez será que usare una clase para conectarnos a la base de datos en ACCESS y además haremos el ACME(Actualizar, Consultar, Modificar y Eliminar) hacia el mismo archivo en ACCESS, para esto vamos a añadir una nueva clase al proyecto, así que damos click derecho al proyecto en el Solution Explorer, seleccionamos Add y luego Class


ahora, dentro de esta clase, copiamos el siguiente código:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.OleDb;
using System.Configuration;
using System.Windows.Forms;
namespace ACCESS_C__
{
    class conexion
    {
   OleDbConnection cnn;
   OleDbCommand cmd;
   DataTable dt;
   OleDbDataAdapter da;
   string cadena=System.Configuration.ConfigurationManager.ConnectionStrings["cnn"].ConnectionString;
       

        public DataTable CargarDatos()

{
    using (cnn = new OleDbConnection(cadena))
    {
        da = new OleDbDataAdapter("select * from imagen", cnn);
        dt = new DataTable();
        da.Fill(dt);
        return dt;
    }   
   }
     
       public void InsertarDatos(string val1, string val2, string val3){
            cmd = new OleDbCommand();

            cnn = new OleDbConnection(cadena);
            cnn.Open();
                cmd.Connection = cnn;
                cmd.CommandText = "insert into imagen(nombre_foto, comentarios, ruta_foto) values (@nf, @cm, @rf)";
                cmd.Parameters.AddWithValue("@nf", val1);
                cmd.Parameters.AddWithValue("@cm", val2);
                cmd.Parameters.AddWithValue("rf", val3);
                cmd.ExecuteNonQuery();
                MessageBox.Show("ingresados correcatmente");
                cnn.Close();
                cmd.Dispose();
                }

       public void EiminarDato(string val1) {
           cmd = new OleDbCommand();
           cnn = new OleDbConnection(cadena);
           cnn.Open();
           cmd.CommandText="delete from imagen where @id=id";
           cmd.Connection = cnn;
           cmd.Parameters.AddWithValue("@id", val1);
           cmd.ExecuteNonQuery();
           MessageBox.Show("eliminado correctamente");
           cnn.Close();
           cmd.Dispose();
       }

       public void modificardatos(string val1, string val2, string val3, string val4)
       {
           cnn = new OleDbConnection(cadena);
           cmd=new OleDbCommand();
           cnn.Open();
           cmd.Connection = cnn;
           cmd.CommandText = "update imagen set nombre_foto=@nf, comentarios=@com, ruta_foto=@rf where id=@id";
           cmd.Parameters.AddWithValue("@nf", val1);
           cmd.Parameters.AddWithValue("@com", val2);
           cmd.Parameters.AddWithValue("@rf", val3);
           cmd.Parameters.AddWithValue("id", val4);
           cmd.ExecuteNonQuery();
           MessageBox.Show("dato modicado correctamente");
           cnn.Close();
           cmd.Dispose();
       }}}



también se modifico el formulario, agregándole botones representativos  para realizar las operaciones sobre la base de datos, el diseño y el código correspondiente quedo así:



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using System.Configuration;
using System.Windows.Forms;

namespace ACCESS_C__
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        OleDbConnection conn;   
        DataTable dt;
            OleDbDataAdapter da;
            BindingSource bs;
        conexion clase= new conexion();
           
            private void Form1_Load(object sender, EventArgs e)
            {

                cargando();
     
            void cargando()
            {
                bs = new BindingSource();
                bs.DataSource = clase.CargarDatos();
                dataGridView1.DataSource = bs;
                bindingNavigator1.BindingSource = bs;
                textBox1.DataBindings.Clear();
                textBox2.DataBindings.Clear();
                textBox3.DataBindings.Clear();
                textBox4.DataBindings.Clear();
                textBox1.DataBindings.Add("text", bs, "nombre_foto");
                textBox2.DataBindings.Add("text", bs, "comentarios");
                textBox3.DataBindings.Add("text", bs, "ruta_foto");
                textBox4.DataBindings.Add("text", bs, "id");
            }



            private void Insertar_Click(object sender, EventArgs e)
            {
                clase.InsertarDatos(textBox1.Text, textBox2.Text, textBox3.Text);
                cargando();
            }

            private void Eliminar_Click(object sender, EventArgs e)
            {
                clase.EiminarDato(textBox4.Text);
                cargando();
            }

            private void bmodificar_Click(object sender, EventArgs e)
            {
                clase.modificardatos(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text);
                cargando();
            }}}



Compilamos, ejecutamos y ya.