Archive for the ‘Uncategorized’ Category

Formulario con Forma (Form Form) en VB.NET

Sunday, March 22nd, 2009
  Bueno, el otro día leí un articulo sobre el espacio de nombre Drawing y me di cuenta que con este espacio de nombre podría lograr muchas cosas para la apariencia en mi aplicaciones y una de ellas es darle forma (redonda, ovalada), fin la que se nos antoje. En este caso yo probé dándole una forma redonda.  
 
     
  Aquí muestro el pedazo o los pedazos de código para lograr esto, imagen 1.

Como se puede apreciar en la imagen, hay dos eventos (LoadKeyPress) los dos para el Formulario, el Load lo hago para que cuando inicie la aplicación, el formulario adquiera la forma siguiente forma, imagen 2.

Y el evento KeyPress para que cuando al presionar cualquier tecla se salga de la aplicación.

Bueno esa es una de las tantas formas que le podemos dar a un formulario, el truco esta en el tamaño que le asignemos a nuestra elipse. 

Espero que haya sido de su agrado y le invito a seguir desarrollando en esta poderosa herramienta

 
Imagen 1


Imagen 2

 
     
 

Fuente: http://www.netveloper.com/contenido2.aspx?IDC=258_0

TDD Paso a Paso utilizando VSTS

Sunday, March 22nd, 2009

Introducción
Desde hace un tiempo eXtreme Programming ha comenzado a cambiar los hábitos clásicos de los equipos de desarrollo. Uno de los pilares de esta metodología se centra sobre el aumento de la productividad de los equipos de desarrollo. Este aumento se puede lograr (en gran parte) si los equipos trabajan utilizando una nueva técnica de trabajo denominada Test Development Driven (TDD). 

Hace unos meses, configurar un entorno TDD, era una tarea complicada; pero desde la llegada de Visual Studio 2005 y Team Foundation Server (TFS), esta tarea se simplifica muchísimo. 

Luego de estar probando durante mucho tiempos las versiones Beta de estos productos, finalmente pude participar en un proyecto donde aplicásemos una metodología ágil, integrados con TFS. 

El objetivo de este artículo es demostrar paso a paso como se puede utilizar Visual Studio Team System, en un proceso de desarrollo ágil, que contemple la creación de un componente, sus pruebas y los sucesivos pasos de integración hasta el proceso de Continuous Integration.

Creación de un componente de ejemplo

Lo primero que haremos es crear un nuevo proyecto Visual Basic Net (imagen 1), para esto abrimos Visual Studio y seleccionamos las siguientes opciones:

1. Menú File -> New -> Project
2. Seleccionamos Visual Basic, y dentro la opción Windows; el tipo de proyecto seráClass Library
3. Definimos el nombre del proyecto; a modo de ejemplo lo hemos llamadoTDDEjemplo

Dentro de nuestro proyecto renombramos la clase con el nombre “Labs” y agregamos el siguiente código de ejemplo:


Public Class Labs

 ” 
 ” Obtiene un mensaje de informacion
 ” 
 ” Obtiene un mensaje de informacion
 Public Function ObtenerInformacion() As String
  Return “Hola Mundo”
 End Function

 ” 
 ” Retorna el nombre completo a partir de un Nombre y un Apellido
 ” 
 ” Nombre
 ” Apellido
 ” Retorna el nombre completo a partir de un Nombre y un Apellido
 Public Function CrearNombreCompleto(ByVal Nombre As String, ByVal Apellido As String) As String
  Return Nombre & “, ” & Apellido
 End Function

End Class

Hemos agregado 2 funciones ObtenerInformacion y CrearNombreCompleto, que utilizaremos para integrar nuestro proyecto de pruebas en un proceso TDD.

Creación de un proyecto de pruebas unitarias

El siguiente paso es crear un proyecto que nos permita probar la funcionalidad del proyecto TDDEjemplo. Para eso crearemos una serie de pruebas unitarias (Unit Tests), que servirán como base para evaluar el funcionamiento correcto de las funciones que creamos en el paso anterior. Para esto posicionamos el cursor en la línea de definición de una de las funciones y desplegamos el menú contextual, y seleccionamos la opción Create Unit Tests

Nota: otra de las opciones que poseemos es la opción Rename, esta opción nos permite renombrar el nombre de la función y reemplazar este nombre en todos los lugares donde se utilice la función. Esta acción es un caso de Refactoring.

El siguiente formulario nos permite seleccionar las funciones sobre las cuales queremos crear los Tests unitarios. En este caso seleccionamos ambas funciones


Selección de funciones para las pruebas unitarias

Las funciones con los Tests unitarios se crearan en un nuevo proyecto, en la opción para definir el nombre ingresamos TDDEjemploTest

Esta opción nos agrega un nuevo proyecto a la solución y le agrega como referencia el proyecto TDDEjemplo, además agrega dentro de la solución una serie de nuevos elementos.


Solución con el nuevo proyecto de pruebas

En el nuevo proyecto de pruebas, se ha creado una clase LabsTest.vb que posee las siguientes pruebas unitarias;

