miércoles, 12 de junio de 2013

Cargar progressbar en WPF








Código C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace progressbarwpf
{
    /// <summary>
    /// Lógica de interacción para MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
           //llamada al método cargar_barra() para cargar el progressbar
            cargar_barra();
        }

        //se crea un delegado que permita utilizar un método
        //para actualizar el valor del progressbar
        private delegate void DelegadoActualizaProgressBar(System.Windows.DependencyProperty dp, Object valor);

        //método para cargar el progressbar
        private void cargar_barra()
        {
            //Configuración del ProgressBar
            progressBar1.Minimum = 0;//valor mínimo (inicio de la barra de carga)
            progressBar1.Maximum = 100;//valor máximo(hasta donde se carga, como ejemplo 100)
            progressBar1.Value = 0;//valor de inicio

            //almacenamos el valor del progressbar con la siguiente variable
            double valor = 0;

           //creamos una nueva instancia del delegado  del progressbar
           //que apunte al método que actualiza el valor del progressbar
            DelegadoActualizaProgressBar DelegadoActualizaPB = new DelegadoActualizaProgressBar(progressBar1.SetValue);
           
            //ciclo cerrado: se cicla hasta que el progressbar alcanza el valor máximo
            do
            {
                //incrementamos en 1 a valor
                valor += 1;

                /*se actualiza el valor d el progressbar
                 a) se llama al delegado que actualiza el valor del progressbar
                 b) se asina como prioridad del despachador al background
                 c) se pasa la variable valor al array que contiene la propiedad para actualizar el progressbar */
                           
                Dispatcher.Invoke(DelegadoActualizaPB,
                    System.Windows.Threading.DispatcherPriority.Background,
                    new object[] { ProgressBar.ValueProperty, valor });
            }
            //terminará de ciclar cuando el valor del progressbar
            //sea igual al valor máximo definido previamente
            while (progressBar1.Value != progressBar1.Maximum);
        }

    }
}


Código XAML
<Window x:Class="progressbarwpf.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ProgressBar Height="28" HorizontalAlignment="Left" Margin="29,95,0,0"
                     Name="progressBar1" VerticalAlignment="Top" Width="449" />
        <Button Content="Cargar" Height="23" HorizontalAlignment="Left" Margin="181,185,0,0"
                Name="button1" VerticalAlignment="Top" Width="118" Click="button1_Click" />
    </Grid>
</Window>


Si se desea cargar la barra de manera progresiva el código puede ser el siguiente, en el cual la barra aumenta su valor en 10 cada vez que se presiona el botón “Aumentar progressbar”, al finalizar la carga muestra un mensaje.
Código C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace progressbarwpf
{
    /// <summary>
    /// Lógica de interacción para MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            //llamada al método aumenta_progressbar() para
            //aumentar el valor del progressbar
            aumenta_progressbar();
        }
       public  double valor = 0;
        //se crea un delegado que permita utilizar un método
        //para actualizar el valor del progressbar
        private delegate void DelegadoActualizaProgressBar(System.Windows.DependencyProperty dp, Object valor);
        //metodo para configurar el progressbar se llama en el evento loaded de la forma
       public void configura_progressbar()
       {
           //Configuración del ProgressBar
           progressBar1.Minimum = 0;//valor mínimo (inicio de la barra de carga)
           progressBar1.Maximum = 100;//valor máximo(hasta donde se carga, como ejemplo 100)
           progressBar1.Value = 0;//valor de inicio

           //almacenamos el valor del progressbar con la siguiente variable
        

          
       }
        //método para aumentar gradualmente el valor del progressbar 
        public void aumenta_progressbar()
        {
            //creamos una nueva instancia del delegado  del progressbar
            //que apunte al método que actualiza el valor del progressbar
            DelegadoActualizaProgressBar DelegadoActualizaPB = new DelegadoActualizaProgressBar(progressBar1.SetValue);//incrementamos en 1 a valor
            valor += 10;

            /*se actualiza el valor d el progressbar
             a) se llama al delegado que actualiza el valor del progressbar
             b) se asina como prioridad del despachador al background
             c) se pasa la variable valor al array que contiene la propiedad para actualizar el progressbar */

            Dispatcher.Invoke(DelegadoActualizaPB,
                System.Windows.Threading.DispatcherPriority.Background,
                new object[] { ProgressBar.ValueProperty, valor });
            //si llega al máximo mostramos un mensaje
            if (progressBar1.Value==progressBar1.Maximum)
            {
                MessageBox.Show("Barra cargada totalente");
            }
        }
        //evento loaded de la forma
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //lamada al método configura_progressbar()
            //para configurar el progressbar
            configura_progressbar();
        }
    }
}


