jueves, 29 de julio de 2010

[ADO.NET] Transacciones con DataSet

Una vez que en el artículo anterior se mostró cómo se pueden obtener datos a través de ADO.NET, ahora es momento de comprobar cómo se pueden realizar operaciones con dichos datos.

Es necesario recordar el trabajo que puede suponer el realizar operaciones con diferentes consultas, en especial si la cantidad de lógica de negocio a representar es bastante grande y/o compleja. A través de DataSet y con el DataGridView vamos a comprobar lo sencillo que puede resultar agregar, borrar y actualizar datos sin necesidad de escribir todo ese código.

En primer lugar, partiremos del artículo anterior y veamos qué nos puede ofrecer el DataGridView:

image

Disponemos de varias casillas para marcar, en la que habilitamos la adición, edición y actualización de las filas, además de  poder reordenarlas a nuestro gusto. Esto simplemente significa que podemos una vez obtenidos los datos, hacer clic en cualquier fila y comenzar a editarlos. Evidentemente se disponen de eventos adecuados y sería responsabilidad del diseñador administrar este tipo de permisos para evitar efectos indeseados. Pero por ahora, vayamos al código. Del mismo modo que en antes tuvimos que crear una función que obtenga los datos y los inserte en un DataSet, ahora vamos a extraer el DataSet empleado en el DataGridView, que es el que hemos usado y vamos a actualizar todos los cambios que se hayan hecho en la BD:

   1: Conexion.AbreConexion();
   2: SqlDataAdapter dataAdapter = new SqlDataAdapter("select * from Jugador", Conexion.Instancia);
   3: SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);
   4: dataAdapter.InsertCommand = commandBuilder.GetInsertCommand();
   5: dataAdapter.DeleteCommand = commandBuilder.GetDeleteCommand();
   6: dataAdapter.UpdateCommand = commandBuilder.GetUpdateCommand();
   7:  
   8: dataAdapter.Update(dataset, "Jugador");

En primer lugar creamos la selección (obtener todos los jugadores) y al DataAdapter le añadimos los sucesivos comandos que vamos a emplear a través del CommandBuilder. Por último, invocamos que se actualice la consulta efectuada con el DataAdapter con los datos del DataSet indicando además el nombre de la tabla de la BD. Con este código, ya tenemos resueltas las tres operaciones. Además, el DataSet incorpora flags en las filas para saber cuáles se han alterado (bien sea por adición, actualización o eliminación) de modo que no se realice transacción alguna por aquellas filas que no han sufrido cambios.

Por último, queda simplemente invocar la función anterior a través de la interfaz para que se ejecute. Disponemos de diversos modos, pudiendo usar por ejemplo los eventos de DataGridView que identifican los cambios en las filas modificadas o bien mediante un botón. En este caso emplearemos el botón, y en su evento OnClick tendremos el siguiente código:

   1: CAD.Equipo.ActulizarJugadores(dataset);

De modo que le pasemos el DataSet y así pueda actualizar los cambios. Vaya diferencia de código respecto al modo clásico, ¿no? Pues los siguiente artículos sobre Entity Framework serán acojonantes :)

[ADO.NET] Obtener datos con DataSet

Siguiendo con la línea de artículos de la parte de acceso a datos del .NET Framework, en el presente mostraré cómo se pueden obtener datos y trabajar con ellos a través de un DataSet. Nuestro objetivo primero será obtener los datos de los jugadores de todos los equipos. Para ello emplearemos un SqlDataAdapter a través del cual ejecutaremos la consulta SQL que deseemos y posteriormente con los datos obtenidos, rellenaremos un DataSet:

   1: DataSet jugadores = new DataSet();
   2:  
   3:             try
   4:             {
   5:                 Conexion.AbreConexion();
   6:                 SqlDataAdapter dataAdapter = new SqlDataAdapter("select * from Jugador", Conexion.Instancia);
   7:  
   8:                 dataAdapter.Fill(jugadores);
   9:                 jugadores.Tables[0].TableName = "Jugador";
  10:  
  11:             }

Una vez hemos rellenado nuestro DataSet, podemos ajustar varios parámetros, entre ellos el nombre de la tabla. Esto es importante porque podemos montar en un mismo DataSet varias tablas y relacionarlas entre ellas, por lo que es conveniente ajustar el nombre de las mismas de un modo que el programador les resulte familiar y sea acorde a la representación de datos con la que trabaja. En nuestro caso y al tener una única tabla, le asignaremos el nombre de “Jugador”.

Al ejecutar esta función, devolveremos el DataSet resultante de la consulta. ¿Y esto como se puede manejar en la interfaz? Usaremos la herramienta DataGridView:

image

Este control permite representar una tabla de filas y columnas. Se puede enlazar directamente con DataSets que podemos crear a través de un asistente al que podemos acceder a través del propio DataGridView cuando lo insertamos en una ventana:

image

En nuestro caso como ya tenemos el código que nos va a devolver el DataSet, nos olvidamos del asistente y creamos un objeto DataSet en la ventana que permita trabajar en modo desconectado con los datos proporcionados. Añadimos un botón para invocar a la función anterior y asignar el DataSet cargado a nuestro DataGridView:

   1: dataset = CAD.Equipo.ObtenerJugadores();
   2: dataGridView1.DataSource = dataset.Tables[0];