Clase Labs.vb&nbps;&nbps;&nbps;Clase LabsTests.vb
ObtenerInformacion&nbps;&nbps;&nbps;&nbps;&nbps;ObtenerInformacionTest
CrearNombreCompleto&nbps;&nbps;&nbps;&nbps;&nbps;CrearNombreCompletoTest

Las nuevas funciones utilizan la libreríaMicrosoft.VisualStudio.QualityTools.UnitTestFramework, que ha sido incluida dentro de la suite de Visual Studio 2005, para la ejecución de pruebas unitarias. El asistente crea las nuevas funciones implementando una llamada a la función que se quiere probar y generando el código necesario para el mismo. 

Por ejemplo la función CrearNombreCompletoTest; incluye la definición de las variables Nombre y Apellido, adicionalmente se agrega como tarea inicializar los valores de estas variables. 


 ”
 ”A test for CrearNombreCompleto(ByVal String, ByVal String)
 ”
  _
 Public Sub CrearNombreCompletoTest()
  Dim target As Labs = New Labs
  Dim Nombre As String = Nothing ‘TODO: Initialize to an appropriate value
  Dim Apellido As String = Nothing ‘TODO: Initialize to an appropriate value
  Dim expected As String = Nothing
  Dim actual As String
  actual = target.CrearNombreCompleto(Nombre, Apellido)
  Assert.AreEqual(expected, actual, “TDDEjemplo.Labs.CrearNombreCompleto did not return the expected value.”)
  Assert.Inconclusive(“Verify the correctness of this test method.”)
 End Sub

Para poder probar esta función completaremos los valores de estas variables y también la variable expected, que es la que almacena el valor esperado para luego comparar con el resultado de la ejecución de la prueba. 

El código final quedaría como en el siguiente ejemplo:


 ”
 ”A test for CrearNombreCompleto(ByVal String, ByVal String)
 ”
  _
 Public Sub CrearNombreCompletoTest()
  Dim target As Labs = New Labs

  Dim Nombre As String = “Bruno”
  Dim Apellido As String = “Capuano”
  Dim expected As String = “Bruno, Capuano”
  Dim actual As String

  actual = target.CrearNombreCompleto(Nombre, Apellido)

  Assert.AreEqual(expected, actual, “TDDEjemplo.Labs.CrearNombreCompleto did not return the expected value.”)

 End Sub

 ”
 ”A test for ObtenerInformacion()
 ”
  _
 Public Sub ObtenerInformacionTest()
  Dim target As Labs = New Labs

  Dim expected As String = “Hola Mundo”
  Dim actual As String

  actual = target.ObtenerInformacion

  Assert.AreEqual(expected, actual, “TDDEjemplo.Labs.ObtenerInformacion did not return the expected value.”)

 End Sub

Nota: el generador de pruebas unitarias agrega además de la prueba de la función la siguiente sentencia Assert.Inconclusive(…), para verificar que se complete el código de la prueba unitaria; esta línea debe ser eliminada luego de implementada la prueba unitaria ya que la misma no retornará un resultado exitoso si se deja esta llamada.

Una vez que hemos completado la definición de las prueba unitarias podemos ejecutar las mismas para evaluar si nuestro componente TDDEjemplo.Labsfunciona correctamente. Para lanzar el proceso de ejecución de pruebas unitarias debemos seleccionar:

Menú Test -> Start Selected Test Project with Debugger

Si no hemos cometido ningún error y las pruebas validan esta definición, el resultado debe ser exitoso y lo podremos visualizar en la ventana de Test Results;


Ejecución exitosa de las pruebas unitarias.

Si en cambio hemos tenido algún error o hemos dejado la llamadaAssert.Inconclusive(…), podremos ver alguno de los siguientes resultados:

                                                                Fuente: http://www.netveloper.com/contenido2.aspx?IDC=307_0

Tratamiento de Errores haciendo uso de excepciones en Visual Basic .NET (Valido para las versiones 2003 y 2005 de VS.NET)

Sunday, March 22nd, 2009
  En este articulo mostrare como evitar y manejar errores desde VB.NET utilizando los Bloques Try,Catch, Finally y la condicionante If..Then..Else. Anteriormente cuando desarrollábamos una aplicación en VB6 tratábamos los errores o mejor dicho evitábamos un desborde de nuestra aplicación utilizando “On Error Resume Next” y esto nos ayudaba a que no se desbordara la aplicación.  
 
     
  Eso lo hacíamos más o menos así. (Ejemplo en VB6)

Private Sub cmdOk_Click( ) 

 On Error Resume Next
 If TextBox1.Text = 2 Then
  cmd.Write(TextBox1.Text)
 End If

End Sub 

Ciertamente aquí nos tiene que dar un error seguro, ya que “cmd.Write” no es parte de la sintaxis de VB6, en caso de que no hubiésemos tenido “On Error Resume Next” pues la aplicación sufriría un desbordamiento.

Aunque en .NET todavía podemos usar esta forma, lo que se nos aconseja es que utilicemos “Try Catch”. Vamos a ver un ejemplo de una ConsoleApplication.


Sub Main()

Dim i As Integer
Dim j As Integer

Try
 ’Dentro de este bloque ponemos el codigo que 
 ’necesitamos evaluar
 i = 10
 j = 0
 Dim res As Integer
 res = i / j
 System.Console.WriteLine(“El Resultado es:” & res)