Código XAML
<Window x:Class="progressbarwpf.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
    <Grid>
        <ProgressBar Height="28" HorizontalAlignment="Left" Margin="29,95,0,0"
                     Name="progressBar1" VerticalAlignment="Top" Width="449"  />
        <Button Content="Aumentar progressbar" Height="23" HorizontalAlignment="Left" Margin="159,184,0,0"
                Name="button1" VerticalAlignment="Top" Width="161" Click="button1_Click" />
    </Grid>
</Window>



lunes, 10 de junio de 2013

Ejecutar un procedimiento almacenado de SQL Server desde C#

Para explicar este tema se creó una sencilla aplicación de formas en Visual Studio utilizando C#, también se creó una base de datos que cuenta con tres tablas y un procedimiento almacenado para de acuerdo a las variables que recibe el parámetro realice un insert en alguna de las tablas.
El procedimiento almacenado comparará al variable edad y dependiendo de ella insertará a la persona en la tabla debida, además retorna una variable  de comprobación para asegurar que la operación fue satisfactoria.

Realizando una prueba.

Cuando ocurre un error: en este ejercicio pueden surgir varios pues no se validan los datos que se envían al procedimiento almacenado.
 Cuando la operación fue satisfactoria:

Comprobación de la inserción en SQL Server


Diseño  de la forma:

Elementos del combobox:


Código de la aplicación:
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.SqlClient;//libreria para manejar sql

