lunes, 22 de octubre de 2012

Conectar VB.NET con MySql

Para conectar un proyecto de visual Studio 2010 con el MySql, sigamos los siguientes pasos!! 
  1. Crear un proyecto normal.
  2. Para poder conectar la base de datos se debe instalar una librería disponible en Connector / Net, una vez descargado procedemos a instalarlo.
  3. Vamos al proyecto y agregamos  una referencia de la librería MySql.Data.dll, la cuál se encuentra en C:\Archivos de programa\MySQL\MySQL Connector Net 6.5.4\Assemblies\v4.0\MySql.Data.dll

4. Creamos una clase llamada Conexión y agregamos el siguiente código.

Imports MySql.Data.MySqlClient

Public Class conexion
    Private MysqlCommand As New MySqlCommand
    Dim MysqlConnString As String = "server=Miservidor; user id= myusuario ; password=myContraseña"
    Public MysqlConexion As MySqlConnection = New MySqlConnection(MysqlConnString)

    Public Sub Probarconexion()
        Try
            MysqlConexion.Open()
            MsgBox("la conexión fue exitosa")
            MysqlConexion.Close()
        Catch ex As Exception
            MsgBox("La conexión no fue exitosa")
        End Try
    End Sub
End Class

5. Creamos un botón en el formulario y agregamos el siguiente código en el evento Click

