Clase IX

 

Objeto SQLConnection y SQLDataReader

 

Objetivo

 

Aquí veremos como consumir datos desde una fuente de datos (en éste caso utilizaremos la base de datos de Northwind de SQL)

 

Duración Aproximada

 

20 minutos

 

Pasos o Recomendaciones

 

 

1)    Primeramente veremos como crear una conexión con SQLServer utilizando el objeto SQLConnection ubicado en el namespace System.Data.SqlClient

 

2)    Vamos a crear un nuevo proyecto llamado Ejercicio4 del tipo aplicación de consola

 

3)    Primeramente vamos a importar los namespaces System.Data y System.Data.SqlClient

 

4)    Luego dentro del método main declararemos un objeto llamado dtEmpresas del tipo DataTable y le agregaremos dos DataColumn llamados CustomerID y CompanyName

 

5)    Declaramos un objeto sqlconnection llamado myconn y le indicaremos el connectionstring que utilizará (ántes de realizar la operación, se debe verificar que el connection string sea el correcto en el ámbito donde se va a ejecutar)

 

6)    Creamos un objeto SQLCommand y le indicamos la cadena TSQL que utilizará y el objeto sqlconnection que utilizará

 

7)    Creamos ahora un objeto SQLDataReader y le indicamos el Select Command Text y el objeto slqconnection que utilizará

 

8)    Ahora abrimos la coneccion con la base de datos. Creamos un objeto DataReader llamado mydr e invocamos el método ExecuteReader del objeto mycomando que anteriormente hemos creado.

 

9)    Luego cargamos el objeto dtEmpresas, utilizando el método Load y pasandole en el argumento el objeto Datareader. Por último cerramos la coneccion

 

 

10)Por último vamos a recorrer los registros obtenidos y representarlos en la consola

 

11)El resultado final será el siguiente:

 

Hasta aquí, hemos aprendido a llenar un datatable por medio de su método Load y indicandole un objeto DataReader.


 

 

Objeto SQLConnection y SQLDataAdapter (.Fill)

 

Objetivo

 

Obtener conocimientos básicos en el manejo de los objetos connection y el objeto dataadapter

 

Duración Aproximada

 

15 minutos

 

Pasos o Recomendaciones

 

1)    Basado en el ejercicio anterior (de la clase pasada) , ahora veremos de realizar la mísma operación pero utilizando el objeto DataAdapter en ves del objeto DatarReader.

 

2)    Lo que vamos a hacer primeramente es eliminar el código que se muestra encuadrado a continuación

 

 

 

 

3)    En el lugar que previamente borramos creamos un objeto SQLDataAdapter y le indicamos el Select Command Text y el objeto slqconnection que utilizará

 

4)    Ahora abrimos la coneccion con la base de datos y rellenamos el contenido obtenido en el objeto DataTable llamado dtEmpresas. Por último cerramos la coneccion

 

Por último ejecutamos la aplicación presionando F5 y vermos los mismos resultados que ántes

 

5)    Hasta aquí, hemos aprendido a llenar utilzando el método fill del objeto dataadapter para llenar el contenido en un datatable


 

 

 

Objeto SQLConnection y SQLDataAdapter (.Update)

 

Objetivo

 

Obtener conocimientos básicos en el manejo de los objetos connection y el objeto dataadapter utilizando el método Update()

 

Duración Aproximada

 

20 minutos

 

Pasos o Recomendaciones

 

1)    Basado en el ejercicio anterior, ahora veremos de realizar la mísma operación pero vamos a realizar cambios en nuestro datatable y luego volcarlos a la base de datos. De ésta manera pondremos en práctica el modelo de acceso a datos desconectados.

2)    Utilizando el mísmo ejercicio anterior vamos a ubicarnos al final del código y vamos a agregar el siguiente código.

 

3)    Ahora recorremos la colección de datarows en busca del customerid

4)    Si no llegaramos a encontrar el customerid entonces enviamos un mensaje y finalizamos la ejecucion del programa

 