namespace Personal
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnguardar_Click(object sender, EventArgs e)
        {
            //declaramos una cadena de conexión con los datos de nuestro
            //manejador y la base de datos
            string cadenaconexion = @"Data Source=HUGUITO-PC\HUGO;Initial Catalog=Prueba;Integrated Security=True";
            //una variable boleana para determinar si se realizó la operación
            //que realiza el procedimiento almacenado, la inicializamos como false
            bool success = false;
            //declrarmos la conexión
            SqlConnection LaConexion = null;
            //declaramos una transacción para que todo lo que se realiza en ella, desde una
            //simple inserción hasta multiples o, que involucren más operaciones sobre la
            //base de datos puedan deshacerse si se presenta un error
            SqlTransaction LaTransaccion = null;
            //variable para el valor de retorno
            int Valor_Retornado = 0;
            //iniciamos un try catch
            try
            {
                //seguimos con la conexion
                LaConexion = new SqlConnection();
                //asignamos a la conexión la cadena de conexión que declaramos anteriormente
                LaConexion.ConnectionString = cadenaconexion;
                //se abre la conexión
                LaConexion.Open();
                //se inicia la transacción
                LaTransaccion = LaConexion.BeginTransaction(System.Data.IsolationLevel.Serializable);
                //especificamos el comando, en este caso el nombre del Procedimiento Almacenado
                SqlCommand comando = new SqlCommand("SPPersonal", LaConexion, LaTransaccion);
                //se indica al tipo de comando que es de tipo procedimiento almacenado
                comando.CommandType = CommandType.StoredProcedure;
                //se limpian los parámetros
                comando.Parameters.Clear();
                //comenzamos a mandar cada uno de los parámetros, deben de enviarse en el
                //tipo de datos que coincida en sql server por ejemplo c# es string en sql server es varchar()
                comando.Parameters.AddWithValue("@Nombre", txtnombre.Text);
                comando.Parameters.AddWithValue("@Apellp", txtapellp.Text);
                comando.Parameters.AddWithValue("@Apellm", txtapellm.Text);
                comando.Parameters.AddWithValue("@Edad",Convert.ToInt32(txtedad.Text));
                comando.Parameters.AddWithValue("@Sexo", cboxsexo.SelectedItem);
                //declaramos el parámetro de retorno
                SqlParameter ValorRetorno = new SqlParameter("@Comprobacion", SqlDbType.Int);
                //asignamos el valor de retorno
                ValorRetorno.Direction = ParameterDirection.Output;
                comando.Parameters.Add(ValorRetorno);
                //executamos la consulta
                comando.ExecuteNonQuery();
                // traemos el valor de retorno
                Valor_Retornado = Convert.ToInt32(ValorRetorno.Value);
                //dependiendo del valor de retorno se asigna la variable success
                //si el procedimiento retorna un 1 la operación se realizó con éxito
                //de no ser así se mantiene en false y pr lo tanto falló la operación
                if (Valor_Retornado ==1)
                    success = true;
           }
            catch (Exception)
            {
                //al ocurrir un error mostramos un mensaje
                MessageBox.Show("Error en la operación", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
               //si el procedimeinto se efectuó con éxito
                if (success)
                {
                    //se realiza la transacción
                    LaTransaccion.Commit();
                    //cerramos la conexión
                    LaConexion.Close();
                    //mensaje de operación satisfactoria
                    MessageBox.Show("Persona guardada\nsatisfactoriamente", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                    //si se presentó algun error
                else
                {
                    //se deshace la transacción
                    LaTransaccion.Rollback();
                    //cerramos la conexión
                    LaConexion.Close();
                }
            }
        }


    }
}


Base de datos con las tres tablas y el procedimiento almacenado:

create database Prueba
go
use Prueba
go

create table Menores
(
ID_Menores int primary key identity(1,1),
Nombre_M varchar(30) not null,
Apellp_M varchar(20) not null,
Apellm_M varchar(20) not null,
Sexo_M char(1) not null,
Fecha_Reg_M date not null
)

create table Adultos
(
ID_Adutos int primary key identity(1,1),
Nombre_A varchar(30) not null,
Apellp_A varchar(20) not null,
Apellm_A varchar(20) not null,
Sexo_A char(1) not null,
Fecha_Reg_A date not null
)

create table Adulto_Mayor
(
ID_Mayores int primary key identity(1,1),
Nombre_AM varchar(30) not null,
Apellp_AM varchar(20) not null,
Apellm_AM varchar(20) not null,
Sexo_AM char(1) not null,
Fecha_Reg_AM date not null
)
create procedure SPPersonal
(
@Nombre varchar(30),
@Apellp varchar(20),
@Apellm varchar(20),
@Edad int,
@Sexo char(1),
@Comprobacion int output
)
as
begin
--inicia la transacción
begin transaction
--inician las comparaciones de edad para determinar donde insertar a la persona
--si existe un error al insertar se pasa  a la parte de error
      if(@Edad<18)
      begin
            INSERT INTO Menores(Nombre_M,Apellp_M,Apellm_M,Sexo_M,Fecha_Reg_M)VALUES(@Nombre,@Apellp,@Apellm,@Sexo,GETDATE())
            if @@ERROR>0
            goto error
      end
      else if(@Edad>=18 and @Edad<65)
      begin
            INSERT INTO Adultos(Nombre_A,Apellp_A,Apellm_A,Sexo_A,Fecha_Reg_A)VALUES(@Nombre,@Apellp,@Apellm,@Sexo,GETDATE())
            if @@ERROR>0
            goto error
      end
      else if(@Edad>=65)
      begin
            INSERT INTO Menores(Nombre_M,Apellp_M,Apellm_M,Sexo_M,Fecha_Reg_M)VALUES(@Nombre,@Apellp,@Apellm,@Sexo,GETDATE())
            if @@ERROR>0
            goto error
      end
      --si no hubo errores se termina la transacción y se asigna a @Comprobacion el valor de 1
      --para indicar en c# que fue exitosa la operación
      commit transaction
      set @Comprobacion=1
      return
--si hubo algún error se deshace la transacción y se asigna a @Comprobación el valor de 0
--para indicar en c# que hubo un error

error:     
rollback transaction
set @Comprobacion=0
end