En este punto es importante recordar que DataSet no es una tabla ni una consulta, es una representación del estado de los datos obtenidos en su conjunto, por lo que debemos especificar qué tabla queremos mostrar. En este caso mostramos la primera tabla (puesto que tiene el índice 0) pero también hubiéramos podido obtener la tabla a través de su propio nombre:

   1: dataset = CAD.Equipo.ObtenerJugadores("fcb");
   2: dataGridView1.DataSource = dataset.Tables["Jugador"];

A partir de ejecutar dicho código, en nuestro DataGridView obtendremos exactamente las mismas columnas que tenemos en la tabla de Jugador en la BD. Todo esto se puede especificar, bien a través de la obtención de los datos o bien a través de personificar el DataGridView para que muestra sólo aquellas columnas que se requieran.

miércoles, 28 de julio de 2010

[VS2010] Call Hierarchy

En estos días estoy actualizándome un poco y pasando a Visual Studio 2010. De todas las novedades que incluye además del apartado visual hay dos que me han llamado la atención, siendo una de ellas la herramienta Call Hiearchy.

Esta herramienta nos proporciona como su propio nombre indica la secuencia de llamadas de una propiedad o método de una clase. Veamos un ejemplo:

Vamos a analizar qué llamadas se realizan al método AbreConexión y qué llamadas se realizan desde dicho método hacia otros objetos. Para ello, abrimos la clase Conexion y nos situamos sobre el método que queremos analizar. Pulsamos el botón derecho sobre su nombre de modo que nos aparezca el siguiente menú contextual:

image

Nos desplazamos hacia la opción de View Call Hiearchy y se abrirá la siguiente ventana:

image

Como se aprecia está distribuida en dos zonas. En primer lugar a la izquierda aparecen las llamadas y a la derecha las secciones de código dentro de cada método seleccionado a la izquierda donde aparece la referencia a nuestro método/propiedad a analizar. Si hacemos doble clic sobre cualquier elemento, nos llevará automáticamente al código referenciado y si hacemos clic con el botón derecho, aparece lo siguiente:

image

Con Go To Definition se aplica lo que mencioné en el anterior párrafo. Con Find All References el IDE busca todas las referencias a ese método/propiedad. Si por el contrario seleccionamos Add as New Root podremos añadir a la lista de jerarquías dicho método/propiedad a analizar. En la imagen de ejemplo, he decidido analizar las llamadas en las que interactúa el método AltaEquipo y como se parecia, aparece como una nueva raíz.

Por último, sólo me falta resaltar que es una novedad muy interesante, ya que para aquellas situaciones en las que se deba realizar un análisis del código o de una determinada función, permitirá ayudar bastante y tener todo de un modo más ordenado.

viernes, 16 de julio de 2010

[ADO.NET] DataSet

Siguiendo con el taller de ADO, ahora vamos a aplicar el potencia de una de las herramientas más importantes de la versión 2.0 de .NET Framework: El dataset.

Hasta ahora hemos estado viendo cómo acceder a los datos a través de entidades que permiten que permiten aplicar casi directamente los comandos de SQL sobre la base de datos. La opción propuesta por Microsoft desde .NET Framework como alternativa es el DataSet, que nos aporta las siguientes características:

Está diseñado para el acceso a datos independientemente del origen de datos e incluso se puede emplear con distintos orígenes al mismo tiempo. Además, es totalmente serializable con XML, lo que permite que esa muy apto para comunicar nuestro sistema con entidades externas.

Internamente el DataSet se componen de una colección de DataTable, formados por filas y columnas de datos junto con información propia de la tabla (identificador, nombre, claves principales, claves ajenas, etc)

En el diagrama siguiente se ilustra la relación entre un proveedor de datos de .NET Framework y un DataSet.

image

Y a continuación se muestra el modelo de datos del DataSet:

image

  • DataRelationCollection: Una colección de relaciones representadas por la entidad DataRelation. Enlaza una DataTable con otra a través de sus relaciones como si fuera una base de datos relacional. Estas relaciones pueden se pueden modificar y alterar en función de nuestras necesidades.
  • DataTableCollection: Una colección de DataTables. Cada tala tiene sus columnas ( DataColumnCollection), filas ( DataRowColletion ), restricciones ( Constraints ). Es de señalar algo muy importante que ocurre con las DataRow, que almacenan el estado original y actual de modo que puede detectar cambios en los valores almacenados.
  • ExtendedProperties: Como se apreciamos en el modelo de datos este componente se repite varias veces. ExtendedProperties no es más que un PropertyCollection en la que podemos colocar información personalizada, como por ejemplo la instrucción select que empleamos para generar los datos, la hora en que se generaron, etc.

En los próximos artículos pondré ejemplos de cómo trabajar con DataSets.

[eMeS] Mecánicas de Iredia: The Atram’s Secret

Hace poco publicamos un video mostrando algunas de las mecánicas, que tengo el placer de enlazar:

Como siempre, el juego está ahora mismo en playtest y hay multitud de pequeñas cosas que se están depurando para que dentro de poco, muy poco se pueda desargar del bazar de XBOX Live.

Ya veo la luz, y quién me diría a mí que podría trabajar en un videojuego y publicarlo para XBOX360 hace 3 años…