jueves, 25 de octubre de 2012

[C#] Monitoreando una IP con un Timer

 

Introducción:

Una tarea bastante solicitada en el desarrollo de una aplicación, es necesitar que un bloque de código se ejecute durante X cantidad de veces; ya sea para monitorear el estado de un servicio web, estar revisando un valor en base de datos, estar esperando a que se copie un archivo en una ubicación X, entre otras cosas …

En este caso vamos a realizar una aplicación de consola que encargue de monitorear cada segundo si una IP se encuentra accesible en terminos de red.

El framework de .net nos ofrece un excelente objeto llamado timer para realizar esta tarea (digo excelente por que es de los objetos que mas me gusta utilizar).

Está es la documentación oficial:

Timer (Clase)

Creando el objeto timer

Sólo necesitamos modificar dos cosas del timer para ponerlo a funcionar:

  • Modificar el atrubuto Interval que cómo mencionan los libros en linea:

“Obtiene o establece el intervalo en el que se provoca el evento Elapsed.”

  • Agregar el evento Elapsed que respectivamente:

“Se produce cuando transcurre el intervalo.”

El ejemplo nos quedaría entonces de esta forma:

      static void Main(string[] args)
{
System.Timers.Timer objTimer = new System.Timers.Timer();
objTimer.Interval = 1000;
objTimer.Elapsed += new System.Timers.ElapsedEventHandler(objTimer_Elapsed);
objTimer.Start();
Console.ReadLine();
}

El evento se ejecutaría cada un segundo (mil milisegundos) y nos quedaría así :


      static void objTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
var Ip = "10.35.40.70";

if (RealizarPing(Ip))
{
Console.WriteLine(string.Format("La Ip: {0} se encuentra accesible",Ip));
}
else
{
Console.WriteLine(string.Format("La Ip: {0} NO encuentra accesible", Ip));
}
}

static bool RealizarPing(string Ip)
{
Ping p = new Ping();
try
{
PingReply reply = p.Send(Ip, 3000);
if (reply.Status == IPStatus.Success)
return true;
}
catch { }
return false;
}

Para poder instanciar el objeto Ping, deben de referenciar el siguiente espacio de nombres:


using System.Net.NetworkInformation;

En mi caso la Ip 10.35.40.70 es de otro computador que tengo en mi casa conectado a la misma red; deben de cambiarla por cualquier otra que sea accesible en terminos de red para realizar la prueba.


Al ejecutar la aplicación tendremos algo como esto:


Untitled


Observen que hubo un momento en que la Ip NO se encontraba accesible; esto lo logre desconectando el cable de red por un momento para que la prueba fuera mas completa.


Código


El código realizado con visual studio 2010, lo pueden descargar desde está dirección:


Descargar código



miércoles, 24 de octubre de 2012