Catch ex As Exception
 ’Aqui nos indicara el origen del error
 System.Console.WriteLine(ex.Message)
Finally
 System.Console.ReadLine()
End Try

End Sub

Como podemos ver en el codigo (el cual esta comentado), se generara un error ya que estamos intentando dividir una cantidad por cero (0) y esto matematicamente es imposible. Luego el Bloque “Catch” entra en funcion con el mensaje de excepcion y nos presenta el suguiente mensaje en pantalla, imagen 1.

En caso de que sacaramos el codigo del “Try Catch” pasaria lo siguiente, imagen 2.

Nos aparece este mensaje de error el cual no nos dejara compilar nuestra aplicación.

Pero esto es con valores los cuales podemos controlar facilmente porque lo ponemos nosotros mismos, pero que pasaria con una cantidad que introduzca el usuario del sistema, para ver este caso crearemos una WindowsApplication.

El Formulario se vera asi.

El mensaje de error como el del resultado de la operación (division) seran presentandos en un MessageBox.

Este seria el codigo de la aplicación.

Private Sub btnDividir_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnDividir.Click

‘Declaramos y asignamos los valores de entrada
‘los cuales los definira el usuario
Dim i As Integer = Val(Me.txtPR.Text)
Dim j As Integer = Val(Me.txtSR.Text)

Try
 ’Declaramos la variable del resultado
 Dim res As Integer
 ’Realizamos la operacion
 res = i / j
 ’Mostramos el resultado de la operacion en pantalla
 MessageBox.Show(“El Resultado es:” & res)
Catch ex As Exception
 MessageBox.Show(ex.Message)
End Try

End Sub

La diferencia a simple vista no es mucha pero si nos fijamos esta vez el usuario definira la cantidad, pero con esto no es que todo esta hecho hay otras cosas que tenemos que tomar en cuenta, por ejemplo, si el usuario en vez de numeros introduce letras, la operación no se daria, esto lo podemos hacer utilizano “Not IsNumeric(objeto)” dentro de una condicion “If…Then…Else” la cual puede ir dentro del Bloque “Try Catch

Veamos el Codigo.

Private Sub btnDividir_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnDividir.Click

‘Declaramos y asignamos los valores de entrada
‘los cuales los definira el usuario
Dim i As Integer = Val(Me.txtPR.Text)
Dim j As Integer = Val(Me.txtSR.Text)

Try

 ’En caso de no sea numerico el dato introducido
 If Not IsNumeric(Me.txtPR.Text) Then
  MessageBox.Show(“El Primer Rango debe ser numerico”, “Dato numerico”)
  ’Limpia la entrada
  Me.txtPR.Clear()
  ’Enfoca para una nueva entrada
  Me.txtPR.Focus()
  ’Con esto los que hago es dividir la ejecucion de cada subrutina
  ’para evitar una sobrecarga en la condicion
  Exit Sub
 ElseIf Not IsNumeric(Me.txtSR.Text) Then
  MessageBox.Show(“El Segundo Rango debe ser numerico”, “Datos numerico”)
  Me.txtSR.Clear()
  Me.txtSR.Focus()
  Exit Sub
 Else
  ’Declaramos la variable del resultado
  Dim res As Integer
  ’Realizamos la operacion
  res = i / j
  ’Mostramos el resultado de la operacion en pantalla
  MessageBox.Show(“El Resultado es:” & res)
 End If

Catch ex As Exception
 MessageBox.Show(ex.Message)
End Try
End Sub

La aplicación en caso de que utilizemos letras en lugar de numeros para realizar la operación matematica nos mostrara el siguiente error.

En caso de que el usuario haya introducido bien los datos, mostrara el resultado de la siguiente manera.

En conclusion, la diferencia que podemos constatar al realizar una WindowsApplication como una ConsoleApplication es que.

La ConsoleApplication: en esta el error es provocado por nosotros mismos y asi es demasiado facil predecir el error y evitarlo, aun sin tener que utilizar excepciones.

La WindowsApplication: aquí es diferente ya que los datos son introducidos por el usuario y de no utilizar las excepciones el programa nos daria un error de desbordamiento “muy feo” sacando al usuario del mismo. 

Pues bien, esto es solo una parte de lo que es el tratamiento de errores en .NET, espero que este articulo les haya sido de utilidad, que esa es la intencion

 
Imagen 1


Imagen 2

 
     
 

 Fuente: http://www.netveloper.com/contenido2.aspx?IDC=304_0

Saber que versión del .NET Framework estamos utilizando

Sunday, March 22nd, 2009
En primer lugar saludos a toda la comunidad de desarrolladores de .NET y los que no son de .NET también, en este artículo (el cual es muy sencillo) pretendo mostrar un uso muy importante que nos brinda la clase Environment, esta nos permite revisar que versión del framework tenemos instalado en nuestro equipo.  
 
     
  En caso que sea desde una WindowsApplication

Sin mas preámbulos nos dirigimos a lo que nos interesa el código, este lo podemos hacer desde un Button.

Código en VB.NET