5)    Si encontramos el customerid, entonces me traigo el DataRow correspondiente que tiene dicho customerid y muestro en consola el nombre original y solicito un nuevo nombre para dicha empresa:

 

 

6)    Ahora que eh obtenido el nuevo nombre, modifico el datarow, pero primeramente hay que llamar al método .BeginEdit del propio datarow para luego poder asignarles valores y por último se debe llamar el método EndEdit() como se muestra en la siguiente figura:

 

7)    Creamos un objeto command que será utilizado por el dataadapter para poder realizar los cambios necesarios en la base de datos. El objeto command que crearemos se llamará updcomando y le debemos indicar la cadena TSQL que utilizará para llamar a la BD y los parámetros que utiliza, tanto como su nombre, el tipo de dato, la longitud y el nombre del campo de nuestro datatable.

8)    Por último adjuntamos éste objeto a nuestro DataAdapter (myada) para luego invocar su método .Update() e indicarle el datatable que tiene que actualizar contra la base de datos.

9)    Hasta aquí hemos aprendido a consultar en la base de datos, traer los resultados y guardarlos en un objeto en memoria (datatable), modificar su contenido y volver a conectarnos a la base de datos para guardar los cambios.

 

10)De ésta manera se ve reflejado la importancia y trabajar en forma desconectada.

 


 

 

DataBinding

 

 

Duración Aproximada

 

35 minutos

 

Pasos o Recomendaciones

 

1)    En éste ejercicio mostraremos básicamente como enlazar datos de un origen de datos con un control de WinForms,

 

2)    Para ello crearemos un proyecto del tipo “Windows Application” con el nombre de “Ejercicio7”

 


3)    Primermente arrastraremos desde nuestro ToolBox en la sección “Data”, arrastraremos y colocaremos el control DataGridView sobre nuestro formulario “Form1”, una vez colocado resaltará un cuadro de tareas correspondiente al DataGridView de donde seleccionaremos de “Choose Data Source” la opcionAdd Project Data Source…”

 


4)    Una ves que seleccionamos “Add Project Data Source..” aparecerá un cuadro con templates, de donde seleccionaremos “DataBase


5)    Seleccionamos DataBase, luego “Next”, luego presionamos el botonNew Connection...”. luego veremos un cuandro de dialogo para seleccionar el origen y la base de datos. (dependiendo del ambito donde se desarrolle el curso, se deberia verificar primeramente el nombre y la instancia de sql donde resida una base de datos Northwind).

 

6)    Una vez que hallamos presionado “Ok”, VisualStudio nos notificará que es dentro de la cadena de coneccion hay datos importantes (nombre de usuario, contraseña), Presionamos “Yes” sobre el cuado de dialogo”

 

7)    Ahora VisualStudio nos brinda la posibilidad de guardar el conecction string dentro de un archivo externo de configuración, ya que si en el día de mañana cambia la ubicación del servidor, o las claves, etc, habria que entrar al código de la aplicación para modificar y volver a recompliar el programa. De ésta manera queda guardado en un archivo externo a la aplicación.

 


8)    Por último seleccionaremos de Tablas, la tabla Customers, y de ahí seleccionaremos únicamente los campos CustomerID y CompanyName. Por último presionamos “Finish”.

 


9)    Luego de finalizado el asistente veremos que el control DataGridView esta enlazado con un control llamado “customerBindingSource”, que a su ves éste control esta enlazado con un northwindDataSet (un dataset tipado que ha creado) y un customerDataTable que utilizara para realizar las consultas y/o modificaciones sobre la base de datos.

 

10)Si presionamos F5 veremos que automaticamente se rellena el contenido en el control DataGridView

 

11)Fin del ejercicio

 

Semáforos

 

Objetivos

 

El objetivo de este lab es el de comprender como los semáforos pueden ser utilizados para controlar las threads. Además, al igual que el resto de los labs de este primer módulo, será útil para comenzar un acercamiento a Visual Studio 2005.

Duración Aproximada

 

30 minutos

 

Pasos:

 