[C#] Realizar una conexión con MYSQL

 

Introducción

Una tarea muy sencilla, pero que se convierte en una piedra en el zapato para los que comenzamos a desarrollar sistemas de información, es la de realizar una conexión correctamente con una base de datos (en este caso mysql) y ejecutar algunas sentencias.

 

Que es una conexión a base de datos y para que se utiliza ?

Una conexión es como una clase de puente que realizamos desde nuestro lenguaje de programación hasta una base de datos, y se utiliza para acceder a ciertos recursos que nos provee el motor de base de datos, estos recursos entre otras cosas son poder ejecutar sentencias de algún tipo.

Para poder acceder a un motor de bases de datos necesitamos autenticarnos, entonces uno de los primeros pasos será crear unas credenciales con suficientes permisos para ejecutar sentencias !

 

Creamos la base de datos

  • Ingresamos a la consola de mysql con el usuario root (que es el administrador que definimos en el momento de la configuración del motor):

Untitled

Y ejecutamos esta sentencia para crear una base de datos de prueba:

CREATE DATABASE Prueba  


 


Untitled


 


Poniendo en uso la base de datos


Para que nuestros comandos se apliquen a una base de datos en especifico, debemos de usar la intrucción USE, que basicamente lo que hace es definir la base de datos que queremos usar:


USE Prueba;

 


Crear la tabla


Para hacer el ejemplo mas completo, vamos a crear una tabla de prueba llamada Empleados y le adicionamos algunos registros:

CREATE TABLE Empleados (IdEmpleado INT AUTO_INCREMENT, Nombres VARCHAR(50), Apellidos VARCHAR(50), Correo VARCHAR(50), Telefono VARCHAR(50),  PRIMARY KEY (IdEmpleado ));

INSERT INTO Empleados (Nombres, Apellidos, Correo, Telefono) VALUES ('Aquiles', 'Brinco', 'aquilesbrinco@outlook.com', '4010068');
INSERT INTO Empleados (Nombres, Apellidos, Correo, Telefono) VALUES ('Armando', 'Casas', 'armandocasas@outlook.com', '64681684');
INSERT INTO Empleados (Nombres, Apellidos, Correo, Telefono) VALUES ('Débora', 'Melo', 'deboramelo@outlook.com', '651674');
INSERT INTO Empleados (Nombres, Apellidos, Correo, Telefono) VALUES ('Elsa', 'Pato', 'elsapato@outlook.com', '698541488');
INSERT INTO Empleados (Nombres, Apellidos, Correo, Telefono) VALUES ('Susana', 'Oria', 'susanaoria@outlook.com', '546654651654');
INSERT INTO Empleados (Nombres, Apellidos, Correo, Telefono) VALUES ('Aquiles', 'Bailo', 'aquilesbailo@outlook.com', '5465465465');
INSERT INTO Empleados (Nombres, Apellidos, Correo, Telefono) VALUES ('Elvio', 'Lao', 'elviolao@outlook.com', '301864546');
INSERT INTO Empleados (Nombres, Apellidos, Correo, Telefono) VALUES ('Elva', 'Gina', 'elvagina@outlook.com', '654687486');
INSERT INTO Empleados (Nombres, Apellidos, Correo, Telefono) VALUES ('Elmer', 'Curio', 'elmercurio@outlook.com', '3017768305');


Para visualizar nuestra información, basta con hacer un select a la tabla desde la consola:



SELECT     IdEmpleado, Nombres, Apellidos, Correo, Telefono
FROM Empleados


 


Untitled


 

Descargar el conector

Para poder realizar la conexión necesitamos de un conector o driver ofrecido por mysql, este lo podemos descargar desde está dirección:

Download Connector/Net

Para este caso puntual, aconsejo que descargen

Windows (x86, 32-bit), MSI Installer

Lo instalamos (next, typical, install) ya que posteriormente vamos a utilizar un archivo de este conector.

Untitled

 

Crear string de conexión

Una pregunta muy realizada, es cómo crear el string de conexión; es decir, en que orden debe de ir el usuario, la base de datos, la clave, etc para poder conectarme.

La manera correcta es la siguiente:

server=""; user=""; password=""; database=""

Dentro de las comillas va la respectiva información, en nuestro caso puntual:

server=localhost; user=root; password=a54321; database=Prueba

 

Realizar la conexión desde el lenguaje de programación (C#)

Una vez hayamos cumplido los pasos anteriores, nos disponemos a crear un proyecto de tipo Consola en Visual Studio.

Untitled

Clic en Ok.

 

Referenciando el conector de mysql

El paso a seguir, es agregar una referencia de mysql a nuestro proyecto, para lograrlo, hacemos clic derecho sobre la carpeta referencias de nuestro proyecto y seleccionamos Add reference:

Untitled

En la pestaña Browse, buscamos la ruta donde se instalo el driver de mysql (en mi caso C:\Program Files (x86)\MySQL\MySQL Installer) y seleccionamos la dll con el nombre MySql.Data.dll:

Untitled

Clic en el botón Ok.

Verificamos que la referencia se haya realizado correctamente:

Untitled

Ah, no se nos puede olvidar referenciar nuestra dll desde código con:


using MySql.Data.MySqlClient;

Con eso, ya podemos utilizar todas las clases para acceso a datos ofrecidas por mysql.

 

Accediendo a la base de datos

En el Mein ingresamos el siguiente código:



      static void Main(string[] args)
{
var ConnectionString = @"server=localhost; user=root; password=a54321; database=Prueba";
using (MySqlConnection con = new MySqlConnection(ConnectionString))
{
con.Open();
using (MySqlCommand Command = new MySqlCommand("SELECT IdEmpleado, Nombres, Apellidos, Correo, Telefono FROM Empleados", con))
using (MySqlDataReader Reader = Command.ExecuteReader())
{
while (Reader.Read())
{
Console.WriteLine("{0} - {1} - {2} - {3} - {4}",
Reader.GetInt32(0), Reader.GetString(1), Reader.GetString(2), Reader.GetString(3), Reader.GetString(4));
}
}
}
Console.ReadKey();
}


 


Estamos llendo a base de datos y ejecutando la siguiente sentencia:


 



SELECT     IdEmpleado, Nombres, Apellidos, Correo, Telefono
FROM Empleados


Recuperamos lo que nos retornó la consulta y lo lo visualizamos en la consola:

Untitled

De esa misma manera podemos ejecutar nuestras instrucciones INSERT, UPDATE, DELETED para realizar cualquier tipo de operación a la información !!!!

 

Código

Desde el siguiente link, pueden descargarse el ejemplo realizado con Visual Studio 2010 y Mysql 5.5.

Descargar código !

martes, 23 de octubre de 2012

[ASP.NET] Mostrar progreso en página web

 

Introducción:

Una tarea que no es indispensable para el desarrollo de un sitio web; pero que mejora bastante la experiencía del usuario final; es tener una pequeña parte de la página que que se presente con un Gif animado y un texto cómo “Procesando…” mientras se realiza cualquier tarea que tome algún intervalo significativo de tiempo.

El ASP.NET AJAX Control Toolkit nos ofrece un control llamado UpdateProgress que nos fácilita enormemente esta tarea.

 

Descargar el ASP.NET AJAX Control Toolkit

Simplemente tenemos que ingresar a la página oficial:

Ajax Control Toolkit

Y hacer clic en el botón morado de la parte superior derecha que dice Download.

Descomprimimos la carpeta y con eso tenemos nuestro Ajax listo para ser utilizado.

(Posteriormente vamos a utilizar un archivo de este paquete)

 

Descargando el Gif que vamos a visualizar

Seguramente hay muchas páginas que ofrecen gif de progreso para que visualicemos mientras la página hace un llamado al servidor, pero la que mas me gusta es esta:

Ajaxload

Cómo ven, hay mucha variedad de imagenes y podemos definir el color de la imagen, del fondo, si la queremos con fondo transparente, etc:

Untitled

Simplemente descargamos la que mas nos guste y ya está.

 

Creando una página en blanco

Abrimos nuestro visual studio, clic en File –> New –> Project

Visual C# –> Web –> ASP.NET Empty Web Application

Untitled

Agregamos un formulario en blanco (yo lo llamé default):

Untitled

 

Agregando la imagen al proyecto

Simplemente creamos una carpeta llamada Imagenes y le agregamos el Gif que previamente descargamos.

Untitled

 

Agregando la referencia de Ajax

El paso a seguir, es agregar una referencia de Ajax Control Toolkit a nuestro proyecto, para lograrlo, hacemos clic derecho sobre la carpeta referencias de nuestro proyecto y seleccionamos Add reference:

Untitled

En la pestaña Browse, buscamos el Ajax Control Toolkit descomprimido y seleccionamos la dll con el nombre AjaxControlToolkit.dll :

Untitled

Clic en el botón Ok.

Verificamos que la referencia se haya realizado correctamente:

Untitled

Con eso, ya podemos utilizar todos los controles que ofrece Ajax.

 

Creando el control

Abrimos nuestra página default en modo de diseño y agregamos la referencia con esta linea:

<%@ Register assembly="AjaxControlToolkit" namespace="AjaxControlToolkit" tagprefix="asp" %>

Esa tiene que ser la segunda linea de nuestro código HTML.


 


Agregando el control


El código del control es muy sencillo, y para que el progreso se active, vamos a crear un botón justo antes del UpdateProgress:


        <asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Button ID="Button1" runat="server" Text="Button" />
<br />
<asp:UpdateProgress ID="UpdateProgress2" runat="server">
<ProgressTemplate>
Procesando...<br>
<asp:Image ID="Image2" ImageUrl="~/Imagenes/ajax-loader.gif" runat="server" />
</ProgressTemplate>
</asp:UpdateProgress>
</ContentTemplate>
</asp:UpdatePanel>

Ah, se me había olvidado de dos pequeños amigos que necesitamos para que nuestro ejemplo funcione correctamente:


Uno es el ScriptManager, este control es necesario cómo prerequisito al momento de utilizar el Ajax Control Toolkit


El otro es el UpdatePanel, que cambia los postback totales por parciales entre muchas otras cosas que hace ….


Eso va dentro de la etiqueta form; observen que hacemos referencia a la imagen que nos descargamos y que agregamos a la carpeta Imagenes del proyecto.


 


Probando el funcionamiento del control


A nivel de code begin, sólo debemos de agregarle el evento clic al botón que creamos y en este realizar una pausa de 3 segundos suficientes para que se visualice el progreso (en sus proyectos remplazarían esos tres segundos por el proceso que tarda algo de tiempo y que quieren mejorar la experiencia del usuario):



      protected void Page_Load(object sender, EventArgs e)
{
Button1.Click += new EventHandler(Button1_Click);
}
protected void Button1_Click(object sender, EventArgs e)
{
Thread.Sleep(3000);
}


Ah, para que les funcione la pausa, deben de referenciar el espacio de noombres System.Threading:



using System.Threading;



Una vez hayamos cumplido con todos los pasos anteriores, podemos pulsar F5, hacer clic en el botón y visualizaremos por tres segundo una parte de la página con el Gif y la palabra Procesando:


Untitled


Código


Desde el siguiente link, pueden descargarse el ejemplo realizado con Visual Studio 2010


Descargar código


 


miércoles, 10 de octubre de 2012

[C#] Realizar una conexión con SQL server

 

Introducción


Una tarea muy sencilla, pero que se convierte en una piedra en el zapato para los que comenzamos a desarrollar sistemas de información, es la de realizar una conexión correctamente con una base de datos (en este caso SQL server) y ejecutar algunas sentencias.


Que es una conexión a base de datos y para que se utiliza ?


Una conexión es como una clase de puente que realizamos desde nuestro lenguaje de programación hasta una base de datos, y se utiliza para acceder a ciertos recursos que nos provee el motor de base de datos, estos recursos entre otras cosas son poder ejecutar sentencias de algún tipo.


Para poder acceder a un motor de bases de datos necesitamos autenticarnos, entonces uno de los primeros pasos será crear unas credenciales con suficientes permisos para ejecutar sentencias !

Creamos la base de datos

  • Ingresamos al SQL management studio y ejecutamos esta sentencia para crear una base de datos de prueba:
CREATE DATABASE Prueba


 


Creamos el usuario



  • Creamos un usuario (este también se puede crear por sentencias, pero me parece mas engorroso que por el management studio), navegamos entre los nodos hasta:


Security – Logins



Clic derecho sobre Logins y seleccionamos New Login…:


Untitled[5]



  • No abre la siguiente pantalla donde en la pestaña General podemos seleccionar el tipo de autenticación (Integrada con windows o de SQL server), politicas de seguridad de contraseña:

Untitled


 



  • Luego nos vamos a la pestaña User Mapping, aquí podremos seleccionar la base de datos a la que lo deseamos asociar  y uno de varios roles que vienen por defecto:

Untitled



  • Observen que seleccione la base de datos Prueba (que creamos previamente ) y el rol db_owner, este rol es como el administrador (permite ejecutar cualquier tipo de sentencia), dependiendo de la necesidad, seleccionariamos el tipo de rol; por ejemplo: db_datareader (definimos permisos de lectura) y sobre db_datawriter (definimos permisos de escritura).
  • Damos clic en el botón Ok y tendremos nuestro usuario creado.

Probamos el usuario


Una vez creado, no esta de más probar que funcione correctamente un inicio de sesión


Hacemos clic en Connect Y seleccionamos Database Engine …


Untitled


En la pantalla que nos aparece, seleccionamos, nombre de servidor, tipo de autenticación, y siendo el caso el usuario y la contraseña.


Untitled


Clic en el botón Connect, expandimos el nodo de la base de datos Prueba, y ejecutamos alguna sentencia cómo manera de ensayo:



SELECT GETDATE()


Como ven, este usuario ya puede ingresar a la base de datos y ejecutar sentencias de algún tipo Open-mouthed smile


 


Crear la tabla


Para hacer el ejemplo mas completo, vamos a crear una tabla de prueba llamada Empleados y le adicionamos algunos registros:



CREATE TABLE Empleados (IdEmpleado INT IDENTITY(1,1), Nombres VARCHAR(50), Apellidos VARCHAR(50), Correo VARCHAR(50), Telefono VARCHAR(50))

INSERT INTO Empleados (Nombres, Apellidos, Correo, Telefono) VALUES ('Aquiles', 'Brinco', 'aquilesbrinco@outlook.com', '4010068')
INSERT INTO Empleados (Nombres, Apellidos, Correo, Telefono) VALUES ('Armando', 'Casas', 'armandocasas@outlook.com', '64681684')
INSERT INTO Empleados (Nombres, Apellidos, Correo, Telefono) VALUES ('Débora', 'Melo', 'deboramelo@outlook.com', '651674')
INSERT INTO Empleados (Nombres, Apellidos, Correo, Telefono) VALUES ('Elsa', 'Pato', 'elsapato@outlook.com', '698541488')
INSERT INTO Empleados (Nombres, Apellidos, Correo, Telefono) VALUES ('Susana', 'Oria', 'susanaoria@outlook.com', '546654651654')
INSERT INTO Empleados (Nombres, Apellidos, Correo, Telefono) VALUES ('Aquiles', 'Bailo', 'aquilesbailo@outlook.com', '5465465465')
INSERT INTO Empleados (Nombres, Apellidos, Correo, Telefono) VALUES ('Elvio', 'Lao', 'elviolao@outlook.com', '301864546')
INSERT INTO Empleados (Nombres, Apellidos, Correo, Telefono) VALUES ('Elva', 'Gina', 'elvagina@outlook.com', '654687486')
INSERT INTO Empleados (Nombres, Apellidos, Correo, Telefono) VALUES ('Elmer', 'Curio', 'elmercurio@outlook.com', '3017768305')


Para visualizar nuestra información, basta con hacer un select a la tabla desde el Management Studio:



SELECT     IdEmpleado, Nombres, Apellidos, Correo, Telefono
FROM Empleados


 


Untitled


 Con esto ya tenemos listo lo que debemos hacer a nivel del motor de base de datos.


 


Crear string de conexión


Una pregunta muy realizada, es cómo crear el string de conexión; es decir, en que orden debe de ir el usuario, la base de datos, la clave, etc para poder conectarme con el motor como lo hicimos con el SQL Management Studio ….


La solución, es crear un archivo .udl, este nos proveé una pantalla (parecida a la de SQL server) en la que vamos a poder crear nuestro string de conexión.


Entonces creamos un nuevo archivo de texto:


Untitled


Le cambiamos la extensión de .txt a .udl, el nombre no importa, yo lo llamé Conexion.


Untitled


Abrimos el archivo y nos vamos a la pantalla Provider:


Untitled


 


Verificamos que esté seleccionado SQL server, luego cambiamos a la pestaña Connection e ingresamos nombre de servidor, tipo de autenticación, y siendo el caso el usuario y la contraseña.


Untitled


Muy importante seleccionar la lista de chequeo Allow saving password (eso nos permitirá que la clave quede almacenada en el string de conexión) y seleccionar la base de datos.


Hacemos clic en el botón Test Connection y si todo lo hicimos bien, nos saldrá un mensaje como este:


Untitled


Luego hacemos clic en el botón Ok.


Conformamos el siguiente dialogo:


Untitled


Basicamente nos avisa que la contraseña se va a guardar en el archivo.


Luego, hacemos clic derecho sobre el .udl y lo abrimos con un editor de texto:


Como verán, este es el contenido del archivo:


[oledb]
; Everything after this line is an OLE DB initstring
Provider=SQLOLEDB.1;Password=a54321;Persist Security Info=True;User ID=Administrador;Initial Catalog=Prueba;Data Source=C-CPEREZ\SQL2008R2


Y el string de conexión es el que esta en negrita.


Realizar la conexión desde el lenguaje de programación (C#)


Una vez hayamos cumplido los pasos anteriores, nos disponemos a crear un proyecto de tipo Consola en Visual Studio.


Untitled


En el Mein ingresamos el siguiente código:


      static void Main(string[] args)
{
var ConnectionString = @"Password=a54321;Persist Security Info=True;User ID=Administrador;Initial Catalog=Prueba;Data Source=C-CPEREZ\SQL2008R2";
using (SqlConnection con = new SqlConnection(ConnectionString))
{
con.Open();
using (SqlCommand Command = new SqlCommand("SELECT IdEmpleado, Nombres, Apellidos, Correo, Telefono FROM Empleados", con))
using (SqlDataReader Reader = Command.ExecuteReader())
{
while (Reader.Read())
{
Console.WriteLine("{0} - {1} - {2} - {3} - {4}",
Reader.GetInt32(0), Reader.GetString(1), Reader.GetString(2), Reader.GetString(3), Reader.GetString(4));
}
}
}
Console.ReadKey();
}

Observen que la variable ConnectionString tiene lo que nos genero el .udl


Estamos llendo a base de datos y ejecutando la siguiente sentencia:


SELECT     IdEmpleado, Nombres, Apellidos, Correo, Telefono
FROM Empleados

Recuperamos lo que nos retornó la consulta y lo lo visualizamos en la consola:


Untitled


De esa misma manera podemos ejecutar nuestras instrucciones INSERT, UPDATE, DELETED para realizar cualquier tipo de operación a la información !!!!


 


Código


Desde el siguiente link, pueden descargarse el ejemplo realizado con Visual Studio 2010 y SQL server 2008 R2.


Descargar Código