Private Sub btnVer_Click(ByVal sender As System.Object, _
 ByVal e As System.EventArgs) Handles btnVer.Click

 ’Mostramos la informacion en un MessageBox
 MessageBox.Show(“La Versión del Framework:” & ” ” & Environment.Version.ToString, “Saber Versión del Framework”)

End Sub

La informacion en pantalla se mostrara de la siguiente manera

En caso de que la quieras mostrar en una ConsoleApplication

El Codigo es el siguiente

Sub Main()
 ’Accedemos mediante el Metodo “WriteLine”
 System.Console.WriteLine(“La Versión del Framework es:” & ” ” & Environment.Version.ToString())
 ’Usamo el Metodo “ReadLine” para leer la cadena que envia “WriteLine”
 System.Console.ReadLine()
End Sub

La Aplicacion corriendo se veria asi.

El porque de esto: Con la salida de VS.NET la programacion Windows dio un giro de 360 grados en cuanto a Performance, Codigo manejado, Diseño y Estructura y algo muy importante Distribucion, asi es, a la hora de distribuir nuestro ejecutable debemos verificar que este corra bajo el mismo Framework en el que fue trabajado, ademas esto lo podemos agregar como una caracteristica utilitaria a las aplicaciónCliente/Servidor que realicemos.

   
   

Fuente: http://www.netveloper.com/contenido2.aspx?IDC=301_0

Herencia en VB.NET (Aplicada al diseño de Form)