1)    Crear una nueva aplicación tipo consola, en c#, en la carpeta Labs, con el nombre “SemaforosLab”.

 

2)    Agregar una nueva clase al proyecto, con el nombre de Tester

 

3)    Agregar:

 

using System.Threading;

 

en ambos encabezados. Esto es requerido para poder hacer una aplicación multi-threading.

     

4)    En la clase Tester agregar dos propiedades:

     

private Semaphore sem;

      private int _id;

 

una es el semaforo que compartiran todas las clases, la otro es un identificador de la instancia.

 

5)    Agregar un constructor con parametros:

 

// Constructor

      public Tester(int i)

      {

         _id = i;

         sem = new Semaphore(1, 1, "ElSemaforo");

      }

 

Asigna el id a la instancia, y define el el semaforo que sera compartido por todas las instancias por tener el mismo nombre. En principio, permite que las threads corran de a una.

 

6)    El objeto tester tiene que tener un método que ejecute algo:

 

// Metodo que ejecuta algo

      public void Ejecutar()

      {

          for (int j = 0; j < 5; j++)

          {

              // Activacion del semaforo

              sem.WaitOne();

              for (int i = 0; i < 5; i++)

              {

                 Console.WriteLine("Tester {0}", _id);

                  Thread.Sleep(200);

              }

              // Liberacion del semaforo

              sem.Release();

          }

      }

 

Este metodo va a imprimir su id por consola 5 veces dentro del waitOne del semaforo, en 5 oportunidades. Observar que el semaforo se activa, y luego se abre, para que el recurso pueda ser tomado por otra thread.

 

7)    Desde el main de la aplicación de consola, deben ser creadas y ejecutadas cada una de las threads, esto se realiza con el siguiente código, que va dentro del main.

 

for (int i = 0; i < 5; i++)

      {

           Tester obj = new Tester(i);

           Thread t = new Thread(new ThreadStart(obj.Ejecutar));

           t.Start();

      }

      Console.ReadLine();

 

Se crean 5 testers y se los ejecuta en 5 threads distintas. El ultimo ReadLine es para que no se cierre la consola al terminar la ejecucion y se puedan observar los resultados.

 

8)    Correr la aplicación. Observar como el recurso, en este caso el uso de la salida de consola, es accedido de a una thread por vez.

 

9)    Modificar la cantidad de threads que acceden al semaforo por vez, cambiando la linea:

 

sem = new Semaphore(2, 2, "ElSemaforo");

 

Observar las diferencias con la ejecución anterior.


Generics

 

Objetivos

 

El objetivo de este lab es comprender el uso de los Generics, a partir de la implementacion de una lista generica (First In Last Out), y su utilizacion. Ademas, permitirá un acercamiento con Visual Studio 2005.

 

Duración Aproximada

 

45 minutos

 

Pasos:

 

1) Crear una nueva aplicación tipo consola, en c#, en la carpeta Labs, con el nombre “GenericsLab”.

 

2) Agregar una nueva clase al proyecto, con el nombre de ListaGenerica

 

3) Esta clase debe implementarse como genérica, por lo tanto, al declararla debe aparecer como:

 

public class ListaGenerica<T>

 

4) La lista debe contener nodos. Cada nodo tiene su dato, que será del tipo T, y deberá poder conocer al proximo nodo (Next) para poder implementar la lista del tipo FILO. Completar la siguiente clase para implementar dicho nodo:

 

  protected class Nodo

        {

// Implementar las properties Next y Data para estos

// fields

public Nodo next;

            private T data;

           

            public Nodo(T t)

            {

//Implementar constructor

            }

        }

 

5) Ahora que disponemos de un Nodo, la clase lista genérica debe conocer solo a uno, el nodo head:

 

protected Nodo head;

 