Private Sub btn_Click(sender As System.Object, e As System.EventArgsHandles btn.Click

        Dim s As New conexion
        s.Probarconexion()

End Sub


6. Listo!!

Espero que les sea de mucha utilidad!! el proyecto está disponible  AQUÍ


viernes, 19 de octubre de 2012

Uso básico Datagridview (DataSet y Oracle)

A petición de un lector, facilito el código para la conexión de un proyecto vb.Net con el SGBD Oracle

De nuevo, lo haré de dos formas
  • Asignando a la propiedad de la tabla source el dataset
  • Recorriendo el dataset y agregando los datos a la tabla
Los pasos son:
  1. Crear una base de datos en Oracle llamada "DBEJEMPLO"
  2. Crear una tabla llama "DEPARTAMENTOS" con los campos
    • departamento
    • descripción
CREATE TABLE "DEPARTAMETOS"
( "DEPARTAMETO" NUMBER(4,0),
"DESCRIPCION" CHAR(100) NOT NULL ENABLE,
CONSTRAINT "DEPARTAMETOS_PK" PRIMARY KEY ("DEPARTAMETO") ENABLE
)


3. Crear un proyecto en Visual Studio
4. Agregar 2 datagridview al formulario desde la barra de herramientas.
5. Ir a proyecto y agregar una referencia llamada "Oracle.DataAccess"

6. Crear una clase llama "CONEXION" y escribir el siguiente código


Imports Oracle.DataAccess.Client

Public Class conexion
   
    Private OCommand As New OracleCommand()
    Dim OConnString As String = "DATA SOURCE=127.0.0.1;PASSWORD=Micontraseña;USER ID=Miusuario"
    Public oConexion As OracleConnection = New OracleConnection(OConnString)
    Dim oAdapter As OracleDataAdapter
    Public Dataset As DataSet = New DataSet()

    Private Function CargarDataset(ByVal OString As String, ByVal tabla As String) As DataSet
        Try
     oAdapter = New OracleDataAdapter(OString, oConexion)
     Dim oCreadorDeComandos As OracleCommandBuilder = New OracleCommandBuilder(oAdapter)
     Dataset.Clear()
     oAdapter.Fill(Dataset, tabla)
     oConexion.Close()
     Return Dataset
        Catch ex As Exception
     Return Nothing
     MessageBox.Show("No se pudo completar la operación, intente de verificar la conexión a la base de datos.", "Fallo conexión a la base de datos", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Finally
     oConexion.Close()
        End Try
    End Function


    Public Sub Cargargrid(ByVal formulario As String, ByRef dtg As DataGridView)
        Try
     Dim tabla As String = "departamentos"
     Dim OString As String = "select a.id_departamento as Código, a.descripcion as Departamento from  " + tabla + " a"
     Dim ds As DataSet = CargarDataset(OString, tabla)

     If ds Is Nothing Then
         Exit Sub
     End If

     Select Case formulario
         Case 1
             CargarForma1(ds, dtg, tabla)
         Case 2
             CargarForma2(ds, dtg, tabla)
         Case Else
             Exit Sub
     End Select
        Catch ex As Exception
     MessageBox.Show(Err.Description)
        End Try
    End Sub


    Private Sub CargarForma1(ByVal ds As DataSet, ByRef dtg As DataGridView, ByVal tabla As String)
        Try
     Dim n As Integer ' variables para el for
     Dim fila As DataGridViewRow ' representa una fila del datagridview
     ' ciclo para limpiar el datagrid de cualquier dato y evitar que se repitan
     If dtg.Rows.Count > 0 Then
         For n = dtg.Rows.Count - 2 To 0 Step -1
             fila = dtg.Rows(n)
             dtg.Rows.Remove(fila) ' Eliminamos la fila de la colección
         Next
     End If


     dtg.DataSource = Nothing ' limpiar el datasourse
     dtg.Refresh() ' actualizar
     dtg.DataSource = ds ' asignar en la memoria la tabla
     dtg.DataMember = tabla ' asignar la tabla escogida
        Catch ex As Exception
     MessageBox.Show(Err.Description)
        End Try
    End Sub


    Private Sub CargarForma2(ByVal ds As DataSet, ByRef dtg As DataGridView, ByVal tabla As String)
        Try
     If dtg.Rows.Count > 0 Then
      dtg.Rows.Clear() 'limpiar el datagridview
     End If
     Dim filas As Integer = ds.Tables(tabla).Rows.Count - 1 ' verificamos
     If filas < 0 Then
         Exit Sub
     End If
     Dim Codigo As String
     Dim descripcion As String
     For i As Integer = 0 To filas ' recorrer las filas del dataset cargado
         Codigo = ds.Tables(tabla).Rows(i)(0)
         descripcion = ds.Tables(tabla).Rows(i)(1)
         dtg.Rows.Add(Codigo, descripcion)
     Next
        Catch ex As Exception
     MessageBox.Show(Err.Description, "Fallo conexión a la base de datos", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

End Class


7. En el evento load del formulario

  Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim s As New conexion
        s.Cargargrid(1, DataGridView1)
        s.Cargargrid(2, DataGridView1)
    End Sub

8. Listo a ejecutarlo


El proyecto esta disponible   AQUI

Espero que les sea de gran utilidad...!!!  

martes, 16 de octubre de 2012

Protocolos de enrutamiento: OSPF (Parte 2)


Creación del mapa de red “base de datos “ 

La creación del mapa de la red local contenido en cada router de la red, consiste en una seria de pasos fundamentales y son los siguientes: 

1. Descubrir a sus nodos vecinos y direcciones:

Por medio de un paquete HELLO enviado desde un router a todos los demás averigua cuales routers tiene de “vecinos” y cada router que reciba el paquete debe enviarlo con su respectiva identidad al router origen. 

2. Medir el costo a cada uno de sus vecinos: 

Por medio del envió de un paquete ECHO los routers pueden medir el tiempo de respuesta a cada nodo. El tiempo de ida y vuelta dividido entre dos da la aproximación razonable del costo a cada “vecino” de la red. 

3. Elaborar el paquete de estado de enlace: 

Este paquete es creado por cada router, contiene todos recaudados del estado de la red con la identidad del router, la secuencia, la edad y la lista de todos los nodos vecinos. Estos paquetes se pueden configurar para que se actualicen de forma periódica o cuando haya un cambio en la topología de la red, este último es más factible porque se evita menos tráfico en la red.. 

4. Distribuir el paquete de estado de enlace:

Utilizando el protocolo de inundación “flooding protocol” se procede a enviar los paquetes por toda la red, se controlan mediante un número de secuencia que aumenta con cada nuevo paquete enviado, cada router tiene una tabla con la información por lo que si recibe un paquete lo envía a otros excepto por la que llego, si el paquete está duplicado se elimina, si es un paquete con el número de secuencia menor al paquete que haya recibido anteriormente lo rechaza. 

Para evitar problemas con los paquetes que no lleguen a su destino, se le introduce la edad a cada uno y esta va disminuyendo conforme avanza por la red hasta llegar a 0, esto hace que sean descartados y que los paquetes no circulen indefinidamente por la red. Gracias a esta solución se evita conflictos por caída de un router o reinicios de secuencia en los paquetes. 

5. Calcular la ruta más corta:

Cuando los routers tienen la información actualizada construye el grafo de la subred utilizando el algoritmo dijkstra para calcular la ruta más corta.

Tipo de Paquetes 

OSPF utiliza el envió de paquetes o mensajes para la comunicación entre routers, entre ellos están:

1.      Tipo 1 o HELLO .
Identificar a los vecinos, para crear una base de datos en mapa local. 
Enviar señales de , indica al resto de los routers que el funciona correctamente. 
Elegir un router designado para una red multienvío 
Encontrar al router designado existente.



1.      Tipo 2 o Descripción de la base de datos,  DDP (Database Description Packet).

Intercambiar información para que un router pueda descubrir los datos que le faltan durante la fase de inicialización o sincronización cuando dos nodos han establecido una conectividad.

2.      Tipo 3 Petición del estado del enlace, LSR(Link State Request ).

Pedir datos que le faltan al router en su base de datos o que están obsoletos durante la fase de intercambio de información entre dos routers.

3.      Tipo 4 o Actualización del estado del enlace, LSU(Link State update).

Respuesta a los mensajes de Petición de estado del enlace.
Informar dinámicamente de los cambios en la topología de la red.

4.      Tipo 5 o ACK del estado del enlace (Link State ACK) .

Confirmar la recepción de una Actualización del estado del enlace.

El sistema autónomo (AS)

El protocolo OSPF organiza un sistema autónomo (AS) en forma jerárquica en zonas llamadas áreas, estas áreas son grupos de routers cercanos cuya información se puede resumir para el resto de la red, es decir las áreas son unidades de enrutamiento donde todos los routers del área mantienen una copia de la topología su red en su base de datos de estado de enlace (LSDB), por lo que si ocurre algún cambio en una parte de la red no afectara a toda la red si no solo a esa área evitando el tráfico innecesario.



Áreas

Entre las áreas del sistema autónomo o red en específica están:

Área Backbone (área 0)

Es el núcleo de una red OSPF, por lo tanto siempre debe estar presente, ya que mantiene conexión, física o lógica, con todas las demás áreas en que esté dividida la red. 

La conexión entre un área y el backbone se establece mediante los ABRs, responsables de la gestión de las rutas no-internas del área, o sea de las rutas entre el area 0 y las demás redes.

Área stub
Esta área es la que no recibe rutas externas, ya que las rutas externas son rutas que fueron integradas en OSPF desde otro protocolo de enrutamiento. Por lo tanto, las rutas de segmento necesitan normalmente apoyarse en las rutas predeterminadas para poder enviar tráfico a rutas externas.


Área not-so-stubby (NNSA)

Es un área constituida de un tipo de área stub, sin embargo esta si puede importar rutas externas de sistemas autónomos y enviarlas al backbone, pero no puede recibir rutas externas de sistemas autónomos desde el backbone u otras áreas.


Espero que les sea de mucha utilidad...siga la parte 3!!

Protocolos de enrutamiento: OSPF (Parte 1)


Introducción al OSPF protocol

OSPF protocol u Open Short Path First protocol es un conocido protocolo estándar de enrutamiento de pasarela interno (IGP) en redes TCP/IP usado en sistemas autónomos, creado por IETF a finales de los 80 ante la necesidad de optimizar el protocolo RIPv1 en cual presenta muchas deficiencias al utilizarlo en redes de gran magnitud, por lo que OSPF se volvió uno de los más utilizados al ser apto para las redes de todo tipo y tamaño.

Este protocolo a diferencia de otros se basa en la implementación del algoritmo Dijkstra (LSA - link state algorithm) para calcular la ruta más corta entre nodos de una red y también es un protocolo sin clase (classless) ya que en sus actualizaciones de enrutamiento no adjunta la máscara de red.

Cuando se diseño IETF tenía en cuenta que cumpliera con los siguientes requisitos:

1.Ser libre, no fuera propiedad de ninguna compañía
2. Que pudiera reconocer varias métricas como la distancia física y el retardo.
3. Ser un protocolo dinámico, adaptándose rápida y automáticamente a cualquier cambio de la topología de la red.
4. Realizar el encaminamiento de paquetes independientemente del tipo de servicio.
5. Reconocer sistemas jerárquicos ya que solo un router no puede conocer la estructura completa de Internet.
6. Ser seguro.



Características funcionales del protocolo

Entre las características más importantes del protocolo OSPF están:

1.   Ofrece respuesta rápida y sin bucles ante cualquier cambio.

A diferencia de los protocolos basados en la algoritmia de vector distancia como RIP, OSPF se basa en la algoritmia de Dijkstra esto permite que exista en los nodos un tiempo de respuesta para el cálculo de la ruta más corta con base al mapa local de la red, lo que hace que dicho cálculo sea más rápido. Además como todos los nodos de la red calculan el mapa de manera idéntica no se generan bucles ni nodos que se encuentren contando en infinito; principal problema del protocolo RIP.

2.   Autentificación de origen de ruta y seguridad ante los cambios.

Pueden llegar a existir diversos fallos que pueden ocurrir en la red como fallos de los protocolos de sincronización o inundación, errores de memoria, introducción de información errónea, sin embargo OSPF especifica que todos los intercambios de información entre routers deben ser autentificados, con sus respectivos identificadores de enlace y número de versión, por lo que se garantiza que sólo los routers confiables difundan información de enrutamiento.

Siempre debe existir una copia idéntica de la topología de la red en cada nodo para que el protocolo de enrutamiento funcione adecuadamente y con seguridad, para ello se implementa en protocolo de chequeo de mapas “ bringing up adjacencies “ , en cual tiene dos fases:

1. Intercambiar paquetes de descripción del mapa local entre nodos, creando una lista de nodos especiales, que serán aquellos los cuales se deben tener en cuenta, por algún fallo, porque la versión es mayor que la copia local o porque no existe en el mapa el identificador de enlace.

2. Creación de los paquetes con información acerca de esos nodos especiales, los cuales se envían a sus vecinos para que verifiquen la información.

Así los routers tendrán en cuenta, cuales nodos están obsoletos y cuáles no existían en su mapa local.

3.     Soporte de múltiples métricas.

Gracias a la tecnología actual es posible que soporte varias métricas, por lo que se pueden evaluar las rutas entre dos nodos con base a diferentes métricas, para contar con mejores rutas según la métrica utilizada en cada caso, sin embargo la elección de la mejor ruta dependerá de los requisitos que existan en la comunicación y esto implica que OSPF implemente un mecanismo a la hora de elegir una sola métrica para un paquete en especifico. 

Entre las métricas más utilizadas están: de alto rendimiento, de menor retardo, de mayor fiabilidad, sin embargo la más usada es de menor coste.


4.     Igualdad de carga en múltiples rutas.

OSPF permite que exista igualdad de tráfico de las rutas que están entre los nodos en los cuales exista más de una ruta. Para ello se implementa una modificación de una versión de SPF para evitar bucles temporales y un algoritmo que permite calcular la cantidad de tráfico que debe ser enviado por cada camino.

5.      Escalabilidad en el incremento de rutas externas.

Internet se ha expandido tanto que cada vez más los sistemas autónomos se conectan entre si a través de routers externos. Sin embargo para conectar redes se debe tener en cuenta que existen varios proveedores de servicios por lo que es más versátil elegir el router exterior y servicio requerido que establecer una ruta y servicio por defecto.

Por lo que OSPF vino a solucionar el problema permitiendo que en la base de datos del mapa local se guardaran los “gateway link state records”.

Estos son registros que almacenan el valor de las métricas calculadas por lo que es más fácil el cálculo de la ruta óptima para el exterior. Por cada entrada externa existirá una nueva entrada de tipo “gateway link state records” en la base de datos tal como ocurre con los protocolos de vector distancia, pero la diferencia es que en OSPF el coste del cálculo de las rutas crecerá en función de y no en función de como ocurre en los protocolos de vector distancia.

6.      OSPF soporta VLSM y CIDR.

OSPF es capaz de manejar las máscaras de subred de tamaño variable (VLSM), mecanismo implementado para dar solución al agotamiento de direcciones IP, la división en subredes y el enrutamiento de interdominio (CIDR), NAT y las direcciones IP privadas, problemas que surgieron al crecimiento incontrolable de las redes descentralizando las redes para poder así conseguir redes más seguras y jerárquicas.


Funcionamiento del protocolo OSPF

Básicamente el protocolo de enrutamiento funciona trazando un mapa de la red de interés y con base a ello establece la ruta más corta hacia un determinado destino, todos los routers de la red autónoma tendrán un mapa completo de toda la red, por lo que si un enlace falla el protocolo OSPF puede localizar y encontrar rápidamente una ruta alterna hacia el destino basándose en el mapa sin que forme un bucle de enrutamiento.

OSPF es un protocolo de estado de enlace, por lo que se basa en los estados de conexión o enlaces de la red, esto es importante a la hora de calcular la topología de cada enlace de los routers, porque se conoce a que está conectado cada uno, y así se puede construir una base de datos que incluya todos los enlaces de la red e implementar el algoritmo Dijkstra para calcular la ruta más corta entre ellos.




Espero que les sea de mucha utilidad...siga la parte 2!!



sábado, 13 de octubre de 2012

Windows Mobile con C# y datadrid

En esta ocasión me interesa compartirles en lo que estoy trabajando ahorita con aplicaciones móviles para pocket PC.

En este caso utilizaremos;
  • Lenguaje de programación C# o C sharp.
  • Programación orientada a objetos. :)
Los requerimientos son:
Una vez instalados todos los requerimientos procedemos a seguir los pasos siguientes:
  • Paso 1. Crear nuevo proyecto "Smart Device Project"
  • Paso 2 . Elegir la plataforma "Windwos Mobile 5.0 Pocket PC SDK" con "Device Application"

al click a "OK"  se cargará el proyecto....



  • Paso 3. Crear una base de datos llamada "Inventario" y una tabla llamada "artículos"
Vamos al proyecto agregamos un nuevo item y en DATA seleccionamos "database file", al dar agregar aparece una ventana dar click en "cancelar" no es necesario crear un data set.

Nota: en lo personal los data set creados en   diseño no me gustan, prefiero hacerlos manuales...

Creamos la tabla y posteriormente para efectos de muestra la llenamos con datos...



  • Paso 4. Agregar un datagrid

Nota: en caso de enlazar la aplicación a una base de datos normal deben agregar la referencia "System.Data.SqlClient", en este ejemplo se necesita la referencia  "System.Data.SqlServerCe" debido a que es una base de datos compacta incluida en el proyecto.

  • Paso 5. Crear una clase llamada "ConnectClass" 

Primero tenemos que agregar...


using System;
using System.Data;
using System.Data.SqlServerCe;
using System.Windows.Forms;


En esa función de la clase se añade código para establecer la conexión con la base de datos.

public ConnectClass()
{
try
String path;/*Variable para la ruta de la BD*/

path = "Data Source=" + System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\inventario.sdf";

SqlCeCon = new SqlCeConnection(path);/*asignar a la conexión la ruta*/

SqlCeCon.Open();}/*abrir conexión para  verificar */

catch (SqlCeException e)
MessageBox.Show("Error de conexión , error:"+ e.Message);}/*Mensaje en caso  de falla de conexión */
finally
{SqlCeCon.Close();}}/*Cerrar la conexión*/



