26 de julio de 2012

Clase ACME en C# -SQL sin SP

Se creara una clase en C# para Actualizar, Modificar, Consultar y Eliminar datos (ACME) sin utilizar procedimientos almacenados, para esto en mi caso me conectare a una base de datos llamada sistema, que contiene una tabla llamada empleado, con tres campos a utilizar: dui(PK), nombres y cargo, por otro lado solo comentarles que este mismo ejemplo codificado en VB esta en este link:  http://pabletoreto.blogspot.com/2012/07/clase-acme-en-vb.html

Ustedes pueden utilizar la base que quieran para probar el ejemplo, lo único a tener en cuenta es que se utilizara un app.config para guardar los datos de la cadena de conexión así que en caso no sepan como hacerlo sera útil que vean esta entrada sobre el app.config:   http://pabletoreto.blogspot.com/search/label/App.Config

Logrando lo anterior, mi app.config queda de la siguiente manera, con el nombre: conexión, servidor local y  base de datos: sistema 


<connectionStrings>
        <add name="conexion" connectionString="Data Source=.\LINGONET;Initial Catalog=sistema;Integrated Security=True"
            providerName="System.Data.SqlClient" />
    connectionStrings>

ahora se debe agregar una clase a nuestro proyecto de C#, en mi caso llame a la clase ACME, se importaran los siguientes espacios de nombre

using System.Data.SqlClient;
using System.Configuration;


y se declaran las variables necesarias estableciendo la cadena de conexión:

SqlConnection sql = new SqlConnection(ConfigurationManager.ConnectionStrings["conexion"].ConnectionString);
        SqlCommand cmd;
        DataTable dt;
        SqlDataAdapter da;
        BindingSource bs;


Ahora viene la parte del ACME, recuerden que el dui es PK y que se trabaja en una tabla llamada empleado sobre los campos dui, nombres y cargo, ademas que no se utilizan procedimientos almacenados sino mas bien se "carga" la sentencia sql en cada función dependiendo de los datos que reciba

En todas las funciones se utiliza un Try-Catch para manejar la cadena de conexión, se utiliza el command en la variable cmd (cmd = new SqlCommand) que recibe los datos por parámetros y el cual al final de la instrucción es destruido 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Windows.Forms;

namespace ACME_C
{

    class ACME
   
    {
        SqlConnection sql = new SqlConnection(ConfigurationManager.ConnectionStrings["conexion"].ConnectionString);
        SqlCommand cmd;
        DataTable dt;
        SqlDataAdapter da;
        BindingSource bs;


        public void AgregarDatos(string dui, string nombres, string cargo) {
            try {
                sql.Open();
                cmd = new SqlCommand();
                cmd.Connection = sql;
                cmd.CommandText = "insert into empleado(dui, nombres, cargo) values (@dui, @nombres,@cargo)";
                cmd.Parameters.AddWithValue("@dui", dui);
                cmd.Parameters.AddWithValue("@nombres", nombres);
                cmd.Parameters.AddWithValue("@cargo", cargo);
                cmd.ExecuteNonQuery();
                sql.Close();
                cmd.Dispose();
                MessageBox.Show("datos ingresados exitosamente");
                        }
        catch(Exception e){
            MessageBox.Show(e.Message);
        }
        }
       
       
        public void ModificarDatos(string dui, string nombres, string cargo){
   try{
       sql.Open();
       cmd= new SqlCommand();
       cmd.Connection = sql;
       cmd.CommandText = "update empleado set nombres=@nombres, cargo=@cargo where dui=@dui";
       cmd.Parameters.AddWithValue("@dui", dui);
       cmd.Parameters.AddWithValue("@nombres", nombres);
       cmd.Parameters.AddWithValue("@cargo", cargo);
       cmd.ExecuteNonQuery();
       MessageBox.Show("Datos actualizados correctamente");
       sql.Close();
       cmd.Dispose();
   }
        catch (Exception e){
            MessageBox.Show(e.Message);
        }
    }


        public BindingSource Consultardatos() {
            try
            {
                sql.Open();
                da = new SqlDataAdapter("select dui, nombres, cargo from empleado", sql);
                dt = new DataTable();
                bs = new BindingSource();
                da.Fill(dt);
                bs.DataSource = dt;
                sql.Close();
                cmd.Dispose();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
            return bs;
       
        }


        public void EliminarDatos(string dui) {
            try
            {
                sql.Open();
                cmd = new SqlCommand();
                cmd.Connection = sql;
                cmd.CommandText = "delete from empleado where dui=@dui";
                cmd.Parameters.AddWithValue("@dui", dui);
                cmd.ExecuteNonQuery();
                MessageBox.Show("Datos eliminados correctamente");
                sql.Close();
                cmd.Dispose();
            }
            catch(Exception e) {
                MessageBox.Show(e.Message);
            }
        }    }    }

ahora viene la parte del formulario, en mi caso le llame ACME_C.cs y esta es la apariencia, tiene un DataGridView, un BindingNavigator, 4 botones con las funciones ACME y tres textbox para los campos de la tabla que se van a utilizar



y ahora el codigo del formulario, notese que se cargan los datos en el DataGridView y se enlanzan tanto en los textbox como en el bindingNavigator al cargar el formulario y cada vez que se realiza una accion del ACME, esto lo hace el metodo mostrar() asi:

private void mostrar() {
            bs = new BindingSource();
            bs.DataSource = clase.Consultardatos();
            dataGridView1.DataSource = bs;
            bindingNavigator1.BindingSource = bs;
            DUIText.DataBindings.Clear();
            DUIText.DataBindings.Add(new Binding("text", bs, "dui"));
            Nombrestext.DataBindings.Clear();
            Nombrestext.DataBindings.Add(new Binding("text", bs, "nombres"));
            Cargotext.DataBindings.Clear();
            Cargotext.DataBindings.Add(new Binding("text", bs, "cargo"));
        }

bueno, sin mas, aquí esta el código del formulario:

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;

namespace ACME_C
{
    public partial class Form1 : Form
    {
        ACME clase = new ACME();
        BindingSource bs;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            mostrar();
        }
       
       
       
        private void ModificarDatos_Click(object sender, EventArgs e)
        {
            clase.ModificarDatos(DUIText.Text, Nombrestext.Text, Cargotext.Text);
            mostrar();
        }

        private void AgregarDatos_Click(object sender, EventArgs e)
        {
            clase.AgregarDatos(DUIText.Text, Nombrestext.Text, Cargotext.Text);
            mostrar();
        }

        private void EliminarDatos_Click(object sender, EventArgs e)
        {
            clase.EliminarDatos(DUIText.Text);
            mostrar();
        }

        private void mostrar() {
            bs = new BindingSource();
            bs.DataSource = clase.Consultardatos();
            dataGridView1.DataSource = bs;
            bindingNavigator1.BindingSource = bs;
            DUIText.DataBindings.Clear();
            DUIText.DataBindings.Add(new Binding("text", bs, "dui"));
            Nombrestext.DataBindings.Clear();
            Nombrestext.DataBindings.Add(new Binding("text", bs, "nombres"));
            Cargotext.DataBindings.Clear();
            Cargotext.DataBindings.Add(new Binding("text", bs, "cargo"));
        }
       
    }
}



eso es todo :)