6) La lista debe implementar dos metodos, Agregar y Sacar. El primero agregar un elemento del tipo T, creando un nuevo nodo y dejandolo como head, y el segundo devuelve un elemento del tipo T, eliminando el nodo head y dejando como head el nodo que esta referenciando el antiguo.

 

  // Agrega un nodo en el tope de la lista

        public void Agregar(T t)

        {

// Instanciar un nuevo nodo, y agregarlo como head

// Tener en cuenta que el actual Head debe quedar

// Referenciado como Next desde el nuevo nodo

        }

 

        // Obtiene el dato del primer nodo de la lista

        // y lo elimina

        public T Sacar()

        {

// Devuelve Data del nodo head, luego

// Tiene que dejar como head el nodo referenciado como

// head. Tener en cuenta que es posible que no haya

// elementos en la lista, por lo que el valor de devolucion // en ese caso, debe ser default(T);

        }

 

7) Por ultimo, debe implementarse el método GetEnumerator, de IEnumerator<T>, para poder realizar un foreach por los valores de la lista.

 

  // Implementa el GetEnumerator

        // Devuelve un IEnumerator<T> para poder hacer

        // un foreach de la lista

        public IEnumerator<T> GetEnumerator()

        {

            Nodo current = head;

 

            while (current != null)

            {

                yield return current.Data;

                current = current.Next;

            }

            // La lista fue vaciada

            head = null;

        }

 

8) La clase ListaGenerica<T> esta terminada. En Main, crear varias listas, de diferentes tipos, ingresar datos con el método Agregar, y sacandolos con los metodo Sacar, y con un foreach. Mostrar los resultados por pantalla. Observar que ocurre cuando se trata de sacar valor de una lista vacia ( uso del default(t) ).

 


Métodos Anónimos

 

Objetivos

 

El objetivo de este lab es comprender el uso de anonymous methods, a partir de la implementacion de un ejemplo simple de calculo de bonus en funcion de ventas para un grupo de empleados.

 

Duración Aproximada

 

20 minutos

 

Pasos:

 

1) Crear una nueva aplicación tipo consola, en c#, en la carpeta Labs, con el nombre “AnonymousDelegatesLab”.

 

2) Definir el método delegate:

 

// Define el método delegate

      delegate decimal CalcularBonus(decimal ventas);

 

3) Definir la clase que utilizará ese método:

     

            // Define Empleado

     class Empleado

     {

                  public string nombre;

      public decimal ventas;

      public decimal bonus;

      public CalcularBonus algoritmo_calculo;

}

 

4) Dentro de la clase Program, definir un metodo para calculo de bonus. Este método no es anónimo:

 

        // Este es el método con nombre

// define una posible implementacion del algoritmo de   calculo   // de bonos

        static decimal CalcularBonusComun(decimal ventas)

        {

            return ventas / 10;

        }

 

5) Dentro de Main, definir un multiplicador. Esta es una variable local que será utilizada por el anonymous delegate para calcular el bonus.

 

decimal multiplicador = 2;

 

6) Definir los dos delegates, uno que utilizara un método con nombre, que se definió arriba, y otro que utilizará un método anónimo.

 

     // Delegate definido con el método que no es anonimo.

     CalcularBonus bonus_comun = new CalcularBonus(CalcularBonusComun);

 

// Este Delegate es anonimo, no hay un metodo con nombre definido

// Define un algoritmo de calculo alternativo

CalcularBonus bonus_mejorado = delegate(decimal ventas) { return multiplicador * ventas / 10; };

 

7) Crear un array de 4 empleados, a cada uno ponerle nombre y un valor de ventas. A dos, asignarles como algoritmo de calculo bonus_comun, y a dos bonus_mejorado.

 

8) Crear un método estatico que calcula los bonus:

 

public static void CalcularBonus(Empleado empleado)

{

// Este metodo usa al delegate guardado en empleado para realizar el

// calculo

// Notar que conoce el valor de la variable local multiplicador, a

// pesar de que

// la misma esta fuera del alcance del metodo.

  empleado.bonus = empleado.algoritmo_calculo(empleado.ventas);

}

 

9) Crear un método para el display del nombre de un empleado y el valor de bonus.

 

10)Desde el Main, llamar a ambos métodos, para cada uno de los empleados, y observar como, para cada empleado, se llama al delegate correspondiente, usando o sin usar un método con nombre.