Sunday, March 22nd, 2009
  No se trata de dinero ni nada por el estilo, es que en la programación orientada a objetos (POO) existe algo que los lenguajes utilizan llamado “Herencia” que al igual como nosotros heredamos características de nuestros padres, en este caso en VB.NET se hereda la misma forma en el diseño de los Formularios. Esto de la herencia no es nuevo ya lenguajes como JAVA lo vienen implementando desde sus comienzos.  
 
     
  Pero si es nuevo (y de paquete) para los lenguajes de Microsoft y en este caso los lenguajes de .NET (VB,C#,C++), excluyo al JSharp(J#), porque es un derivado de JAVA y este ya lo usa desde sus comienzos. Este tema puede tornarse muy complicado según vamos avanzando en el, pero, esta vez no nos complicaremos la vida y veremos la herencia de diseños de Forms.

Lo primero que debemos hacer es abrir nuestro Visual Studio .NET 2003, luego, elegimos el lenguaje que vayamos a usar (en este caso será Visual Basic (VB)), elegimos WindowsApplication (o Windows Forms).

Una vez ya hayamos hecho esto, procedemos a darle una forma como esta al Formulario Padre que es del cual vamos a heredar la forma. Tendrá un aspecto como este:

Luego de que terminemos de darle ese aspecto (ese fue el que yo le di, si quieres puedes darle el que se te antoje). Procedemos a agregar otro WindowsForm y luego que ya lo tengamos agregado a nuestro Proyecto o Solución identificamos una parte de código que se llama Inherits System.Windows.Forms.Form, este es el que trae por defecto solo le cambiamos lo que sigue después de Inherits por el nombre del Formulario que queramos heredar, en este caso será el Form1.vb, seria de esta manera: Inherits Form1

Luego compilamos en modo Debug que es un modo de prueba revisamos elForm2 y tendra el mismo aspecto que el Form1 veamos la siguiente imagen.

Luego que hayamos terminado esto, si nos fijamos el Formulario Hijo hereda la misma forma que el Formulario Padre pero hay que tener en cuenta varias cosas.

1. No se hereda código de ningún objeto

2. Al realizar el “Inherits” el Formulario que hereda tendrá todos los elementos bloqueados, para solucionar esto nos dirigimos al Formulario Padre (Form1) y en este los objetos tienen una propiedad que se llama Modifiers que trae por defecto Friend le decimos que es igual a Protected y listo (esto es a cada uno de los objetos que queramos heredar), luego compilamos nuevamente en modoDebug , revisamos y ya estos estarán disponibles para poder editarlos y usarlos

NOTA: no puedes cambiarle el nombre ya que el interpretador de código del Framework se guía por ahí, para poder hacer la identificación del objeto en herencia y el correcto funcionamiento de este.

   
     
 

Fuente: http://www.netveloper.com/contenido2.aspx?IDC=302_0

TDD Paso a Paso utilizando VSTS

Sunday, March 22nd, 2009

Introducción
Desde hace un tiempo eXtreme Programming ha comenzado a cambiar los hábitos clásicos de los equipos de desarrollo. Uno de los pilares de esta metodología se centra sobre el aumento de la productividad de los equipos de desarrollo. Este aumento se puede lograr (en gran parte) si los equipos trabajan utilizando una nueva técnica de trabajo denominada Test Development Driven (TDD). 

Hace unos meses, configurar un entorno TDD, era una tarea complicada; pero desde la llegada de Visual Studio 2005 y Team Foundation Server (TFS), esta tarea se simplifica muchísimo. 

Luego de estar probando durante mucho tiempos las versiones Beta de estos productos, finalmente pude participar en un proyecto donde aplicásemos una metodología ágil, integrados con TFS. 

El objetivo de este artículo es demostrar paso a paso como se puede utilizar Visual Studio Team System, en un proceso de desarrollo ágil, que contemple la creación de un componente, sus pruebas y los sucesivos pasos de integración hasta el proceso de Continuous Integration.

Creación de un componente de ejemplo

Lo primero que haremos es crear un nuevo proyecto Visual Basic Net (imagen 1), para esto abrimos Visual Studio y seleccionamos las siguientes opciones:

1. Menú File -> New -> Project
2. Seleccionamos Visual Basic, y dentro la opción Windows; el tipo de proyecto seráClass Library
3. Definimos el nombre del proyecto; a modo de ejemplo lo hemos llamadoTDDEjemplo

Dentro de nuestro proyecto renombramos la clase con el nombre “Labs” y agregamos el siguiente código de ejemplo:


Public Class Labs

 ” 
 ” Obtiene un mensaje de informacion
 ” 
 ” Obtiene un mensaje de informacion
 Public Function ObtenerInformacion() As String
  Return “Hola Mundo”
 End Function

 ” 
 ” Retorna el nombre completo a partir de un Nombre y un Apellido
 ” 
 ” Nombre
 ” Apellido
 ” Retorna el nombre completo a partir de un Nombre y un Apellido
 Public Function CrearNombreCompleto(ByVal Nombre As String, ByVal Apellido As String) As String
  Return Nombre & “, ” & Apellido
 End Function

End Class

Hemos agregado 2 funciones ObtenerInformacion y CrearNombreCompleto, que utilizaremos para integrar nuestro proyecto de pruebas en un proceso TDD.

Creación de un proyecto de pruebas unitarias

El siguiente paso es crear un proyecto que nos permita probar la funcionalidad del proyecto TDDEjemplo. Para eso crearemos una serie de pruebas unitarias (Unit Tests), que servirán como base para evaluar el funcionamiento correcto de las funciones que creamos en el paso anterior. Para esto posicionamos el cursor en la línea de definición de una de las funciones y desplegamos el menú contextual, y seleccionamos la opción Create Unit Tests

Nota: otra de las opciones que poseemos es la opción Rename, esta opción nos permite renombrar el nombre de la función y reemplazar este nombre en todos los lugares donde se utilice la función. Esta acción es un caso de Refactoring.

El siguiente formulario nos permite seleccionar las funciones sobre las cuales queremos crear los Tests unitarios. En este caso seleccionamos ambas funciones


Selección de funciones para las pruebas unitarias

Las funciones con los Tests unitarios se crearan en un nuevo proyecto, en la opción para definir el nombre ingresamos TDDEjemploTest

Esta opción nos agrega un nuevo proyecto a la solución y le agrega como referencia el proyecto TDDEjemplo, además agrega dentro de la solución una serie de nuevos elementos.


Solución con el nuevo proyecto de pruebas

En el nuevo proyecto de pruebas, se ha creado una clase LabsTest.vb que posee las siguientes pruebas unitarias;

Clase Labs.vb&nbps;&nbps;&nbps;Clase LabsTests.vb
ObtenerInformacion&nbps;&nbps;&nbps;&nbps;&nbps;ObtenerInformacionTest
CrearNombreCompleto&nbps;&nbps;&nbps;&nbps;&nbps;CrearNombreCompletoTest

Las nuevas funciones utilizan la libreríaMicrosoft.VisualStudio.QualityTools.UnitTestFramework, que ha sido incluida dentro de la suite de Visual Studio 2005, para la ejecución de pruebas unitarias. El asistente crea las nuevas funciones implementando una llamada a la función que se quiere probar y generando el código necesario para el mismo. 

Por ejemplo la función CrearNombreCompletoTest; incluye la definición de las variables Nombre y Apellido, adicionalmente se agrega como tarea inicializar los valores de estas variables. 


 ”
 ”A test for CrearNombreCompleto(ByVal String, ByVal String)
 ”
  _
 Public Sub CrearNombreCompletoTest()
  Dim target As Labs = New Labs
  Dim Nombre As String = Nothing ‘TODO: Initialize to an appropriate value
  Dim Apellido As String = Nothing ‘TODO: Initialize to an appropriate value
  Dim expected As String = Nothing
  Dim actual As String
  actual = target.CrearNombreCompleto(Nombre, Apellido)
  Assert.AreEqual(expected, actual, “TDDEjemplo.Labs.CrearNombreCompleto did not return the expected value.”)
  Assert.Inconclusive(“Verify the correctness of this test method.”)
 End Sub

Para poder probar esta función completaremos los valores de estas variables y también la variable expected, que es la que almacena el valor esperado para luego comparar con el resultado de la ejecución de la prueba. 

El código final quedaría como en el siguiente ejemplo:


 ”
 ”A test for CrearNombreCompleto(ByVal String, ByVal String)
 ”
  _
 Public Sub CrearNombreCompletoTest()
  Dim target As Labs = New Labs

  Dim Nombre As String = “Bruno”
  Dim Apellido As String = “Capuano”
  Dim expected As String = “Bruno, Capuano”
  Dim actual As String

  actual = target.CrearNombreCompleto(Nombre, Apellido)

  Assert.AreEqual(expected, actual, “TDDEjemplo.Labs.CrearNombreCompleto did not return the expected value.”)

 End Sub

 ”
 ”A test for ObtenerInformacion()
 ”
  _
 Public Sub ObtenerInformacionTest()
  Dim target As Labs = New Labs

  Dim expected As String = “Hola Mundo”
  Dim actual As String

  actual = target.ObtenerInformacion

  Assert.AreEqual(expected, actual, “TDDEjemplo.Labs.ObtenerInformacion did not return the expected value.”)

 End Sub

Nota: el generador de pruebas unitarias agrega además de la prueba de la función la siguiente sentencia Assert.Inconclusive(…), para verificar que se complete el código de la prueba unitaria; esta línea debe ser eliminada luego de implementada la prueba unitaria ya que la misma no retornará un resultado exitoso si se deja esta llamada.

Una vez que hemos completado la definición de las prueba unitarias podemos ejecutar las mismas para evaluar si nuestro componente TDDEjemplo.Labsfunciona correctamente. Para lanzar el proceso de ejecución de pruebas unitarias debemos seleccionar:

Menú Test -> Start Selected Test Project with Debugger

Si no hemos cometido ningún error y las pruebas validan esta definición, el resultado debe ser exitoso y lo podremos visualizar en la ventana de Test Results;


Ejecución exitosa de las pruebas unitarias.

Si en cambio hemos tenido algún error o hemos dejado la llamadaAssert.Inconclusive(…), podremos ver alguno de los siguientes resultados:


Ejecución con errores de las pruebas unitarias.
Fuente: http://www.netveloper.com/contenido2.aspx?IDC=307_0

Los espacios de nombres de .NET relacionados con acceso a datos

Sunday, March 22nd, 2009
Siempre que hagamos algo en .NET Framework será mediante las clases que este “marco” nos proporciona, esas clases siempre están contenidas en un espacio de nombres (namespace), que no es ni más ni menos que una forma de “contener” las distintas clases que podemos usar, pero de forma más o menos organizada.
De esta forma, las clases de acceso a datos están todas contenidas en el espacio de nombres System.Data. En este espacio de nombres, a su vez existen otros espacios de nombres que contienen clases especializadas según el proveedor de datos que queramos usar, por tanto tendremos espacios de nombres para el acceso a datos de base SQL Server mediante el espacio de nombresSystem.Data.SqlClient o para acceder a bases de datos Oracle, las clases especializadas están incluidas en System.Data.OracleClient, aunque siempre tendremos la posibilidad de acceder de forma genérica usando las clases proporcionadas por el espacio de nombres System.Data.OleDb, las cuales nos permitirán también acceder a las bases de datos de Access.

Las clases para la manipulación de los datos

Estos espacios de nombres especializados nos permiten conectar con la base de datos, traer los datos indicados a la memoria y después de manipularlos, guardarlos en la base de datos, si es que realmente hemos hecho algún cambio, inserción o eliminación.
En este proceso normalmente necesitaremos tanto clases especializadas dependiendo del origen de datos como clases genéricas para la manipulación de los datos en la memoria, (normalmente en forma desconectada). Por ejemplo, para el acceso a una base de datos de SQL Server, necesitaremos un objetoSqlConnection que será el que se encargue de realizar la conexión con la base de datos, un objeto SqlDataAdapter que será el que “realmente” realice la conexión, obtención de datos y finalmente la actualización en la base de datos de los cambios realizados, el objeto DataAdapter a su vez necesita saber cuales son las acciones que debe realizar con la base de datos, desde que datos obtener hasta que acciones deben aplicarse a la hora de actualizar, eliminar o insertar nuevos datos, todas estas acciones se indicarán por medio de comandos, en este ejemplo de acceso a una base de datos del tipo SQL Server, tendremos que usar objetos Command especializados, concretamente objetos del tipo SqlCommanden los que indicaremos las cadena de selección, update, insert y delete a las que, seguramente, ya estamos acostumbrados: SELECT <campos> FROM <tabla> WHERE <condición>.
Para manipular los datos obtenidos, lo habitual será usar un objeto DataSet o bien uno del tipo DataTable, en el primer caso, siempre tendremos uno o más objetos del tipo DataTable, dependiendo de la cadena de selección usadas, es decir, si los datos que queremos manipular afecta a una o más tablas e incluso si esa manipulación afecta a ciertas relaciones entre tablas. Independiente de que usemos una o varias tablas, la información que contiene cada tabla está incluida en filas, (una por cada fila o registro de datos), y cada una de las filas a su vez contiene columnas, pero tanto las tablas, filas o columnas son tipos de datos independientes del origen de datos y las clases que representan estos objetos están contenidas en el espacio de nombres System.Data, particularmente en las clases: DataTableDataRow y DataColumn respectivamente.

Manipulación de datos en modo desconectado

Lo habitual es que la manipulación de datos la hagamos en modo desconectado, que es como sería usando las clases que hemos indicado en el párrafo anterior.
Los pasos a seguir para obtener los datos, trabajar con ellos y finalmente actualizarlos en la base de datos, (independientemente del origen de datos), serían los siguientes:
1.Realizamos la conexión con el origen de datos (objeto del tipo Connection)
2.Asignamos los objetos que correspondan para obtener los datos (comandos Select, Update, Insert y Delete)
3.Obtenemos los datos (mediante un objeto del tipo DataAdapter)
4.Manejamos los datos de forma local (desconectada) usando objetos del tipo DataTable.
5.Actualizamos los datos en la base de datos usando nuevamente el DataAdapter, obteniendo del DataSet o DataTable las filas nuevas, modificadas o eliminadas.

Veamos con ejemplos cómo realizar cada una de estas tareas, tanto para acceder a una base de datos de SQL 
Server como a una de Access, en este último caso, en el ZIP con el código de ejemplo se incluye la base de datos pubs.mdb obtenida a partir de la incluida en los ejemplos de Visual Studio .NET con formato SQL Server.

   
 
Fuente: http://www.netveloper.com/contenido2.aspx?IDC=181_0

Silverlight 2.0 Beta 2 no se integra correctamente con ADO .net Entity Framework

Sunday, March 22nd, 2009
Resumen post:No hace mucho que Microsoft publicó el Service Pack 1 de Visual Studio 2008, uno de las características más esperadas de este service pack es la RTM de ADO .net Entity Framework. ¿ Se integra esta tecnología con Silverlight + WCF? En teoría si, en la práctica…
Post:

No hace mucho que Microsoft publicó el Service Pack 1 de Visual Studio 2008, uno de las características más esperadas de este service pack es la RTM de ADO .net Entity Framework,

En el número de Julio de la revista MSDN Magazine, hay un artículo muy interesante escrito por John Papa: The Entity Framework In Layered Architectures Hay puedes encontrar como montar una arquitectura de ultima generación, utilizando: there you will find how to build up a cutting

 
  • –> Front End / UI (capa de presentación): WPF (Windows Presentation Foundation).
  • –> Service Layer (capa de servicios): WCF (Windows Communication Foundation).
  • –> DAL / Data Access Layer (capa de acceso a datos): ADO .net Entity Framework.

La mayoría de los frikis que leimos este artículo, pensamos: ¡¡ TOOMAAA !! seguro que esto se puede portar a Silverlight, en vez de preguntarnos… Por qué los ejemplos no se han hecho utilizando Silverlight ?.

El tema es que… tu empiezas a construir tu solucion: generas la capa de presentación, expones servicios de WCF y hacemos que se comuniquen con tu frontend Silverlight Beta 2, pero el problema viene cuando intentas serializar entitdades ADO .net, ¿ Por qué es tan importante esta serializacion?:

 
  • –> Una de las características más potentes de ADO .net entity framework es que los objetos de entidad se pueden serializar
  • –> Esto quiere decir que los podemos pasar entre capas, incluso via servicios web.
  • –> Guarda un montón de informacíon util acerca de tu entidad.
  • –> Te libera de tener que hacerte mano tus propias clases de entidad.

Te das cuenta de que las cosas no funciona, cuando añades a tu proyecto Silverlight añades la referencia al servicio WCF e intentas compilar, obtienes el siguiente mensaje de error:

‘System.Runtime.Serialization.DataContractAttribute’ does not contain a definition for ‘IsReference’

Qué corresponde al código autogenerado del proxy:

[System.Runtime.Serialization.DataContractAttribute(Name="StructuralObject",
Namespace="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses",
IsReference=true)]

Si empiezas a buscar por google, encuentras algunas respuesta a los foros que tienen peligro: desinstala todo tu visual studio y todo lo que pilles y vuelve a reinstalarNO HAGAS ESO, ESPERA A TERMINAR DE LEER ESTE POST

¿ Qué dicen los chicos de MS sobre sto ?

Commentario 1:

The mismatch of the Client library and the Server dll is fixed in later releases of the Silverlight SDK. You will be able to use the EF generated types in your SIlverlight application in the near future . Unfortunately , I can’t give you a date of when the next Silverlight SDK is gonna be released , but rest assured , this scenario WILL work when the next Silverligtht SDK ships

Comentario 2:

Hi, as discussed earlier, support for IsReference will be added in RTW.

¿ Hay algun truco para evitar esto?

Si quieres que tu codigo compile puede quitar del código autogenerado IsReference=True,pero entonces te encontrarás con inconsistencias en los objetos serializados :-( ..

Parece que tendremos que esperar a la version RTW.

Mi opinión: es normal que una versión Beta de un producto tenga fallos, es normal que el equipo de desarrollo de Ms no pueda estar sacando parches en caliente cada dos por tres, y se tiene que centrar en su iteraciones y sprints, pero deberían de tener una página oficial actualizada cada día que informara de errores conocidos en la versión actual, es decepcionante encontrarte con un error, mirar en un foro, reinstalar tu Visual Studio de cabo a raro, y al rato darte cuenta de que.. “uy… pero si era un bug”.

Fuente: http://www.tipsdotnet.com/TechBlogESP.aspx?PageIndex=0&BLID=10

Nuevo Visual Studio 2008 y .NET Framework 3.5

Sunday, March 22nd, 2009

Microsoft lanzó su nueva edición de Visual Studio 2008 acompañada de su herramienta principal .NET Framework 3.5, ambos han sido anunciados.

 

 

La nueva versión incorpora mas de 250 nuevas características que no se encuentran en las versiones Express de Visual Studio. Se agregó el soporte para LINQ (Language Integrated Query)
que es tomada como una aplicación rápida de desarrollo. Esta
herramienta ayuda para que el programador sepa que dato es el que
realmente necesita, en vez de estar pensando en la complejidad de las
solicitudes de datos. LINQ puede asociarse fácilmente con C# o Visual Basic con SQL.

También la nueva versión te permitirá abrir, editar y construir aplicaciones .NET 2.0 y ASP.NET 2.0 (incluyendo aplicaciones ASP.NET 2.0 usando ASP.NET AJAX 1.0).

La nueva versión de Framework 3.5 incluye características para el desarrollo de la Web 2.0, Service-Oriented Architecture
y software de servicios adicionales basados en aplicaciones. Su
lanzamiento general y venta al publico será hasta le próximo año, pero
si estás subscrito a MSDN, podrás bajar una versión Express de esta versión.

Fuente: http://www.programacion.com/noticia/1562/

Diez cosas a saber sobre Visual Studio 2008 y .NET Framework 3.5

Sunday, March 22nd, 2009

Días atrás, Daniel Moth, desarrollador de Microsoft, publicaba un interesante post comentando 10 puntos importantes a saber sobre el nuevo Visual Studio 2008 y .NET framework 3.5 y la verdad es que no tienen desperdicio.

1. Lanzamiento
Visual Studio 2008 y .NET framework 3.5 serán lanzados oficialmente juntos el próximo febrero. Sin embargo, estará disponible para desarrolladores a finales de noviembre de 2007.
Afortunadamente, estarán disponibles las versiones Express de C#, VB, C++ y Web, así como las Profesionales (¡con soporte de testeos unitarios!), Estándar y ediciones de equipos de desarrollo. La novedad será Visual Studio 2008 Shell, de carácter gratuito, que permitirá crear lenguajes y herramientas de desarrollo más verticalizadas.

Daniel comenta también que bajo Windows Vista, VS2008 será espectacular, e incluirá mejoras para la depuración de múltiples hilos. Ya no hay excusa para quedarnos con WXP ;-P

2. Compatibilidad hacia atrás
.NET framework 3.5 continúa la línea iniciada por Fx3.0 en cuanto al mantenimiento del CLR. Por tanto, y dado que lo único que hace es añadir ensamblados a las librerías presentes con las versiones 2.0 y 3.0 del framework, las aplicaciones actuales no se verán afectadas. Eso sí, necesitará los Service Packs 1 de ambas plataformas.

3. Generación multiplataforma
Visual Studio 2008 incluye la capacidad de crear proyectos para múltiples plataformas .NET, es decir, la 2.0, 3.0 y 3.5, desde el mismo entorno. Por tanto, no será necesario tener VS2005 instalado para generar ensamblados para .NET 2.0.

4. Multitud de novedades en C# 3.0 y VB9
Propiedades automáticas, delegados “relajados”, inicializadores de objetos, inferencia de tipos, tipos anónimos, métodos de extensión, funciones lambda y métodos parciales, entre otros.

Pero no sólo eso… dado el punto 3 (generación multiplataforma), podremos usar estas nuevas características de nuestros lenguajes favoritos y generar para .NET 2.0.

5. LINQ
Se trata de una de las grandes revoluciones que nos aportará este nuevo conjunto de herramientas. Language INtegrated Query es un nuevo método de acceso a datos totalmente integrado en nuestro lenguaje habitual y de una forma muy independiente de la fuente de donde provengan (colecciones, XML, motores de bases de datos, etc.).

6. Novedades para ASP.NET
Visual Studio, así como el nuevo framework, ya incluirán ASP.NET AJAX de serie, así como 3 nuevos controles (ListView, DataPager y LinqDataSource). Además, el IDE ha sido muy mejorado e incluye soporte para intellisense y depuración de Javascripts, ¡también para ASP.NET 2.0!, y un nuevo diseñador que permite anidar páginas maestras.

7. Para el desarrollo en cliente
VS2008 incluirá nuevas plantillas de proyectos, así como un diseñador para WPF integrado con soporte para la comunicación WPF-WinForms. También se ha añadido el soporte para Firefox de la tecnología ClickOnce yXBAP (XAML Browser Applications).

8. Para el desarrollador de Office
Se ofrece soporte total para la personalizaciones (customisations) de Office 2007, así como para las plantillas de Office 2003.

9. Para desarrollo en servidor
Se han incluido nuevas plantillas para WCF y WF, y se han introducido mejoras interesantes en el primero, como el modelo de programación HTTP (sin SOAP) o serialización JSON.

10. Para el desarrollo en dispositivos móviles
Hay decenas de nuevas características, como el soporte para las versiones compactas de LINQ y WPF, o, a nivel de IDE, Unit Testing for Devices.

11. (punto extra) Código del framework
Pues sí, como ya es sabido, podremos depurar nuestras aplicaciones siguiendo el rastro por el interior de las clases y métodos del framework (como si no tuviéramos suficiente con las nuestras ;-) ).

Fuente: http://www.clikear.com/diez_cosas_saber_12876.aspx