Esta función devuelve un dataset y tiene como parámetros de entrada el comando SQL y el nombre de la tabla.

public DataSet ExecuteDataset(string SQL, string table)
        {
      try
            {
 // Abrimos la conexión 

            if (SqlCeCon.State==ConnectionState.Closed){
              SqlCeCon.Open();
            }

// Abrimos la conexión 

            DataSet ds = new DataSet(table); 
            SqlCeDataAdapter   Sqldapter =  new   SqlCeDataAdapter(SQL,SqlCeCon);          

// asigna un adaptador con el comando SQL y la conexión

            Sqldapter.FillSchema(ds, SchemaType.Source, table);
           
            Sqldapter.Fill(ds, table); // load data
         
            return ds; //return dataset with data
            }
            catch (SqlCeException e)
            {
                MessageBox.Show(e.Message);
                return null;
            }
            finally
            {
                SqlCeCon.Close();
            }
        }

y listo esa es la clase...Sencilla...
  • Paso 7. Agregar código en el formulario, específicamente en el evento Load
private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
 //se instancia la clase
InventoryMov.ConnectClass objRegisters = new InventoryMov.ConnectClass();

DataSet ds = new DataSet(); // dataset para cargar los datos

ds = objRegisters.ExecuteDataset("SELECT * from articulos", "articulos");

dataGrid1.DataSource = null;

dataGrid1.DataSource = ds.Tables[0]; //asignamos el dataset al datagrid
              
            }
            catch (Exception A)
            {
                MessageBox.Show(A.Message);
                dataGrid1.DataSource = null;
            }
             
        }

  • Paso 8. Correr la aplicación, pero antes debemos hacer algo importante, conectar un dispositivo, en este caso usaremos un emulador para ello vamos a   "tools" y seleccionamos "Connect to device", seleccionamos el emulador y dar click a "conectar" 

Damos click en "close"  , ejecutamos nuestra aplicación y esperamos....

  • Paso 9. Listo.



Espero que les sea de mucha utilidad!!! 

El proyecto se encuentra disponible en http://sdrv.ms/W5PDdI